You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Coroutine暂停至多个条件中任一满足后继续执行?

Unity协程等待多个任一条件的实现方法

直接在WaitUntil的谓词委托中使用**逻辑或(||)**即可实现等待多个条件中的任一满足,这是最简洁高效的方案,完全匹配你的需求。

具体实现步骤

  1. 声明自定义计时器变量,并在Update中处理计时递减逻辑
  2. 在协程里用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 11:55:15