Описание
Базовый класс для пользовательских инструкций yield для приостановки сопрограмм.
CustomYieldInstruction позволяет реализовать пользовательские инструкции yield для приостановки выполнения сопрограммы до наступления события. Под капотом пользовательская инструкция yield — это просто еще одна работающая сопрограмма. Чтобы реализовать его, наследуйте от класса CustomYieldInstruction и переопределите свойство keepWaiting. Чтобы приостановить сопрограмму, верните true
. Чтобы позволить сопрограмме продолжить выполнение, верните false
. Свойство keepWaiting запрашивается в каждом кадре после MonoBehaviour.Update и перед MonoBehaviour.LateUpdate.
Для этого класса требуется Unity 5.3 или более поздней версии.
Чтобы приостановить сопрограмму, верните true
. Чтобы позволить сопрограмме продолжить выполнение, верните false
.
// Пример, показывающий, как скрипт CustomYieldInstruction
// может быть использован. Это ждет, когда левая кнопка поднимется, а затем
// ждём, пока правая кнопка нажмёт.
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
. Эта реализация С# может использоваться 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 m_Predicate;
public override bool keepWaiting { get { return m_Predicate(); } }
public WaitWhile1(Func predicate) { m_Predicate = predicate; }
}
Чтобы иметь больший контроль и реализовать более сложные инструкции по выходу, вы можете наследовать непосредственно от класса System.Collections.IEnumerator
. В этом случае реализуйте метод MoveNext()
так же, как реализуете свойство keepWaiting. Кроме того, вы также можете вернуть объект в свойстве Current
, который будет обработан планировщиком сопрограмм Unity после выполнения MoveNext()
метод. Так, например, если Current
возвращает другой объект, наследуемый от IEnumerator
, то текущий перечислитель будет приостановлен до тех пор, пока возвращенный не завершится.< /p>
using System;
using System.Collections;
// Same WaitWhile implemented by inheriting from IEnumerator.
class WaitWhile2 : IEnumerator
{
Func
public object Current { get { return null; } }
public bool MoveNext() { return m_Predicate(); }
public void Reset() {}
public WaitWhile2(Func
Свойства
keepWaiting | Указывает, следует ли приостановить сопрограмму. |