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 秒内再次跳转。
我有代码可以改变角色的重力并在一秒钟后翻转相机,但我收到错误消息,“'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 秒内再次跳转。