CustomYieldInstruction 自定义中断指令

Description 描述

Base class for custom yield instructions to suspend coroutines.


CustomYieldInstruction lets you implement custom yield instructions to suspend coroutine execution until an event happens. Under the hood, custom yield instruction is just another running coroutine. To implement it, inherit from CustomYieldInstruction class and override keepWaiting property. To keep coroutine suspended return true. To let coroutine proceed with execution return false. keepWaiting property is queried each frame after MonoBehaviour.Update and before MonoBehaviour.LateUpdate.



using UnityEngine;


// Implementation of WaitWhile yield instruction. This can be later used as:

// yield return new WaitWhile(() => Princess.isInCastle);

class WaitWhile: CustomYieldInstruction {

	Func<bool> m_Predicate;


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


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


To have more control and implement more complex yield instructions you can inherit directly from System.Collections.IEnumerator class. In this case, implement MoveNext() method the same way you would implement keepWaiting property. Additionaly to that, you can also return an object in Current property, that will be processed by Unity's coroutine scheduler after executing MoveNext() method. So for example if Current returned another object inheriting from IEnumerator, then current enumerator would be suspended until the returned one has completed.

要更多的控制以及实现更复杂的中断指令,你可以直接继承System.Collections.IEnumerator类。在这种情况下,实现MoveNext()方法,同keepWaiting属性方法。此外,也能返回对象的当前属性,执行 MoveNext() 方法后,将由Unity协程调度处理。因此,例如,如果从IEnumerator继承当前返回其他对象,那么当前enumerator应暂停,直到已完成返回。


// Same WaitWhile implemented by inheriting from IEnumerator.

class WaitWhile: IEnumerator {

	Func<bool> m_Predicate;


	public object Current { get { return null; } }


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


	public void Reset() {}


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


Variables 变量

keepWaitingIndicates if coroutine should be kept suspended.