虚幻引擎 Retriggerable Delay 节点

一、Retriggerable Delay 节点概述

1.1 官方定义

Retriggerable Delay(可重置延迟)是一个潜伏动作节点,按照指定的时间(秒)执行延迟动作。关键特性:如果在倒计时结束前再次调用该节点,倒计时将被重置为完整的 Duration 时长,从头开始计时

1.2 节点引脚说明

引脚类型 引脚名称 说明
输入 In(执行引脚) 启动延迟倒计时
输入 Duration(浮点数) 延迟时长,单位秒
输出 Completed(执行引脚) 延迟倒计时完成后执行

1.3 与普通 Delay 节点的核心区别

这是理解 Retriggerable Delay 最关键的一点:

行为场景 Delay 节点 Retriggerable Delay 节点
单次触发 等待指定秒数后执行 等待指定秒数后执行
倒计时中再次触发 忽略,不影响已有计时 重置计时器,从头开始倒计时
连续频繁触发 每次倒计时结束后各执行一次 只有最后一次触发后等待完整时长才执行

通俗理解:Delay 就像”定了闹钟后不管你怎么按,到点就响”;Retriggerable Delay 就像”每次按它都重新计时,必须安静等待完整时长才会响”

举例:设置 Duration = 2 秒,在 2 秒内连续触发 3 次——

  • 使用 Delay:2 秒后执行 3 次;

  • 使用 Retriggerable Delay:每次触发都重置计时器,只有最后一次触发后 2 秒内没有再触发,才会执行 1 次


二、完整使用案例

以下提供两个典型案例,包含从创建蓝图到测试运行的完整操作步骤。


案例一:可重置技能冷却系统

场景描述:玩家按下技能键后,进入 5 秒冷却。如果在冷却期间再次按下技能键,冷却时间重置为 5 秒,防止技能被滥用。

核心思路:利用 Retriggerable Delay 的”重置”特性——玩家连续按技能键时,计时器不断重置,只有持续不再按技能键超过 5 秒,才能再次使用技能。

完整操作步骤

步骤 1:创建角色蓝图(如果还没有)

  1. 在内容浏览器中右键点击 → 蓝图类 → 选择 Character 类

  2. 命名为 BP_MyCharacter

  3. 双击打开蓝图编辑器

步骤 2:创建技能输入事件

  1. 在蓝图编辑器工具栏点击 Class Settings(类设置)

  2. 在右侧 Details 面板找到 Input 分类

  3. 点击 + 添加一个 Action Mapping(动作映射),命名为 UseAbility

  4. 按提示分配一个按键(如数字键 1、空格键或 Q 键)

*如果项目中已有输入映射配置,也可以直接在 Event Graph 中右键搜索 InputAction UseAbility 使用已有事件。

步骤 3:添加用于冷却判断的布尔变量

  1. 在左侧 My Blueprint 面板点击 Variables 旁边的 + 号

  2. 新建变量命名为 bIsOnCooldown

  3. 变量类型设置为 Boolean

  4. 将该变量的默认值保持为 false

步骤 4:构建冷却检查逻辑

在事件图表中,按以下顺序连接节点:

  1. 从 InputAction UseAbility 事件引出执行线

  2. 添加 Branch(分支)节点,将 bIsOnCooldown 变量拖入 Condition 输入端

    • False 执行链:技能可以使用 → 进入释放技能的逻辑

    • True 执行链:技能冷却中 → 无任何操作(或可选播放”技能冷却中”的提示音)

步骤 5:释放技能并启动冷却(核心部分)

在 Branch 的 False 执行链上连接以下节点:

  1. 技能释放逻辑(可以是打印字符串、生成特效、播放动画等)

  2. 设置 bIsOnCooldown = True:从 Set bIsOnCooldown 节点引线,启用”Set”功能

  3. 添加 Retriggerable Delay 节点

    • Duration 输入端连接一个浮点数,数值为冷却时间,例如 5.0

  4. 从 Retriggerable Delay 的 Completed 输出引脚引线

  5. 设置 bIsOnCooldown = False:添加 Set 节点,将 bIsOnCooldown 设置回 False

步骤 6:编译并测试

  1. 点击工具栏 Compile 按钮

  2. 点击 Play 运行游戏

  3. 按技能键:

    • 第一次按下:执行技能,bIsOnCooldown 变为 True,启动 5 秒冷却倒计时

    • 5 秒内再次按技能键:由于 bIsOnCooldown 仍为 True,Branch 拦截,技能不可用,但 Retriggerable Delay 被重置,5 秒冷却重新开始计时

    • 冷却期间多次按技能:只有冷却结束后才能再次释放技能

💡 这正是 防抖(Debounce) 机制的核心实现,Retriggerable Delay 在计时期间如果再触发会重置计时器,直到规定时间内没有触发才算完成


