繰り返し呼び出しと呼び出しのキャンセル
CoddyのUnityジャーニー「物理演算とゲームプレイ」セクションの一部。レッスン 23/71。
InvokeRepeating(nameof(Blink), 0.5f, 0.5f)は、最初の呼び出しを0.5秒後に行い、その後はキャンセルされるまで0.5秒ごとにBlinkを呼び出します。最初の数値は最初の呼び出しまでの遅延時間、2つ目の数値は呼び出し間の時間です。CancelInvoke(nameof(Blink))で停止でき、名前を指定せずにCancelInvoke()を呼び出すと、そのスクリプトが登録したすべてのInvokeが停止します。
この警告灯は、Spaceキーが押されるまで点滅し、その後は点灯したままになります。
Light lamp;
void Start()
{
lamp = GetComponent<Light>();
InvokeRepeating(nameof(Blink), 0.5f, 0.5f);
}
void Blink()
{
lamp.enabled = !lamp.enabled;
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
CancelInvoke(nameof(Blink));
lamp.enabled = true;
}
}スポーンの章で使ったタイマーも、float型のフィールドとUpdate()内のチェックで同じことができます。InvokeRepeatingを使うと、時間の管理と呼び出しはUnityが行います。InvokeRepeatingの呼び出しはStart()に記述します。Update()に記述すると、毎フレーム新たな繰り返し呼び出しが登録されてしまいます。
チャレンジ
簡単間欠泉を一定の間隔で3回噴出させましょう。
Start()で、InvokeRepeating(nameof(Erupt), 1f, 2f);を呼び出します。void Erupt()を記述します。eruptionsに1を加え、ball.AddForce(Vector3.up * power, ForceMode.Impulse);を呼び出し、"Eruption " + eruptionsをログに記録します。Erupt()の最後で、eruptions == 3のときにCancelInvoke(nameof(Erupt));を呼び出します。
「プレイ」を押すと、ボールが2秒間隔で3回上に投げ上げられます。その後、「確認」を押します。
自分で試してみよう
using UnityEngine;
public class Geyser : MonoBehaviour
{
public Rigidbody ball;
public float power = 6f;
int eruptions;
void Start()
{
// Play の 1 秒後に噴出し、その後は 2 秒ごとに噴出する
}
// Erupt(): 回数を数え、ball を上に押し上げ、ログを出力する。3 回目の後に停止する
}
物理演算とゲームプレイのすべてのレッスン
自分で練習してみよう: Unityプレイグラウンド