Version: 2023.2

CustomYieldInstruction

class in UnityEngine

切换到手册

描述

基类,用于暂停协同程序的自定义 yield 指令。

CustomYieldInstruction 可使您实现自定义 yield 指令, 以暂停执行协同程序,直至发生事件为止。在后台,自定义 yield 指令只是另一个正在运行的协同程序。要实现该指令,应继承 CustomYieldInstruction 类,然后重写 keepWaiting 属性。要使 协同程序保持暂停,则返回 /true/。要使协同程序继续执行,则返回 /false/。在 MonoBehaviour.Update 后以及 MonoBehaviour.LateUpdate 前的每一帧均查询 keepWaiting 属性。

该类要求 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指示协同程序是否应保持暂停。