Menu
CoddyTech

InvokeRepeating 和 CancelInvoke

本课属于 Coddy Unity 学习旅程的“物理与游戏玩法”单元。第 23 课,共 71 课。

InvokeRepeating(nameof(Blink), 0.5f, 0.5f) 会在 0.5 秒后首次调用 Blink,之后每隔 0.5 秒调用一次,直到它被取消。第一个数字表示首次调用前的延迟时间,第二个数字表示两次调用之间的间隔。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

挑战

简单

让间歇泉按计划喷发三次。

  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 秒向上抛出一次,共抛出三次。然后按“检查”。

亲手试试

using UnityEngine;

public class Geyser : MonoBehaviour
{
    public Rigidbody ball;
    public float power = 6f;
    int eruptions;

    void Start()
    {
        // 点击 Play 后 1 秒喷发,之后每隔 2 秒喷发一次
    }

    // Erupt():计数、将球向上推并记录日志;第 3 次喷发后停止
}

物理与游戏玩法中的所有课

自己练习: Unity 在线编辑器