Verse Wiki — 写给 UE6 时代的 Verse 互动手册
拓展 · EXTRA

官方范例拆解: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 控制节奏。骨架长这样:

game_loop_skeleton.verse
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」:

blink_platform_device.verse
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 官方教程,建议对照原文跟做一遍: