CustomYieldInstruction
класс в UnityEngine
Выполнено в:UnityEngine.CoreModule
Описание
Базовый класс для пользовательских инструкций yield, приостанавливающих корутины.
Наследуется от CustomYieldInstruction для создания настраиваемых инструкций yield, которые приостанавливают выполнение сопутствующей программы до наступления указанного события.
Свойство keepWaiting определяет, должна ли сопутствующая программа ждать или может возобновить выполнение. Unity запрашивает keepWaiting каждый кадр после MonoBehaviour.Update и до MonoBehaviour.LateUpdate. Чтобы сопутствующая программа оставалась приостановленной, возвратите 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:
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; } }
Чтобы иметь больше контроля и реализовать более сложные инструкции выноса, вы можете наследовать непосредственно от System.Collections.IEnumerator класс. В этом случае реализуйте MoveNext метод, как вы бы реализовать keepWaiting Вы также можете возвратить объект в Current свойство, которое обрабатывается планировщиком Unity после выполнения MoveNextНапример, если 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 | Указывает, следует ли держать коротин в подвешенном состоянии. |