コルーチンを中断するカスタム Yield 命令の基本クラス
CustomYieldInstruction はイベントが起こるまでコルーチンの実行を中断するカスタム Yield 命令を実装することができます。水面下では、カスタム Yield 命令はちょうど別の実行中のコルーチンです。それを実装するには CustomYieldInstruction クラスから継承し、keepWaiting プロパティーをオーバーライドします。コルーチンを中断させておくために True
を返します。コルーチンの実行を続行させるために False
を返します。ref::keepWaiting プロパティーは MonoBehaviour.Update の後と MonoBehaviour.LateUpdate の前の各フレームにクエリさせます。
このクラスは Unity 5.3 以降で使用できます。
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; } }
詳細に制御して、より複雑な Yield 命令を実装するために System.Collections.IEnumerator
クラスから直接継承できます。この場合、ref::keepWaiting プロパティーを実装するのと同じように MoveNext()
メソッドを実装します。さらに Current
プロパティーでオブジェクトを返すこともできます。 MoveNext()
メソッドを実行後、 Unity のコルーチンスケジューラによって処理されます。ですから例えば Current
が IEnumerator
から継承する別のオブジェクトを返した場合、現在の列挙子はひとつが返ってくるまで中断されます。
// 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; } }
keepWaiting | コルーチンを中断させておく必要がある場合、表示します。 |