一、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),按以下步骤连接节点:
-
在图表中右键添加 Event Tick 节点
-
从 Event Tick 的 Delta Seconds 引脚拖出,添加 乘法(Multiply) 节点
-
将 RotationPerSecond 变量拖入图表,连接到乘法节点的另一个输入
-
从乘法节点的结果拖出,添加 AddActorLocalRotation 节点
-
将 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步:实现帧率无关的移动
-
从 Event Tick 的 Delta Seconds 引脚拖出,添加 乘法(Multiply) 节点
-
将 Consume Movement Input Vector 的输出连接到乘法节点的另一个输入
-
从乘法结果拖出,添加 AddActorWorldOffset 节点
-
将 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 逻辑
-
添加 Event Tick 节点
-
从 Delta Seconds 拖出,添加 加法(Add) 节点
-
将
Accumulator变量拖入,连接到加法节点的另一个输入 -
将加法结果通过 设置(Set) 节点写回
Accumulator -
添加 Branch(分支) 节点,条件为
Accumulator >= TargetTime -
在 True 分支执行目标逻辑(如打印消息、触发事件等)
-
将
Accumulator重置为 0
逻辑说明:每帧将 Delta Seconds 累加到 Accumulator 中,当达到目标时间时触发逻辑并重置。
五、性能注意事项与最佳实践
⚠️ 性能警告
蓝图 Event Tick 的执行效率比 C++ 原生实现慢 10 到 100 倍。如果在每个 Tick 都执行大量操作和复杂的数学计算,应考虑使用 C++ 实现。
✅ 最佳实践建议
-
仅在必要时使用 Tick:只有当逻辑确实需要每帧更新时才使用 Event Tick。
-
使用 Tick Interval 降低频率:对于不需要每帧执行的逻辑(如UI更新、AI状态轮询),在细节面板中设置 Tick Interval 为 0.2~1.0 秒。
-
动态开关 Tick:当 Actor 不需要更新时,可以通过
Set Actor Tick Enabled节点动态关闭 Tick。 -
考虑替代方案:
-
Timer(定时器):适合需要按固定间隔执行、且可以开始/停止的逻辑
-
Event Dispatcher(事件调度器):适合事件驱动型更新,避免每帧轮询
-
Timeline(时间轴):适合动画和过渡效果
-
-
减少 Tick 中的计算量:避免在 Tick 中执行昂贵的操作,如复杂的数学计算、射线检测等。
六、Event Tick 的常见应用场景
| 场景 | 说明 |
|---|---|
| 平滑移动 | 使用 AddActorWorldOffset + Delta Seconds 实现帧率无关移动 |
| 持续旋转/动画 | 使用 AddActorLocalRotation 实现物体自转 |
| 计时器 | 累加 Delta Seconds 实现计时功能 |
| 实时数据更新 | 如 FPS 显示、AI 状态轮询 |
| 摄像机跟随 | 每帧更新摄像机位置以平滑跟随目标 |
| 物理效果控制 | 持续施加力或更新物理状态 |
感谢您的来访,获取更多精彩文章请收藏本站。







暂无评论内容