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



我有代码可以改变角色的重力,并在一秒钟后翻转相机,但我得到了错误,"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((中返回。

以下是您的代码示例:

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
}

确保你不会在每一帧都运行StartCoroutine,并将其保持在一个触发器中,比如你如何在GetMouseButtonDown下运行它。你不希望一堆协同程序在每一帧都被调用来执行相同的等待操作。

如果您需要在等待时间结束前取消协同程序,您可以使用停止所有协同程序

StopAllCoroutines();

但这将停止每个协程,因此创建要运行的每个协程类型的实例可能更有用。例如,代替StartCoroutine(WaitAndDoSomething(1((,您可以执行以下操作:

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

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

StopCoroutine(waitAndDoSomething);

请注意,每当你的角色再次跳跃时,你都需要停止这个协同程序,否则,如果他们在1秒之前着陆并跳跃,代码将在意外情况下运行。推论是在后台运行的,所以要注意这一点。否则,您必须确保用户在1秒内不会再次跳转。

最新更新