Unity C# 如何检测If条件连续成立指定时长(帧/秒)
连续条件成立时长检测实现方案
核心逻辑非常直接:你需要额外维护一个状态变量来累计条件连续成立的时长/帧数,不能直接拿单次判断的结果作为最终返回值——只有累计值达到你设定的阈值时,才翻转最终的布尔结果;只要条件中途断过一次,立刻把累计值清零。
两种维度的实现方式
- 基于帧数计数(适合固定帧率场景,比如固定60帧的游戏逻辑、固定周期轮询任务)
- 先换算阈值帧数:比如固定60帧、要求持续半秒的话,阈值就是
60 * 0.5 = 30帧 - 在判断逻辑外部维护一个整数计数器,初始值为0(注意不能把计数器声明在判断函数内部,否则每次执行都会重置,没法累计)
- 每次执行判断时:
- 原始条件不成立:计数器直接清零
- 原始条件成立:计数器自增1
- 最终返回值规则:计数器累计值大于等于阈值帧数时返回false,其余情况返回true
- 先换算阈值帧数:比如固定60帧、要求持续半秒的话,阈值就是
- 基于时间戳计数(适合帧率/轮询间隔不固定的场景,精度不受执行频率波动影响)
- 提前定义时间阈值,半秒对应500毫秒
- 在判断逻辑外部维护一个可空的时间戳变量,用来记录条件连续成立的起始时刻,初始值设为null/0等无效值
- 每次执行判断时:
- 原始条件不成立:把起始时间戳重置为无效值
- 原始条件成立:如果起始时间戳是无效值,就把当前系统时间戳赋值给它;如果已经有有效值,就计算当前时间和起始时间的差值
- 最终返回值规则:时间差值大于等于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
相关产品推荐
相关产品推荐

