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

Unity C# 如何检测If条件连续成立指定时长(帧/秒)

连续条件成立时长检测实现方案

核心逻辑非常直接:你需要额外维护一个状态变量来累计条件连续成立的时长/帧数,不能直接拿单次判断的结果作为最终返回值——只有累计值达到你设定的阈值时,才翻转最终的布尔结果;只要条件中途断过一次,立刻把累计值清零。

两种维度的实现方式

  • 基于帧数计数(适合固定帧率场景,比如固定60帧的游戏逻辑、固定周期轮询任务)
    1. 先换算阈值帧数:比如固定60帧、要求持续半秒的话,阈值就是 60 * 0.5 = 30 帧
    2. 在判断逻辑外部维护一个整数计数器,初始值为0(注意不能把计数器声明在判断函数内部,否则每次执行都会重置,没法累计)
    3. 每次执行判断时:
    • 原始条件不成立:计数器直接清零
    • 原始条件成立:计数器自增1
    1. 最终返回值规则:计数器累计值大于等于阈值帧数时返回false,其余情况返回true
  • 基于时间戳计数(适合帧率/轮询间隔不固定的场景,精度不受执行频率波动影响)
    1. 提前定义时间阈值,半秒对应500毫秒
    2. 在判断逻辑外部维护一个可空的时间戳变量,用来记录条件连续成立的起始时刻,初始值设为null/0等无效值
    3. 每次执行判断时:
    • 原始条件不成立:把起始时间戳重置为无效值
    • 原始条件成立:如果起始时间戳是无效值,就把当前系统时间戳赋值给它;如果已经有有效值,就计算当前时间和起始时间的差值
    1. 最终返回值规则:时间差值大于等于500毫秒时返回false,其余情况返回true

半秒触发需求的伪代码参考

// 配置项:半秒阈值,单位毫秒
const int HOLD_THRESHOLD_MS = 500;
// 状态变量:必须放在判断逻辑外部,不要每次执行都重新声明
long? continuousValidStartTs = null;
bool finalOutput = true;

// 这个方法按你的业务频率调用即可(比如每帧调用、轮询时调用)
void CheckCondition()
{
    // 这里替换成你原本的If判断逻辑
    bool originCondition = YourOriginalJudgeMethod();

    if (!originCondition)
    {
        continuousValidStartTs = null;
        finalOutput = true;
        return;
    }

    // 条件成立时更新计时
    if (continuousValidStartTs == null)
    {
        continuousValidStartTs = GetCurrentTimeMilliseconds();
        return;
    }

    long holdDuration = GetCurrentTimeMilliseconds() - continuousValidStartTs.Value;
    if (holdDuration >= HOLD_THRESHOLD_MS)
    {
        finalOutput = false;
    }
}
  • 避坑提示:计数器、时间戳这类累计用的状态变量,一定不能声明在判断执行的方法内部,否则每次调用方法都会重新初始化变量,累计逻辑会完全失效。

内容的提问来源于stack exchange,提问作者Alex Bratov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 19:48:32