虚幻引擎 Is Timer Active 节点

Is Timer Active 是虚幻引擎 5 中用于检查计时器是否正处于 激活运行状态 的实用节点,根据计时器是否处于运行且未暂停的状态来返回 True 或 False。下面通过一个 “无敌道具” 的完整案例,带你一步步掌握该节点的具体用法。


一、案例简介:无敌道具

玩家触碰场景中的”无敌星星”后,角色进入 5 秒的无敌状态,并周期性地闪烁提示效果。核心在于:如果玩家在无敌期间再次吃到星星,应当重置计时器而不是启动第二个重叠的计时器——这时就需要使用 Is Timer Active 来检查计时器是否已经在运行,从而决定是”重置”还是”新启动”。


二、完整蓝图实现

步骤 1:创建计时器句柄变量

在角色的蓝图中创建一个类型为 Timer Handle 的变量:

  1. 打开角色蓝图(如 BP_ThirdPersonCharacter

  2. 在左侧 My Blueprint 面板中,点击 Variables 分组旁的 + 按钮

  3. 将新变量命名为 InvincibilityTimerHandle,类型选择 Timer Handle

计时器句柄是一个结构体,用于唯一标识一个计时器,是对计时器进行管理(如暂停、恢复、清除)和查询状态的重要凭证

步骤 2:创建无敌事件

在 Event Graph 中右键创建一个 Custom Event,命名为 OnInvincibilityStart,将其 Editable 属性勾选为开启。这将是计时器到期后要执行的内容:

cpp
OnInvincibilityStart (Custom Event)
    ├─ Set Invincible (设置为 True)   // 无敌标志变量
    ├─ Start Flashing Effect          // 启动材质闪烁效果
    └─ Print String "无敌开始!5秒后结束!"

同时创建另一个 Custom Event——OnInvincibilityEnd

cpp
OnInvincibilityEnd (Custom Event)
    ├─ Set Invincible (设置为 False)
    ├─ Stop Flashing Effect
    └─ Print String "无敌结束!"

步骤 3:使用 Is Timer Active 判断并设置计时器

这是本案例中最关键的部分——当玩家碰到星星时,需要根据计时器是否正在运行来决定行为:

蓝图节点连接示意:

text
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 图表示:

text
┌─────────────────────────────────────────────────────────────────┐
│                     (玩家吃到无敌星星)                          │
└─────────────────────────────────────────────────────────────────┘
                                 │
                                 ▼
                  ┌──────────────────────────┐
                  │  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,玩家在无敌期间内连续触碰星星,会反复创建新的计时器实例,导致:

  1. 无敌标志变量可能被多次修改

  2. 多个计时器同时运行,到期后重复触发 OnInvincibilityEnd

  3. OnInvincibilityEnd 中设置 Invincible = false 的节点可能因为多个计时器到期而被多次执行

  4. 特效被多次关闭或出现意料之外的状态

使用 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 停止并销毁计时器

熟练运用这三者的组合,可以实现技能冷却、无敌判定、伤害计时器、重复动作控制等丰富玩法逻辑。

感谢您的来访,获取更多精彩文章请收藏本站。

THE END
喜欢就支持一下吧
点赞11 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容