コルーチンを実行するStartCoroutine関数を使ってゲームの時間を管理する。
Timeクラスについて
Unityには時間を管理しているTimeクラスというものが用意されています。
Timeクラスを利用することでゲームが開始されてからの時間やゲームの実行スピードを管理することができます。
レースゲームなどでゴールまでの時間を計ったり、スローモーションを実装するのに便利です。
リファレンス
Timeクラスの公式リファレンスは以下のページです。
http://docs-jp.unity3d.com/Documentation/ScriptReference/Time.html
Timeクラスには変数のみが実装されており、ユーザーが実行可能な関数は実装されていないようです。
よく使う変数
Time.time変数
Time.time変数にはゲームが開始されてからの時間が格納されています。例えば現在の時間がしりたいプログラムの箇所で以下を実行すれば、
ゲームが開始されてからの時間をコンソールパネルに表示することができます。
Debug.Log(Time.time);
レースなどで一周の時間が図りたい場合は、
・スタートした時の時間を変数に格納しておく
・ゴールした時の時間からスタートした時間を引く
という処理をつくれば一周の時間を計算することができます。
以下を参考に時間を測りたい部分にプログラムを作ってみてください。
#pragma strict
var startTime:float;
var lapTime:float;
function OnGUI()
{
GUI.Label(Rect(70, 60, 450, 60), "Start・Goalの順にボタンを押すとGoalを押すまでの時間が計測できる");
if (GUI.Button(Rect(100, 100, 100, 30), "Start")) {
OnStart();
}
if (GUI.Button(Rect(100, 140, 100, 30), "Goal")) {
OnGoal();
}
// 結果を表示
GUI.Label(Rect(220, 120, 100, 30), lapTime.ToString());
}
// Startボタンが押された時の処理
function OnStart()
{
startTime = Time.time;
}
// Goalボタンが押された時の処理
function OnGoal()
{
lapTime = Time.time - startTime;
}
OnGUI関数を使ったボタンなどの使い方がわからない場合は
OnGUI関数でGUI(ボタンとかスライダーとか)を作るを参照してください。
Time.timeScale変数
timeScale変数には時間経過の倍率が格納されています。0〜1の間の値を代入することでゲーム全体をスローモーションにすることができます。
例:
Time.timeScale=0.5;
上記の処理を実行することでゲーム全体のスピードを1/2倍速にすることができます。
Time.deltaTime変数
deltaTime変数には前フレームが実行されてから経過した時間が格納されています。この変数の時間を利用することでFPS(一秒間に実行されるフレーム)に依存しない処理を作ることができます。
例えば
var speed:float = 1;
function Update()
{
transform.position.x += speed;
}
という処理があったとします。
上記の処理では毎フレームSpeed変数の分だけX座標が加算されます。
1秒間のフレーム数が30の場合と1秒間のフレーム数が60の場合を考えると
FPS30の場合 X座標は30動くのに対して
FPS60の場合 X座標は60動いてしまいます。
フレーム数はゲームを実行する端末の性能やゲーム自体のその時の負荷によって変わってきますので、
性能の高い端末などの場合にオブジェクトの移動のスピードが早くなってしまうことがわかります。
上記の処理をフレーム数に依存しないようにするには
var speed:float = 1;
function Update()
{
transform.position.x += speed * Time.deltaTime;
}
というように speed変数にTime.deltaTime変数を掛け合わせます。
Time.deltaTime変数には前フレームから今のフレームまでの時間が入っていますので、フレームレートが高くなっても低くなっても同様のスピードでオブジェクトを動かすことができます。
StartCoroutine関数
StartCoroutine関数を利用することで、○秒後に処理を実行したり、○秒間隔で処理を実行するといった処理を作ることができます。
○秒後に処理を実行する
StartCoroutine関数を使って○秒後に処理を実行する方法を紹介していきます。
下のコードを実行してみてください。
#pragma strict
function Start () {
StartCoroutine(Test());
Debug.Log("すぐ実行される");
}
function Test()
{
yield WaitForSeconds(3);
Debug.Log("3秒後に実行される。");
}
実行するとコンソールに「すぐ実行される」と表示され、
実行開始から3秒後にコンソールに「3秒後に実行される。」と表示されます。
一行ずつ処理を確認していきましょう。
StartCoroutine(Test());
の部分ではStartCoroutine関数を実行しています。
引数としてTest()を指定しています。
Test関数がコルーチンとして実行されることになります。
yield WaitForSeconds(3);
コルーチンの中では yield WaitForSeconds(3); を実行することで処理を一時中断することができます。
WaitForSeconds(3)は関数名の通り、引数で指定された秒数の間処理を中断します。
3秒間処理が中断された後、
Debug.Log("3秒後に実行される。");
が実行されます。
○秒間隔で処理を実行する
上記のStartCoroutine関数を応用することで一定の時間間隔で処理を実行するプログラムを作ることができます。
#pragma strict
function Start () {
StartCoroutine(Loop());
}
function Loop()
{
while (true)
{
yield WaitForSeconds(1);
Test();
}
}
function Test()
{
Debug.Log("Test " + Time.time);
}
StartCoroutine(Loop())で関数をコルーチンとして呼び出しているのは先ほどと同じですが
Loop関数の中ではwhile文で処理をループしています。
while文の中ではyield WaitForSeconds(1);を実行していますので1秒処理が中断されます。
その後Test関数が呼ばれます。
Test関数ではゲームが開始されてからの時間をコンソールに表示しています。
この処理を元に敵を一定の間隔で発生させたりと言った処理に使えるかと思います。
このループを止めたい場合はwhile文の条件を変更するなりbreak文を実行するように処理を変更してあげましょう。
なんだか、StartCoroutine関数は最初見た時、不思議な感じがするかと思いますがとても便利な処理なのでいろいろいじって慣れておきましょう。
今回の解説は以上です。
<<他の記事を読む
[スポンサードリンク]