Unity - 延迟代码在更新脚本中不起作用

Unity - Delay Code Doesn't work in update script

我有代码可以改变角色的重力并在一秒钟后翻转相机,但我收到错误消息,“'Gravity.Update()' 的主体不能是迭代器块,因为 'void' 不是迭代器接口类型。

void Update()
{
    if (Input.GetKey(KeyCode.Mouse1) && grounded)
    {
        Physics.gravity = new Vector3(0, 10.0f, 0);
        yield return new WaitForSeconds(1);
        transform.localEulerAngles = new Vector3(0, 0, 180);

    }
    if (Input.GetMouseButtonDown(0) && grounded)
    {
        Physics.gravity = new Vector3(0, -10.0f, 0);

        yield return new WaitForSeconds(1);
        transform.localEulerAngles = new Vector3(0, 0, 0);


    }
}

您将要创建协程。你不能在 void Update().

中产生 return

这是您的代码示例:

void Update()
{
    if (Input.GetMouseButtonDown(0) && grounded)
    {
        StartCoroutine(WaitAndThenDoSomething(1));
    }
}

private IEnumerator WaitAndThenDoSomething(float waitTime)
{
    //any code before yield will run immediately
    Physics.gravity = new Vector3(0, -10.0f, 0);

    yield return new WaitForSeconds(waitTime);
        
    //any code after yield will run after the defined waitTime in seconds
    transform.localEulerAngles = new Vector3(0, 0, 0);

    //you can add more yield return new WaitForSeconds(waitTime) if multiple pauses are necessary

}

确保您不会 运行 每帧都启动协程,并将其保持在单个触发器中,例如您如何在 GetMouseButtonDown 下使用它。您不希望每一帧都为相同的等待操作调用一堆协程。

如果需要在等待时间结束前取消协程,可以用

停止所有协程
StopAllCoroutines();

但这会停止每个协程,因此为您打算 运行 的每个协程类型创建一个实例可能更有用。例如,代替 StartCoroutine(WaitAndDoSomething(1)),您可以这样做:

IEnumerator waitAndDoSomething = WaitAndThenDoSomething(1);
StarCoroutine(waitAndDoSomething);

然后每当你想停止这个特定的协程时,你可以调用

StopCoroutine(waitAndDoSomething);

请注意,每当您的角色再次跳跃时,您都需要停止此协程,否则如果他们在 1 秒内着陆并跳跃,代码将在意外时 运行。协程 运行 在后台,所以要注意这一点。或者你必须确保用户不能在 1 秒内再次跳转。