虚幻引擎 Event Tick 节点

一、Event Tick 基础概念

Event Tick 是 Actor 或 Component 自带的一个事件节点,每当引擎每帧渲染时都会触发一次。它的调用频率与实际帧率一致,在默认情况下UE5的帧率不固定(通常30–144 FPS不等)

Event Tick 节点只有一个输出参数 Delta Seconds,表示距上一帧经过的时间(秒),用于将基于时间的操作与帧率解耦

提示:在 Actor 或 Component 的“细节”面板中有 Tick Interval(秒) 输入框,默认值为0(每帧调用)。可以将其改为0.1、0.2、1.0等值,引擎会在上次Tick结束后等待设定的秒数再触发下一次Tick。对于低频率逻辑(如搜索附近敌人、更新UI等),用0.2~1.0秒的间隔就足够了

二、完整案例一:让 Actor 持续旋转

这是最经典的 Event Tick 入门案例,演示如何使用 Delta Seconds 实现与帧率无关的平滑旋转。

操作步骤

第1步:创建蓝图类

在内容浏览器中右键 → 选择 蓝图类(Blueprint Class) → 选择 Actor 作为父类 → 命名为 BP_RotatingCube

第2步:添加静态网格体组件

打开 BP_RotatingCube 蓝图,在组件面板中点击 添加(Add) → 选择 静态网格体(Static Mesh) → 添加一个立方体组件

第3步:创建旋转速度变量

在“我的蓝图”面板中点击 + 号,创建 浮点(Float) 类型的变量,命名为 RotationPerSecond。在“细节”面板中将默认值设置为 180.0(表示每秒旋转180度)。建议勾选 可编辑实例(Instance Editable),这样在关卡中也能直接调节速度

第4步:添加 Event Tick 逻辑

切换到 事件图表(Event Graph),按以下步骤连接节点

  1. 在图表中右键添加 Event Tick 节点

  2. 从 Event Tick 的 Delta Seconds 引脚拖出,添加 乘法(Multiply) 节点

  3. 将 RotationPerSecond 变量拖入图表,连接到乘法节点的另一个输入

  4. 从乘法节点的结果拖出,添加 AddActorLocalRotation 节点

  5. 将 Event Tick 的白色执行线连接到 AddActorLocalRotation 节点

最终逻辑:每帧旋转角度 = 旋转速度 × 帧间隔时间

第5步:编译并测试

点击 编译(Compile) → 保存蓝图 → 将 BP_RotatingCube 拖入关卡场景 → 点击运行。立方体会持续旋转,每秒旋转180度。在关卡中选中该Actor,可以在细节面板中实时调整 RotationPerSecond 观察速度变化

三、完整案例二:与帧率无关的平滑移动

此案例演示如何使用 Event Tick 实现角色移动,并确保在不同帧率下移动速度一致

操作步骤

第1步:准备角色蓝图

创建基于 Character 或 Pawn 的蓝图类(如 BP_Player),打开其事件图表

第2步:添加 Event Tick 节点

在事件图表中右键添加 Event Tick 节点

第3步:获取移动输入偏移量

添加 Consume Movement Input Vector 节点,该节点会获取累积的移动输入偏移量

第4步:实现帧率无关的移动

  1. 从 Event Tick 的 Delta Seconds 引脚拖出,添加 乘法(Multiply) 节点

  2. 将 Consume Movement Input Vector 的输出连接到乘法节点的另一个输入

  3. 从乘法结果拖出,添加 AddActorWorldOffset 节点

  4. 将 Event Tick 的执行线连接到 AddActorWorldOffset

为什么需要乘以 Delta Seconds?

如果不乘以 Delta Seconds,高端机器帧率高、Tick调用频繁,角色会移动得更快;低端机器则相反。乘以 Delta Seconds 后,移动速度变为“单位/秒”,与帧率无关

第5步:添加输入控制(可选)

在项目设置中绑定 WASD 按键,在蓝图中添加 InputAxis MoveForward 和 InputAxis MoveRight 事件,连接到 Add Movement Input 节点,将移动方向传给角色

四、完整案例三:基于 Event Tick 的计时器

此案例演示如何使用 Event Tick 配合累加器变量实现计时功能

操作步骤

第1步:创建变量

在蓝图中创建两个变量:

  • Accumulator(浮点类型):累加器,默认值0

  • TargetTime(浮点类型):目标时间,如 5.0 秒

第2步:添加 Event Tick 逻辑

  1. 添加 Event Tick 节点

  2. 从 Delta Seconds 拖出,添加 加法(Add) 节点

  3. 将 Accumulator 变量拖入,连接到加法节点的另一个输入

  4. 将加法结果通过 设置(Set) 节点写回 Accumulator

  5. 添加 Branch(分支) 节点,条件为 Accumulator >= TargetTime

  6. 在 True 分支执行目标逻辑(如打印消息、触发事件等)

  7. 将 Accumulator 重置为 0

逻辑说明:每帧将 Delta Seconds 累加到 Accumulator 中,当达到目标时间时触发逻辑并重置

五、性能注意事项与最佳实践

⚠️ 性能警告

蓝图 Event Tick 的执行效率比 C++ 原生实现慢 10 到 100 倍。如果在每个 Tick 都执行大量操作和复杂的数学计算,应考虑使用 C++ 实现

✅ 最佳实践建议

  1. 仅在必要时使用 Tick:只有当逻辑确实需要每帧更新时才使用 Event Tick

  2. 使用 Tick Interval 降低频率:对于不需要每帧执行的逻辑(如UI更新、AI状态轮询),在细节面板中设置 Tick Interval 为 0.2~1.0 秒

  3. 动态开关 Tick:当 Actor 不需要更新时,可以通过 Set Actor Tick Enabled 节点动态关闭 Tick

  4. 考虑替代方案

    • Timer(定时器):适合需要按固定间隔执行、且可以开始/停止的逻辑

    • Event Dispatcher(事件调度器):适合事件驱动型更新,避免每帧轮询

    • Timeline(时间轴):适合动画和过渡效果

  5. 减少 Tick 中的计算量:避免在 Tick 中执行昂贵的操作,如复杂的数学计算、射线检测等

六、Event Tick 的常见应用场景

场景 说明
平滑移动 使用 AddActorWorldOffset + Delta Seconds 实现帧率无关移动
持续旋转/动画 使用 AddActorLocalRotation 实现物体自转
计时器 累加 Delta Seconds 实现计时功能
实时数据更新 如 FPS 显示、AI 状态轮询
摄像机跟随 每帧更新摄像机位置以平滑跟随目标
物理效果控制 持续施加力或更新物理状态

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

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

昵称

取消
昵称表情代码图片

    暂无评论内容