繰り返し呼び出しと呼び出しのキャンセル
CoddyのUnityジャーニー「物理演算とゲームプレイ」セクションの一部。レッスン 22/63。
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()に記述すると、毎フレーム新たな繰り返し呼び出しを登録してしまいます。
チャレンジ
簡単Geyserは、その上にあるボールを空中に投げ上げます。スクリプトにはball、power、そしてeruptionsのカウントがあります。決まった間隔で噴出するようにしましょう。
- 最初の噴出はPlayの1秒後に発生し、その後は2秒ごとに発生します。
- 噴出処理は
Eruptという名前のメソッドです。このメソッドでは、eruptionsに1を加え、ball.AddForce(Vector3.up * power, ForceMode.Impulse)でボールを上向きに押し上げ、Eruption 1、Eruption 2のようにログを出力します。 - 3回目の噴出の後、間欠泉は完全に停止します。
Playを押してボールの動きを確認し、それからCheckを押してください。
自分で試してみよう
using UnityEngine;
public class Geyser : MonoBehaviour
{
public Rigidbody ball;
public float power = 6f;
int eruptions;
void Start()
{
// Play の1秒後に噴出し、その後は2秒ごとに噴出する
}
// Erupt(): 回数を数え、ball を上に押し上げてログを出力する。3回目の後に停止する
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。