案例二:护盾/生命值自动恢复系统

场景描述:玩家受到伤害后,护盾短暂失效。如果玩家在 3 秒内未再受到伤害,则护盾自动恢复;如果在 3 秒内再次受伤,恢复计时器重置,重新等待 3 秒。

适用游戏:《使命召唤》风格的生命值恢复机制、护盾充能系统。

完整操作步骤

步骤 1:创建玩家角色蓝图和基本属性

  1. 创建或打开玩家角色蓝图 BP_PlayerCharacter

  2. 创建以下变量:

    • CurrentHealth(Float,当前生命值)

    • MaxHealth(Float,最大生命值,设置为 100.0)

    • HealthRegenRate(Float,恢复速率,设置为 10.0 生命值/秒)

    • RegenDelayDuration(Float,恢复延迟时长,设置为 3.0 秒)

    • bIsRegenerating(Boolean,默认为 False,标记恢复是否进行中)

    • RegenTimer(Float,标记恢复计时器剩余时间,可选,用于显示 UI)

步骤 2:创建伤害事件函数

  1. 创建一个自定义事件,命名为 ApplyDamage

  2. 添加一个输入参数:DamageAmount(Float)

  3. 事件逻辑:

    • 获取并更新 CurrentHealth(减去伤害值)

    • 添加分支节点:bIsRegenerating == True 时进入重置恢复逻辑

    • 添加自定义函数 StartHealthRegenDelay 作为恢复启动入口

步骤 3:启动健康恢复延迟计时(核心部分)

创建自定义函数或直接在图表中实现:

  1. 如果恢复已在进行:使用 Retriggerable Delay 重置计时器

  2. 如果恢复未开始:设置 bIsRegenerating = True,然后启动 Retriggerable Delay

  3. Retriggerable Delay 设置 Duration = 3.0 秒

步骤 4:恢复结束后执行生命恢复

从 Retriggerable Delay 的 Completed 引脚引线:

  1. 进入 While Loop 或使用 Timeline 节点实现持续恢复

  2. 逐步恢复生命值直到 MaxHealth

  3. 恢复完成后设置 bIsRegenerating = False

步骤 5:编译并测试

  1. 点击 Compile 编译蓝图

  2. 添加打印字符串节点便于观察效果

  3. 运行游戏并测试:受到伤害后,3 秒内未再受伤则开始恢复;3 秒内再次受伤则 3 秒倒计时重置

💡 这是 Retriggerable Delay 的经典应用场景。当受伤后,在恢复延迟时间结束前如果再次受伤,计时器会被重置,确保护盾/生命值只在玩家停止受伤一段时间后才开始恢复

参考逻辑示意

text
ApplyDamage 事件
    ↓
Damage taken → Pause Timer → 启动 Retriggerable Delay → Unpause Timer[reference:11]
    ↓(如果倒计时中被再次触发)
Retriggerable Delay 自动重置倒计时
    ↓(倒计时完成)
Completed 引脚执行 → 开始生命/护盾恢复逻辑

三、常见应用场景总结

应用场景 具体说明
技能冷却重置 连续按技能键时不断重置冷却计时,必须持续不按超过冷却时间才可使用
生命值/护盾自动恢复 玩家停止受伤一段时间后自动恢复生命,再次受伤则重置计时器
按钮防抖(Debounce) 防止用户在短时间内连续按下按钮而触发多次逻辑
延迟执行链/循环 可以实现比 Event Tick 效率更高的定时循环逻辑,适合需要固定间隔重复执行的场景
敌人响应延迟 敌人发现玩家后延迟响应,期间若玩家离开视野则重置延迟
动画状态延迟重置 动画播放完成后延迟重置状态,若重置前再次触发动作则重置计时

四、重要注意事项

  1. Retriggerable Delay 只能被最后一个触发器的逻辑调用:如果在延迟计时期间被多次触发,旧逻辑将被丢弃,只有最后一次触发才有效

  2. 不要在 Tick 事件中直接使用 Retriggerable Delay:每帧都会触发重置,导致 Completed 永远不会执行。

  3. Duration 数值设定:建议根据实际需求设定合适的时长,过短可能导致逻辑判断过于灵敏,过长则影响游戏体验。

  4. 防止无限循环:在 Completed 执行链中调用相同的输入事件前,确保使用了条件分支(如 Branch)检查状态,避免逻辑死循环。

  5. Retriggerable Delay vs 普通 Timer:如果需要更精确的计时器控制和中断功能,可以使用 Event Tick + 变量计时器,但 Retriggerable Delay 更简洁,适合常规的需求场景。

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

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

昵称

取消
昵称表情代码图片

    暂无评论内容