2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

VRレーシングゲームのタイムを計測する

Posted at

この記事の第6回目の記事です。

今回はレーシングゲームに時間を計測するロジックを加えます
このロジックでやるべきことは以下の二つです。
・ゲームスタート時に計測を始め、経過時間を得る
・ゴール終了時に計測を停止し、それまでの経過時間をゴールタイムとする

ゲームスタート時に計測を始める

ゲーム開始時の時間(開始時間)を取得し、Updateメソッドをでも計測を続け随時、計測時間と開始時間の差分としそれを経過時間とします。そうするとコードは下記のようになります。

void Start () {
  startTime = Time.time;
}
	
	
void Update () {
 if (goal == false) {
   // 現在の経過時間を算出
   lapTime = Time.time - startTime;
 }
}

ゴール終了時に計測を停止し、それまでの経過時間をゴールタイムとする

それまでの経過時間をゴールタイムとするには、ゴールをしたら、計測・差分の取得をやめ、最新の経過時間をゴールタイムとします。今回はゴール時にOnGoalメソッドを動かし,フラグを変化させて計測の停止、ゴールタイムの表示を行っています。

※なおゴール時にどうしてOnGoalメソッドが動き出すのか気になる方は、「VRレーシングゲームのコース・ゴールを作る」と「VRレーシングゲーム用ジャイロセンサで操作するプレイヤーを作成する」をお読みください。仕組みをざっくりまとめると、プレイヤーにアタッチしているCollisionDetect.csでゴールオブジェクトとの衝突を検知しOnGoalメソッドが駆動しているようにしています。

今回のことをまとめたコードは以下のようになります。

Timer.cs
using UnityEngine;
using System.Collections;

public class Timer : MonoBehaviour {
  float startTime;
  float lapTime;
  //ゴール検知のフラグ
  bool goal = false;
	
  void Start () {
    startTime = Time.time;
  }
	
	
  void Update () {
    if (goal == false) {
      // 現在の経過時間を算出
      lapTime = Time.time - startTime;
    }
  }
	
  void OnGUI(){
    if (goal == false) {
      // 現在の経過時間を表示する
      float timer_x = Screen.width * 8 / 10;
      float timer_y = Screen.height / 10;
      float timer_w = Screen.width * 3 / 10;
      float timer_h = Screen.height / 2;
      GUI.Label (new Rect (timer_x, timer_y, timer_w, timer_h), "Time" + lapTime.ToString ());
    } else {
      //ゴールタイムを表示する
      float goal_x = Screen.width / 2;
      float timer_x = Screen.width * 8 / 10;
      float goal_y = Screen.height / 5;
      float goal_w = Screen.width * 3/ 10;
      float goal_h = Screen.height / 10;
      GUI.Label (new Rect (goal_x - goal_w/2, goal_y, goal_w, goal_h), "Your Goal Time!");
      //経過時間をゴールタイムとして表示
      GUI.Label (new Rect (goal_x - goal_w/2, goal_y*2, goal_w, goal_h), lapTime.ToString ());

      if (GUI.Button(new Rect(goal_x - goal_w, goal_y*3, goal_w, goal_h), "ReStart")) {
       Application.LoadLevel ("run");
     }
				
    }
  }
	
  // Goal到着が検知されたときに駆動するメソッド
  void OnGoal(){
    // フラグを変化させる
    goal = true;
  }
}

このコードをプレイヤーに貼り付けるとプレイ中、ゴール時に下記のような経過時間・ゴールタイムの表示ができます。

プレイ中
スクリーンショット 2015-07-19 19.31.12.png

ゴール時
スクリーンショット 2015-07-19 19.30.29.png

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?