自定义 yield 指令的基类,用于挂起协程。
CustomYieldInstruction 允许您实现自定义 yield 指令,以挂起协程执行,直到某个事件发生。在底层,自定义 yield 指令只是另一个正在运行的协程。要实现它,请继承自 CustomYieldInstruction 类并重写 keepWaiting 属性。要保持协程挂起,请返回 true
。要让协程继续执行,请返回 false
。 keepWaiting 属性在每次 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 | 指示是否应保持协程挂起。 |