仿真时钟
需要:uBotCore 0.1.x
读取 uBot 的仿真时间(Sim Time),并设置固定步长(Fixed Time Step)、暂停和单步(Step)。
所有 uBot 时间戳都用同一个时间:World 的游戏时间。它在暂停时不走,会随时间膨胀(Time Dilation)变快或变慢。
时钟是一个 World 子系统(Subsystem)。在事件图里右键,搜索 Get UBotClockSubsystem(在「World Subsystems」分类下)取到它,再读仿真时间。放进图里后,节点的标题显示为类的显示名 UBot Clock Subsystem:
连线:
- Event Tick 的 执行,连到 Print String 的 执行
- UBot Clock Subsystem 的 Return Value,连到 Get Sim Time Seconds 的 Target
- Get Sim Time Seconds 的 Return Value,连到 To String (Float) 的 In Double
- To String (Float) 的 Return Value,连到 Print String 的 In String
- 这个节点只在 Game 和 PIE 世界里有效,后面几张图里的同名节点都一样。
Event Tick
UE 引擎 · 中文界面:事件Tick
Event called every frame, if ticking is enabled
输出
- 执行
- Delta Seconds
Float
查看参考AActor.ReceiveTick
UBot Clock Subsystem
这个节点没有登记在 API 数据里(inline 节点),引脚未经校验。
输入
无
输出
- Return Value
UBot Clock Subsystem对象引用
inline 节点:未在 data/api 中登记
Get Sim Time Seconds
Target is UBot Clock Subsystem · UBotCore
当前 World 的 uBot 仿真时间(秒)。所有 uBot 时间戳都用这个时间。
输入
- Target
UBot Clock Subsystem对象引用
输出
- Return Value
Float (double)
查看参考UUBotClockSubsystem.GetSimTimeSeconds
To String (Float)
UE 引擎 · 中文界面:转换为字符串(浮点)
Converts a double value to a string
输入
- In Double
Float (double)
输出
- Return Value
String
查看参考UKismetStringLibrary.Conv_DoubleToString
Print String
UE 引擎 · 中文界面:打印字符串
Prints a string to the log, and optionally, to the screen If Print To Log is true, it will be visible in the Output Log window. Otherwise it will be logged only as 'Verbose', so it generally won't show up.
输入
- 执行
- In String
String - Print to Screen
Boolean - Print to Log
Boolean - Text Color
Linear Color结构体 - Duration
Float - Key
Name
输出
- 执行
查看参考UKismetSystemLibrary.PrintString
启用固定步长
Section titled “启用固定步长”固定步长让引擎每帧固定推进 1 / Step Hz 秒。有两种设置方法:
- 在项目设置里勾选
Use Fixed Time Step,之后每个 Game 或 PIE 世界开始运行时自动启用,见设置项。 - 在蓝图里调用
Set Fixed Time Step,把Enabled设为 true;设为 false 则关闭。
连线:
- Event BeginPlay 的 执行,连到 Set Fixed Time Step 的 执行
- UBot Clock Subsystem 的 Return Value,连到 Set Fixed Time Step 的 Target
Event BeginPlay
UE 引擎 · 中文界面:事件开始运行
Event when play begins for this actor.
输出
- 执行
查看参考AActor.ReceiveBeginPlay
UBot Clock Subsystem
这个节点没有登记在 API 数据里(inline 节点),引脚未经校验。
输入
无
输出
- Return Value
UBot Clock Subsystem对象引用
inline 节点:未在 data/api 中登记
Set Fixed Time Step
Target is UBot Clock Subsystem · UBotCore
启用或关闭引擎的固定步长(整个进程共用)。Step Hz 限制在 1 到 1000 Hz;最后一个改过它的时钟销毁时,恢复原来的值。
输入
- 执行
- Target
UBot Clock Subsystem对象引用 - Enabled
Boolean - Step Hz
Float (double)
输出
- 执行
查看参考UUBotClockSubsystem.SetFixedTimeStep
先暂停,再每触发一次就前进几帧:
连线:
- Event BeginPlay 的 执行,连到 Delay 的 执行
- Delay 的 Completed,连到 Pause Simulation 的 执行
- UBot Clock Subsystem 的 Return Value,连到 Pause Simulation 的 Target
Event BeginPlay
UE 引擎 · 中文界面:事件开始运行
Event when play begins for this actor.
输出
- 执行
查看参考AActor.ReceiveBeginPlay
Delay
UE 引擎 · 中文界面:延迟
Perform a latent action with a delay (specified in seconds). Calling again while it is counting down will be ignored.
输入
- 执行
- Duration
Float
输出
- Completed
查看参考UKismetSystemLibrary.Delay
UBot Clock Subsystem
这个节点没有登记在 API 数据里(inline 节点),引脚未经校验。
输入
无
输出
- Return Value
UBot Clock Subsystem对象引用
inline 节点:未在 data/api 中登记
Pause Simulation
Target is UBot Clock Subsystem · UBotCore
暂停游戏,并取消尚未完成的单步。
输入
- 执行
- Target
UBot Clock Subsystem对象引用
输出
- 执行
查看参考UUBotClockSubsystem.PauseSimulation
连线:
- Step Once 的 执行,连到 Step Simulation 的 执行
- UBot Clock Subsystem 的 Return Value,连到 Step Simulation 的 Target
- 这是你自己建的自定义事件(Custom Event),由按键或界面按钮调用。
Step Once
这个节点没有登记在 API 数据里(inline 节点),引脚未经校验。
输出
- 执行
inline 节点:未在 data/api 中登记
UBot Clock Subsystem
这个节点没有登记在 API 数据里(inline 节点),引脚未经校验。
输入
无
输出
- Return Value
UBot Clock Subsystem对象引用
inline 节点:未在 data/api 中登记
Step Simulation
Target is UBot Clock Subsystem · UBotCore
取消暂停,恰好运行 Num Frames 个 world tick 后再暂停;只算调用之后开始的 tick。Num Frames 小于 1 或无法取消暂停时返回 false;单步进行中再调用,会累加剩余帧数。
输入
- 执行
- Target
UBot Clock Subsystem对象引用 - Num Frames
Integer
输出
- 执行
- Return Value
Boolean
查看参考UUBotClockSubsystem.StepSimulation
暂停时按键事件默认不触发。用按键调用 Step Once 时,选中按键事件节点,在「Details」面板勾选 Execute When Paused;用 Enhanced Input 则勾选输入动作资产的 Trigger When Paused。界面按钮(UMG Button)不受暂停影响,可以直接调用。
-
暂停
调用
Pause Simulation。暂停后仿真时间和Get Sim Frame都停住。 -
单步
调用
Step Simulation,Num Frames填要前进的帧数。世界恢复运行恰好这么多个 world tick,然后自动再暂停。 -
恢复
调用
Resume Simulation,世界恢复自由运行,没跑完的单步也一并取消。
| 名称 | 默认值 | 作用 |
|---|---|---|
Use Fixed Time Step(项目设置) |
未勾选 | 每个 Game 或 PIE 世界开始运行时自动启用固定步长 |
Fixed Time Step Hz(项目设置) |
60 Hz | 固定步长的频率,范围 1 到 1000 Hz;勾选上一项后才能编辑 |
Enabled(Set Fixed Time Step) |
false | true 启用固定步长,false 关闭 |
Step Hz(Set Fixed Time Step) |
60 Hz | 固定步长的频率,限制在 1 到 1000 Hz |
Num Frames(Step Simulation) |
1 | 要前进的 world tick 数,必须大于等于 1 |
时钟子系统没有事件,需要时在 Event Tick 或计时器里读取下面这些节点:
| 节点 | 输出 | 说明 |
|---|---|---|
Get Sim Time Seconds |
Float (double),单位 s | 当前仿真时间 |
Get Sim Frame |
Integer64 | 游戏时间前进过的 world tick 数;暂停时不增加 |
Is Fixed Time Step Enabled |
Boolean | 引擎当前是否启用了固定步长 |
Is Simulation Paused |
Boolean | 世界是否处于暂停 |
Get Remaining Step Frames |
Integer | 单步还剩几个 world tick;没有单步时为 0 |
Step Simulation |
Return Value(Boolean) |
单步开始为 true;Num Frames 小于 1 或取消不了暂停时为 false |
PIE 运行时,uBot 面板的 Runtime 分区也显示仿真时间和固定时间步长。
- 子系统只存在于 Game 和 PIE 世界。编辑器的预览世界里取不到它。
- 固定步长是整个进程共用的设置。第一个改它的时钟记下原来的值,最后一个改过它的时钟销毁时恢复。
- 暂停靠本地玩家控制器(PlayerController),并要求 GameMode 允许暂停。编辑器自己的 PIE 暂停会让世界一直保持暂停,这时
Resume Simulation和Step Simulation都不会成功,日志里有LogUBot警告。 Step Simulation在单步进行中再次调用,会把帧数加到剩余帧数上。- 关闭项目设置
Use Fixed Time Step不会关掉已经启用的固定步长。 - 不支持固定步长的构建配置里,启用固定步长只会在日志里警告,不会生效。
- UBot Clock Subsystem:全部节点。
- 仿真时钟与采样调度:传感器的采样时刻怎么排。
- uBotCore 设置项:
Use Fixed Time Step和Fixed Time Step Hz。