官方范例拆解:loop + Sleep 的两种形态
第 11 课的心跳模式不是教学玩具——Epic 有两份官方教程,恰好展示了 loop + Sleep 在真实项目里的两大形态:管全局节奏的「节拍器」,和按周期开合的「机关」。这一页带你把语法落到可游玩的东西上。
一、一个模式,两种形态
把 UEFN 项目里所有的 loop + Sleep 摊开看,基本都能归进两个抽屉:
- 全局节拍器:整局游戏只有一个(或极少几个)的主循环,管回合推进、计时、定期结算——它是游戏的「心脏」,节奏就是玩法节奏;
- 周期性机关:每个机关自带一个小循环,按固定周期做成对动作——消失又出现的平台、开了又关的门、亮了又灭的灯,它们是散落在岛上的「脉搏」。
Epic 官方恰好各给了一份教程:Verse Starter 系列第 6 篇《Managing the Game Loop》对应前者,《Disappearing Platform on Loop》对应后者。两份合起来,就是第 11 课那台 heartbeat_device 的「毕业去向」。
二、形态一:游戏主循环(Verse Starter 06)
《Managing the Game Loop》的核心思路,是把「一局游戏」组织成设备 OnBegin<suspends> 里的一个 loop设备入口 OnBegin(相当于 Event BeginPlay,<suspends> 表示它能等待)里的一个 loop:每一圈就是一个回合(或一个节拍),圈内依次做「回合开始 → 玩法进行 → 回合结算」,圈与圈之间用 Sleep 控制节奏。骨架长这样:
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
round_manager_device := class(creative_device):
var Round:int = 0
OnBegin<override>()<suspends>:void =
loop:
set Round += 1
Print("第 {Round} 回合开始")
# ……这一回合的玩法逻辑……
Sleep(30.0) # 一回合 30 秒
Print("第 {Round} 回合结算")
Sleep(5.0) # 回合间休息 5 秒
这个形态的关键收获是心智模型:游戏的时间轴不再散落在十几个事件回调里,而是集中在一个自上而下、可以逐行读的循环里——「先发生什么、再发生什么、每步隔多久」一目了然。需要提前终局?在圈内加条件 break;需要动态节奏?把 Sleep 的秒数换成变量。第 11 课的语法在这里全部对上号。
这个形态的关键收获是心智模型:游戏的时间轴不再散落在十几个事件节点(那种一个个 Bind 出去的回调)里,而是集中在一个从上往下、可以顺着读的循环里——「先发生什么、再发生什么、每步隔多久」一目了然。需要提前终局?在圈内加个条件走 break;需要动态节奏?把 Sleep 的秒数换成一个变量。第 11 课的那些写法在这里全部对上号。
三、形态二:定时消失的平台
《Disappearing Platform on Loop》则把同一个模式缩小到一台机关设备上:平台显示几秒、隐藏几秒、周而复始,玩家必须踩着节奏跳过去。循环体就是「成对动作 + 两段 Sleep」:
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
blink_platform_device := class(creative_device):
OnBegin<override>()<suspends>:void =
loop:
Print("平台现身,快踩上来")
# 这里调用道具的「显示」API
# TODO: 以 Verse API Reference 为准
Sleep(3.0) # 平台停留 3 秒
Print("平台消失,悬空 2 秒")
# 这里调用道具的「隐藏」API
# TODO: 以 Verse API Reference 为准
Sleep(2.0)
注意整台机关的「手感」全在两个数字里:Sleep(3.0) 是给玩家的反应窗口,Sleep(2.0) 是惩罚间隔。想做难度曲线,只需把这两个秒数做成 @editable 的 float,策划在面板上就能调,不用碰代码。想做难度曲线,只需给这两个秒数变量打开 @editable(就是蓝图变量上那只 Instance Editable 小眼睛),做成 float;之后把设备拖进关卡,策划在 Details 面板上直接调,不用碰任何节点。道具显隐的具体 API 请以官方教程页和你项目的 digest 文件为准——本页刻意留白,不替官方发明函数名。道具显隐具体要连哪个节点、调哪个函数,请以官方教程页和你项目里生成的 digest 文件为准——本页刻意留白,不替官方编造名字。
还记得第 11 课 defer 的「成对操作」吗?显示/隐藏正是那种成对动作。如果你的机关循环里有 break 出口(比如游戏结束时停摆),用 defer 保证「离开循环体前把平台恢复显示」,就能避免平台永远消失的尴尬——这是两个知识点在同一台设备里握手。
想让消失平台「停留久一点、消失短一点」来降低难度,应该改哪里?
四、来源
本文整理自 Epic 官方教程,建议对照原文跟做一遍: