Is Timer Active 是虚幻引擎 5 中用于检查计时器是否正处于 激活运行状态 的实用节点,根据计时器是否处于运行且未暂停的状态来返回 True 或 False。下面通过一个 “无敌道具” 的完整案例,带你一步步掌握该节点的具体用法。
一、案例简介:无敌道具
玩家触碰场景中的”无敌星星”后,角色进入 5 秒的无敌状态,并周期性地闪烁提示效果。核心在于:如果玩家在无敌期间再次吃到星星,应当重置计时器而不是启动第二个重叠的计时器——这时就需要使用 Is Timer Active 来检查计时器是否已经在运行,从而决定是”重置”还是”新启动”。
二、完整蓝图实现
步骤 1:创建计时器句柄变量
在角色的蓝图中创建一个类型为 Timer Handle 的变量:
-
打开角色蓝图(如
BP_ThirdPersonCharacter) -
在左侧 My Blueprint 面板中,点击 Variables 分组旁的
+按钮 -
将新变量命名为
InvincibilityTimerHandle,类型选择 Timer Handle
计时器句柄是一个结构体,用于唯一标识一个计时器,是对计时器进行管理(如暂停、恢复、清除)和查询状态的重要凭证。
步骤 2:创建无敌事件
在 Event Graph 中右键创建一个 Custom Event,命名为 OnInvincibilityStart,将其 Editable 属性勾选为开启。这将是计时器到期后要执行的内容:
OnInvincibilityStart (Custom Event) ├─ Set Invincible (设置为 True) // 无敌标志变量 ├─ Start Flashing Effect // 启动材质闪烁效果 └─ Print String "无敌开始!5秒后结束!"
同时创建另一个 Custom Event——OnInvincibilityEnd:
OnInvincibilityEnd (Custom Event) ├─ Set Invincible (设置为 False) ├─ Stop Flashing Effect └─ Print String "无敌结束!"
步骤 3:使用 Is Timer Active 判断并设置计时器
这是本案例中最关键的部分——当玩家碰到星星时,需要根据计时器是否正在运行来决定行为:
蓝图节点连接示意:
Event ActorBeginOverlap (碰撞星星)
│
▼
Branch (Check if Timer is Active)
├─ Condition = Is Timer Active by Handle (输入: InvincibilityTimerHandle)
│
├─ [True 分支] → Clear and Invalidate Timer by Handle → Set Timer by Event (重新开始)
│
└─ [False 分支] → Set Timer by Event (新建计时器)
│
▼
Set Timer by Event
├─ Event: OnInvincibilityEnd
├─ Time: 5.0 秒
├─ Looping: false
└─ Returning Value → 连接到 InvincibilityTimerHandle (变量 SET)
各节点的作用说明:
-
Is Timer Active by Handle:检查句柄对应的计时器是否正在激活运行中 -
Clear and Invalidate Timer by Handle:停止并销毁原计时器,句柄随之失效 -
Set Timer by Event:创建新计时器,并输出一个新的句柄 -
Branch:根据Is Timer Active的返回值决定走哪条路
步骤 4:完整节点流程图
完整的蓝图逻辑可以用如下 ASCII 图表示:
┌─────────────────────────────────────────────────────────────────┐
│ (玩家吃到无敌星星) │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌──────────────────────────┐
│ Is Timer Active by Handle│
│ (检查无敌计时器是否激活) │
└──────────────────────────┘
│
┌────────────┴────────────┐
│ Branch 条件判断 │
└────────────┬────────────┘
True │ False
(计时器激活中)│ (计时器空闲)
│ │ │
▼ │ ▼
┌──────────────────────────┐ │ ┌──────────────────────────┐
│Clear and Invalidate Timer│ │ │ Set Timer by Event │
│ by Handle │ │ │ Time: 5.0 秒 │
│ (清除原计时器并重置) │ │ │ Event: OnInvincibilityEnd│
└──────────────────────────┘ │ └──────────────────────────┘
│ │ │
└────┬────┘ │
│ │
▼ ▼
┌──────────────────────────────────────────────────────────┐
│ Set Timer by Event │
│ Time: 5.0 秒(重置后的新计时器) │
│ Event: OnInvincibilityEnd │
│ Returning Value → InvincibilityTimerHandle (变量 SET) │
└──────────────────────────────────────────────────────────┘
│
▼
(5秒后触发 OnInvincibilityEnd)
三、为什么必须用 Is Timer Active?
在 Event ActorBeginOverlap 中如果不做任何状态检查就直接调用 Set Timer by Event,玩家在无敌期间内连续触碰星星,会反复创建新的计时器实例,导致:
-
无敌标志变量可能被多次修改
-
多个计时器同时运行,到期后重复触发
OnInvincibilityEnd -
OnInvincibilityEnd中设置Invincible = false的节点可能因为多个计时器到期而被多次执行 -
特效被多次关闭或出现意料之外的状态
使用 Is Timer Active 检查后,无敌期间内的所有额外触碰都会被正确处理为 “重置”——只有最后一次计时器会触发 OnInvincibilityEnd,逻辑干净可控。
四、节点输入输出详解
Is Timer Active by Handle
| 项目 | 说明 |
|---|---|
| 节点路径 | Utilities → Time → Is Timer Active by Handle |
| Target | Kismet System Library |
| Handle(输入) | 待检查的计时器句柄(Timer Handle 类型变量) |
| Return Value(输出) | True(计时器存在且处于激活运行中),False(不存在或已暂停) |
如果计时器已存在且未暂停,Is Timer Active 返回 True,表示计时器正在激活运行中,之后到期会触发回调函数。
五、更多实用场景
场景 1:技能冷却系统
玩家使用技能前先检查冷却计时器是否还激活:
-
如果激活 → 提示”技能冷却中,请稍后”
-
如果未激活 → 执行技能,然后启动计时器开始冷却倒计时
场景 2:周期性伤害区域(火坑伤害)
Is Timer Active 用于判断玩家是否已经在火坑中受到伤害:
-
进入火焰区域时如果未激活 → 启动周期伤害计时器(每秒触发一次伤害)
-
已在火焰区域中 → 不做额外动作
-
离开火焰区域时 → 清理该计时器
场景 3:交互按钮冷却
交互后启动计时器,再次交互时检查——如果仍在冷却则提示”按钮正在重置中”,避免重复触发。
六、总结
Is Timer Active 是一个状态查询节点,核心是当定时器句柄存在且运行时返回 True,否则返回 False。它与计时器句柄(Timer Handle)和 Set Timer by Event 形成完整的生命周期管理三件套:
| 节点 | 作用 |
|---|---|
Set Timer by Event |
创建计时器,输出句柄 |
Is Timer Active by Handle |
检查计时器是否激活运行中 |
Clear and Invalidate Timer by Handle |
停止并销毁计时器 |
熟练运用这三者的组合,可以实现技能冷却、无敌判定、伤害计时器、重复动作控制等丰富玩法逻辑。
感谢您的来访,获取更多精彩文章请收藏本站。







暂无评论内容