版本: Unity 6 (6000.0)
语言English
  • C#

CustomYieldInstruction

UnityEngine 中的类

/

实现于:UnityEngine.CoreModule

建议更改

成功!

感谢您帮助我们提高 Unity 文档的质量。虽然我们无法接受所有提交,但我们确实会阅读用户提出的每个建议更改,并在适用时进行更新。

关闭

提交失败

由于某些原因,您的建议更改无法提交。请<a>稍后再试</a>。感谢您抽出时间帮助我们提高 Unity 文档的质量。

关闭

取消

描述

自定义 yield 指令的基类,用于挂起协程。

CustomYieldInstruction 允许您实现自定义 yield 指令,以挂起协程执行,直到某个事件发生。在底层,自定义 yield 指令只是另一个正在运行的协程。要实现它,请继承自 CustomYieldInstruction 类并重写 keepWaiting 属性。要保持协程挂起,请返回 true。要让协程继续执行,请返回 falsekeepWaiting 属性在每次 MonoBehaviour.Update 后和 MonoBehaviour.LateUpdate 之前都会被查询。

此类需要 Unity 5.3 或更高版本。

要保持协程挂起,请返回 true。要让协程继续执行,请返回 false

// Example showing how a CustomYieldInstruction script file
// can be used.  This waits for the left button to go up and then
// waits for the right button to go down.
using System.Collections;
using UnityEngine;

public class ExampleScript : MonoBehaviour { void Update() { if (Input.GetMouseButtonUp(0)) { Debug.Log("Left mouse button up"); StartCoroutine(waitForMouseDown()); } }

public IEnumerator waitForMouseDown() { yield return new WaitForMouseDown(); Debug.Log("Right mouse button pressed"); } }

以下脚本实现了 keepWaiting 的可重写版本。此 C# 实现可供 JS 使用。在这种情况下,请确保此 C# 脚本位于诸如 Plugins 的文件夹中,以便在上述 JS 脚本示例之前对其进行编译。

using UnityEngine;

public class WaitForMouseDown : CustomYieldInstruction { public override bool keepWaiting { get { return !Input.GetMouseButtonDown(1); } }

public WaitForMouseDown() { Debug.Log("Waiting for Mouse right button down"); } }
using System.Collections;
using UnityEngine;
using System;

// Implementation of WaitWhile yield instruction. This can be later used as: // yield return new WaitWhile(() => Princess.isInCastle); class WaitWhile1 : CustomYieldInstruction { Func<bool> m_Predicate;

public override bool keepWaiting { get { return m_Predicate(); } }

public WaitWhile1(Func<bool> predicate) { m_Predicate = predicate; } }

要获得更多控制权并实现更复杂的 yield 指令,您可以直接继承自 System.Collections.IEnumerator 类。在这种情况下,请以与实现 keepWaiting 属性相同的方式实现 MoveNext() 方法。此外,您还可以返回 Current 属性中的对象,该对象将在执行 MoveNext() 方法后由 Unity 的协程调度程序处理。因此,例如,如果 Current 返回另一个继承自 IEnumerator 的对象,则当前枚举器将被挂起,直到返回的枚举器完成。

using System;
using System.Collections;

// Same WaitWhile implemented by inheriting from IEnumerator. class WaitWhile2 : IEnumerator { Func<bool> m_Predicate;

public object Current { get { return null; } }

public bool MoveNext() { return m_Predicate(); }

public void Reset() {}

public WaitWhile2(Func<bool> predicate) { m_Predicate = predicate; } }

属性

keepWaiting指示是否应保持协程挂起。