如何让Coroutine暂停至多个条件中任一满足后继续执行?
Unity协程等待多个任一条件的实现方法
直接在WaitUntil的谓词委托中使用**逻辑或(||)**即可实现等待多个条件中的任一满足,这是最简洁高效的方案,完全匹配你的需求。
具体实现步骤
- 声明自定义计时器变量,并在
Update中处理计时递减逻辑 - 在协程里用
WaitUntil包装多个条件,通过||连接实现“任一满足即继续”的逻辑
完整代码示例
using UnityEngine; using System.Collections; public class MultiConditionWait : MonoBehaviour { private float customTimer; void Start() { // 初始化计时器为5秒 customTimer = 5f; StartCoroutine(WaitForAnyCondition()); } void Update() { // 每帧递减计时器(仅在计时器未结束时执行) if (customTimer > 0f) { customTimer -= Time.deltaTime; } } IEnumerator WaitForAnyCondition() { Debug.Log("协程暂停,等待R/T按键或计时器结束..."); // WaitUntil会每帧检查条件,任一满足则恢复执行 yield return new WaitUntil(() => Input.GetKeyDown(KeyCode.R) || // 检测R键按下瞬间 Input.GetKeyDown(KeyCode.T) || // 检测T键按下瞬间 customTimer <= 0f); // 检测计时器结束 Debug.Log("触发条件满足,协程继续执行!"); // 在此编写后续业务逻辑 } }
进阶优化:抽离判断逻辑
如果条件较多或需要复用判断逻辑,可以把条件检测单独封装成方法,让代码更易维护:
private bool IsAnyConditionMet() { bool rPressed = Input.GetKeyDown(KeyCode.R); bool tPressed = Input.GetKeyDown(KeyCode.T); bool timerExpired = customTimer <= 0f; return rPressed || tPressed || timerExpired; } // 协程中调用方式简化为 yield return new WaitUntil(IsAnyConditionMet);
注意细节
Input.GetKeyDown仅在按键按下的第一帧返回true,若需检测按键按住状态,替换为Input.GetKey即可- 计时器放在
Update中递减是常规实现,也可以在协程内部通过WaitForEndOfFrame实现(无需依赖Update),但你的现有写法完全可行 WaitUntil的判断逻辑每帧执行一次,性能开销可以忽略不计
内容的提问来源于stack exchange,提问作者FixMix Games
相关产品推荐
相关产品推荐

