Menu
CoddyTech

繰り返し呼び出しと呼び出しのキャンセル

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()に記述すると、毎フレーム新たな繰り返し呼び出しが登録されてしまいます。

challenge icon

チャレンジ

簡単

間欠泉を一定の間隔で3回噴出させましょう。

  1. Start()で、InvokeRepeating(nameof(Erupt), 1f, 2f);を呼び出します。
  2. void Erupt()を記述します。eruptionsに1を加え、ball.AddForce(Vector3.up * power, ForceMode.Impulse);を呼び出し、"Eruption " + eruptionsをログに記録します。
  3. 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プレイグラウンド