事件序列器是一个强大的框架,使您能够在结构化的动作和触发器序列上构建实时的跨服务器事件和过场动画。更具体地说,此模块帮助您:
- 通过音频、动画和补间的定时配置,在结构化框架上构建事件或过场动画。
- 在多个服务器之间过渡多个场景,将复杂的动画和视觉效果与时间线同步。
- 在事件中查找并预览游戏,以便进行测试和开发。
该框架在 Roblox 事件中经过实战检验,例如 Twenty One Pilots 和 24kGoldn 音乐会,以及许多访问量极高的游戏。
要在可编辑的地方中查看 事件序列器 的实际效果,请查看 Roblox Studio 中的 音乐会 模板。该模板是开发人员创建事件/音乐会并熟悉各种功能和组件的全面起点。

模块使用
安装
要在游戏中使用 事件序列器 框架:
从 Studio 的 窗口 菜单或 主页 选项卡工具栏中,打开 工具箱 并选择 创作者商店 选项卡。

确保选择了 模型 排序,然后单击 查看所有 按钮以查看 类别。

找到并单击 包 瓦片。
找到 事件序列器 模块并单击它,或将其拖放到 3D 视图中。

在 资源管理器 窗口中,将整个 事件序列器 模型移动到 ServerScriptService 中。运行游戏时,模块将开始运行。
框架模式
替换模式
默认的框架模式是 替换模式,在该模式下,您通过将 3D 对象、地形、光照属性、环境效果 和用户界面对象放入该场景的 环境 文件夹中来设计独特的 场景。当场景加载时,这些对象和属性将分配到 Workspace、Terrain 和 Lighting 中,替换 现有对象/属性以形成克隆空间。
内联模式
另一种框架模式是 内联模式,在该模式下,您同样设计独特的 场景,并为其流/事件编写脚本逻辑,但框架 不会 销毁现有的 3D 对象、地形、光照属性、环境效果 和用户界面对象,以便在加载时从场景的 环境 文件夹克隆资产/属性。
要启用内联模式:
在您放置在 ServerScriptService 中的 事件序列器 模型内,深入并选择 ReplicatedStorage 文件夹中的 Inline 值。

在 属性 窗口中,启用其 值 复选框。

创建场景
场景 本质上是整体事件或过场动画的一部分,封装在一系列文件夹中。每个场景包含定义其流/事件的脚本逻辑,并且场景可以存储其自己的 3D 对象、地形、光照属性、环境效果 和用户界面对象。
要快速入门,您可以在模块的主文件夹中找到一个空场景:
展开 事件序列器 文件夹并找到 BlankScene 文件夹。

将整个 BlankScene 文件夹移动或复制到 ReplicatedStorage 中。

时间长度
每个场景应具有一个 时间长度,以秒为单位,定义其持续时间——就像电影或音乐会有固定的持续时间一样。时间长度被定义为场景文件夹中的一个名为 TimeLength 的数值 属性,您可以直接在 Studio 中设置或通过 Instance:SetAttribute() 以编程方式设置。


环境
场景的 环境 文件夹包含用户看到和听到的所有内容,包括 3D 对象、地形、光照属性 和 环境效果,以及用户界面对象。当场景加载时,这些对象和属性将分配到 Workspace、Terrain 和 Lighting 中,替换现有对象/属性以形成克隆空间。
环境 文件夹包含以下容器:
| 容器 | 描述 |
|---|---|
| 客户端 | 包含任何用户(客户端)加入事件时加载的所有资产,例如用户界面对象或动画装置。 |
| 玩家生成点 | 包含用户加入时生成的部件。此文件夹中的任何部件的行为类似于 SpawnLocation。 |
| 服务器 | 包含在服务器上首次创建场景时加载的所有资产。建议大多数视觉资产放在这里。 |
| 地形 | 包含场景地形。 |
| 光照 | 包含全局 光照属性 作为属性,以及 大气效果 和 后期处理 效果等修饰符。 |
事件
场景的 事件 文件夹纯粹是 RemoteEvents 的占位符,用于在 客户端 和 服务器 模块之间进行通信。将任何内容放入此文件夹并不是必需的。
客户端
此脚本在客户端执行 模式 逻辑。
服务器
此脚本在服务器上执行 模式 逻辑。
场景模式
场景的 模式 定义了在场景时间线的什么时刻发生什么。您应该在其 客户端 和 服务器 模块中定义场景的模式,并包含 生命周期钩子 以管理 配置 何时发生。
生命周期钩子
模式 生命周期钩子 让您管理场景操作何时发生。生产中的场景通常会以最简单的流程运行:
OnRun 在查找时可能会被中断:
如果场景被重播,所有三个钩子也可以重复:
配置
模式 配置 定义场景的核心操作,例如在 00:32 播放 音频、排队与该音频同步的 动画、安排场景事件(如烟花表演)等。每个配置支持某些回调函数,其中第一个参数(self)是配置实例。
查找场景
事件序列器 的一个独特功能是能够像查找视频一样在场景之间“查找”。在 替换模式 中,您还可以在场景之间切换,以在将其部署到生产之前预览整个多场景事件。
场景查找并非对所有人可用,因为仅仅享受事件的用户不应有能力控制其时间流。相反,您必须根据事件的 PlaceId 以及特定的 UserIds 和/或 组 及其内部角色授予查找权限。
在 ServerScriptService 中创建一个新的 Script。
将以下代码粘贴到新脚本中。
脚本 - 设置查找权限local ReplicatedStorage = game:GetService("ReplicatedStorage")local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))EventSequencer.setSeekingPermissions({placeIDs = {},userIDs = {},groups = {{GroupID = , MinimumRankID = },}})在 setSeekingPermissions 调用中填写以下表格:
场景管理器插件
场景管理器 插件是一个有用的工具,用于加载和卸载场景、光照 和 地形。除非您使用 内联模式,否则强烈建议您使用此插件,而不是手动放置/编辑场景对象和属性。
要安装插件:
从 Studio 的 窗口 菜单或 主页 选项卡工具栏中,打开 工具箱。
在选定 创作者商店 选项卡的情况下,从下拉菜单中选择 插件。
在搜索字段中输入 场景管理器 并按 Enter 查找插件。

单击插件的图标以查看其详细信息,然后单击 安装 按钮。
插件安装后,它将出现在 Studio 的 插件 选项卡中。
加载和卸载场景
如 创建场景 中所述,场景的 环境 文件夹包含用户看到和听到的所有内容,包括 3D 对象。该插件帮助您快速将场景的资产加载到工作区中的有组织文件夹中或从中卸载。
| 插件操作 | 描述 |
|---|---|
| 加载客户端 | 如果场景的客户端内容已卸载,则将其 环境/客户端 文件夹移动到 工作区/场景客户端 文件夹中。 |
| 加载服务器 | 如果场景的服务器内容已卸载,则将其 环境/服务器 文件夹移动到 工作区/场景服务器 文件夹中。 |
| 卸载客户端 | 如果场景的客户端内容已加载,则将其 客户端 文件夹从 工作区/场景客户端 移回 [场景]/环境 文件夹。 |
| 卸载服务器 | 如果场景的服务器内容已加载,则将其 服务器 文件夹从 工作区/场景服务器 移回 [场景]/环境 文件夹。 |
| 卸载所有场景 | 将每个加载的场景的 客户端 和 服务器 文件夹移回其 环境 文件夹。 |
保存和加载光照
顶级的 Lighting 服务存储地方的所有光照属性和视觉效果。由于它是顶级服务,您无法手动将其移动到特定场景的 环境/服务器 或 环境/客户端 文件夹中。相反,您可以利用插件将其属性和子项复制到场景的 环境/光照 文件夹中。
在 场景管理器 插件窗口中,单击所需场景的 保存光照。
保存和加载地形
由于 Terrain 是 Workspace 中的顶级类,您无法手动将生成或雕刻的地形移动到特定场景的 环境/服务器 或 环境/客户端 文件夹中。相反,您可以利用插件将其复制到场景的 环境/地形 文件夹中。
通过顶级 地形 服务配置场景的地形。

在 场景管理器 插件窗口中,单击所需场景的 保存地形。
选择并展开该场景的 环境/地形 文件夹,您将看到一个 TerrainRegion 对象,表示保存的地形。

一旦为场景保存了地形,您可以通过单击插件窗口中的 加载地形 快速将其加载回顶级的 Terrain 服务。
API 参考
模式生命周期钩子
OnSetup
OnSetup 生命周期钩子旨在初始化将在 OnRun 或 OnEndScene 中引用的资产和变量,设置 连接,这些连接旨在在场景持续期间保持等。此钩子接收 timePositionObject 参数,允许您在设置时读取当前时间。
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
local Schema = EventSequencer.createSchema()
local clientEnvironment
local serverEnvironment
local dummy
Schema.OnSetup = function(timePositionObject)
print("OnSetup (客户端)")
-- 访问场景环境;不适用于内联模式
clientEnvironment = EventSequencer.getCurrentSceneEnvironment()
serverEnvironment = EventSequencer.getCurrentServerEnvironmentFromClient()
-- 等待资产
dummy = clientEnvironment:WaitForChild("Dummy")
print("当前时间是:", timePositionObject.Value)
endlocal ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
local Schema = EventSequencer.createSchema()
local serverEnvironment
local partColorConnection
local changePartColorEvent = script.Parent.Events.ChangePartColor
Schema.OnSetup = function(timePositionObject)
print("OnSetup (服务器)")
-- 访问场景环境;不适用于内联模式
serverEnvironment = EventSequencer.getCurrentSceneEnvironment()
partColorConnection = changePartColorEvent.OnServerEvent:Connect(function(player, changedPart, newColor)
serverEnvironment.changedPart.Color = newColor
end)
print("当前时间是:", timePositionObject.Value)
endOnRun
OnRun 是 模式 中的主要操作生命周期钩子。它应包含场景的所有定时 配置,从播放 音频 或 动画 到 安排事件(如烟花表演)。
Schema.OnRun = function()
print("OnRun (客户端)")
local MainAudio = Schema:audio({
StartTime = 1,
SoundId = "rbxassetid://1838673350",
OnStart = function(self)
print("音频播放中")
end,
OnEnd = function(self)
print("音频结束")
end
})
endOnEndScene
OnEndScene 生命周期钩子对于清理场景中任何未完成的内容非常有用,例如断开在 OnSetup 或 OnRun 中创建的连接,这些连接在场景持续期间保持。
Schema.OnEndScene = function()
print("OnEndScene (服务器)")
if partColorConnection then
partColorConnection:Disconnect()
partColorConnection = nil
end
end模式配置
audio
在工作区中创建一个 Sound 对象,该对象在特定时间播放。音频将在场景结束后或 Sound 对象播放完毕后被删除。
| 配置键 | 描述 |
|---|---|
| StartTime | 在场景持续时间内播放音频的时间,以秒为单位。 |
| SoundId | 要播放的音频的资产 ID。 |
| OnStart | 音频开始播放时触发的自定义函数。 |
| OnEnd | 音频播放结束时触发的自定义函数。 |
| Volume | Sound 对象的音量;默认值为 0.5。 |
Schema.OnRun = function()
print("OnRun (客户端)")
local MainAudio = Schema:audio({
StartTime = 1,
SoundId = "rbxassetid://1838673350",
OnStart = function(self)
print("音频播放中")
end,
OnEnd = function(self)
print("音频结束")
end
})
endanimate
创建一个在特定时间播放的 Animation。
| 配置键 | 描述 |
|---|---|
| StartTime | 在场景持续时间内播放动画的时间,以秒为单位。 |
| EndTime | 可选的结束动画的时间,以秒为单位,关系到场景的持续时间。 |
| Rig | 播放动画的动画装置。 |
| AnimationId | 要播放的动画的资产 ID。 |
| Speed | 动画的播放速度;默认值为 1。 |
| FadeInTime | 动画淡入的时间,以秒为单位;默认值为 0.2(秒)。 |
| FadeOutTime | 动画淡出的时间,以秒为单位;默认值为 0.2(秒)。 |
| OnStart | 动画开始播放时触发的自定义函数。 |
| OnEnd | 动画播放结束时触发的自定义函数。 |
| Looped | 是否循环播放动画;默认值为 false。 |
| SyncToAudio | 定义是否将动画与 音频 配置同步的表。接受以下键:
|
Schema.OnRun = function()
print("OnRun (客户端)")
local MainAudio = Schema:audio({
StartTime = 1,
SoundId = "rbxassetid://1838673350",
})
local DanceAnimation = Schema:animate({
AnimationId = "rbxassetid://3695333486",
Rig = Dummy,
Speed = 1,
FadeInTime = 0.1,
FadeOutTime = 0.3,
SyncToAudio = {
Audio = MainAudio,
StartAtAudioTime = 5,
},
OnStart = function(self)
print("动画播放中")
end,
OnEnd = function(self)
print("动画停止")
end
})
endtween
创建一个可配置的 Tween,在查找和动态加入时保留,这意味着您可以在不同的时间点链接补间,并且一切都应按预期播放和同步。
| 配置键 | 描述 |
|---|---|
| StartTimes | 与场景持续时间相关的开始时间表,以秒为单位。 |
| Tween | 定义要补间的对象和属性的表。接受以下键:
|
| OnStart | 补间开始播放时触发的自定义函数。 |
| OnHeartbeat | 在每个 Heartbeat 上触发的自定义函数;接收补间 alpha 作为第二个参数。 |
| OnEnd | 补间播放结束时触发的自定义函数。 |
| SyncToAudio | 定义是否将补间与 音频 配置同步的表。接受以下键:
|
Schema.OnRun = function()
print("OnRun (客户端)")
local MainAudio = Schema:audio({
StartTime = 1,
SoundId = "rbxassetid://1838673350",
})
local LightFadeOut = Schema:tween({
StartTimes = {29.884},
Tween = {
Object = game:GetService("Lighting"),
Info = TweenInfo.new(2, Enum.EasingStyle.Sine, Enum.EasingDirection.Out),
Properties = {
Brightness = 0,
}
},
SyncToAudio = {
Audio = MainAudio,
StartAtAudioTimes = {5, 7.2, 9.4, 11.6},
},
OnStart = function(self)
print("补间播放中")
end,
OnHeartbeat = function(self, alpha)
print("补间 alpha", alpha)
end,
OnEnd = function(self)
print("补间完成")
end,
})
endinterval
在指定的持续时间内以指定的频率(以秒为单位)执行自定义回调函数。适用于重复事件,例如闪烁的灯光、脉冲音频的强度等。最低频率为 0 秒,但技术上最低频率始终限制为 Heartbeat。
| 配置键 | 描述 |
|---|---|
| StartTime | 在场景持续时间内的间隔持续时间开始时间,以秒为单位。 |
| EndTime | 在场景持续时间内的间隔持续时间结束时间,以秒为单位。 |
| Frequency | OnInterval 函数应触发的频率,以秒为单位,第一次执行在 StartTime。 |
| OnStart | 一系列间隔开始时触发的自定义函数。 |
| OnInterval | 在指定持续时间内(StartTime 到 EndTime)的每个间隔触发的自定义函数。 |
| OnEnd | 一系列间隔结束时触发的自定义函数。 |
| SyncToAudio | 定义是否将间隔持续时间与 音频 配置同步的表。接受以下键:
|
Schema.OnRun = function()
print("OnRun (客户端)")
local MainAudio = Schema:audio({
StartTime = 1,
SoundId = "rbxassetid://1838673350",
})
local ClientTimerUpdate = Schema:interval({
Frequency = 1,
SyncToAudio = {
StartAtAudioTime = 2.5,
EndAtAudioTime = 10,
Audio = MainAudio
},
OnInterval = function(self)
print(MainAudio.Sound.TimePosition, MainAudio.CurrentSoundIntensityRatio)
end,
})
endschedule
类似于 interval,但您可以为同一事件定义多个特定的开始时间,例如在场景中安排两次烟花表演。
| 配置键 | 描述 |
|---|---|
| StartTimes | 与场景持续时间相关的开始时间表,以秒为单位。 |
| OnStart | 在 StartTimes 表中每个指定时间触发的自定义函数。 |
| Skippable | 布尔值,定义是否可以跳过计划事件,适用于晚到的用户或在计划开始时间之前查找时。如果设置为 false,则在加入/查找时间之前安排的所有事件开始时间将在该加入/查找时间发生。如果设置为 true,则仅在加入/查找之后安排的开始时间将发生。默认值为 false。 |
| SyncToAudio | 定义是否将计划与 音频 配置同步的表。接受以下键:
|
Schema.OnRun = function()
print("OnRun (客户端)")
Schema:schedule({
StartTimes = {5, 27.25},
OnStart = function(self)
-- 初始化临时心跳连接
local tempConnection = RunService.Heartbeat:Connect(function()
end)
-- 通知框架连接
Schema:inform(tempConnection)
end
})
endinform
通知框架任何在 OnRun 生命周期钩子中创建的模块、UI 对象、连接等,确保它们在 查找 时被正确清理。用例包括:
通知框架临时的临时连接,例如 RunService.Heartbeat,以便在查找到场景的早期时清理该连接。
服务器模式Schema.OnRun = function()print("OnRun (服务器)")Schema:schedule({StartTimes = {5},OnStart = function(self)-- 初始化临时心跳连接local tempConnection = RunService.Heartbeat:Connect(function()end)-- 通知框架连接Schema:inform(tempConnection)end})end在 ModuleScript 中调用自定义“清理”函数,该函数在 OnRun 生命周期钩子中初始化连接或其他引用。
服务器模式local ReplicatedStorage = game:GetService("ReplicatedStorage")local RunService = game:GetService("RunService")local customModule = require(ReplicatedStorage:WaitForChild("CustomModule"))local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))local Schema = EventSequencer.createSchema()Schema.OnRun = function()print("OnRun (服务器)")Schema:schedule({StartTimes = {5},OnStart = function(self)-- 调用自定义模块中的“init”函数customModule.init()-- 在场景清理时调用自定义模块中的“clean”函数Schema:inform(customModule, customModule.clean)end,})end模块脚本 - CustomModulelocal RunService = game:GetService("RunService")local CustomModule = {}CustomModule.init = function()-- 初始化心跳连接CustomModule.connection = RunService.Heartbeat:Connect(function()end)endCustomModule.clean = function()-- 断开并清除心跳连接if CustomModule.connection thenCustomModule.connection:Disconnect()CustomModule.connection = nilendendreturn CustomModule
函数
loadScene
loadScene(sceneName: string, startTime: number ?)
通过 sceneName 程序性地加载场景,并从其开始的 startTime 开始。场景将有 5 秒的“宽限期”从服务器加载,然后再进行查找并开始播放场景。这意味着,如果您在下午 4:15:00 精确调用 loadScene("[SceneName]", 20),框架将在请求的 20 秒之外再等待 5 秒,从而在下午 4:15:25 启动场景。
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- 在当前场景完成时找出下一个要加载的场景
EventSequencer.onOrchestrationFinished:Connect(function(endedSceneName)
if endedSceneName == "PreShow" then
-- “PreShow”结束;加载音乐会中的第一个场景
EventSequencer.loadScene("Track1")
elseif endedSceneName == "Track1" then
-- “Track1”结束;加载音乐会中的第二个场景
EventSequencer.loadScene("Track2")
else
-- 循环回到预演场景
EventSequencer.loadScene("PreShow")
end
end)createSchema
createSchema(): table
返回场景 模式 的实例,以创建场景的逻辑。
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
local Schema = EventSequencer.createSchema()
Schema.OnSetup = function(timePositionObject)
print("OnSetup (客户端)")
endseek
seek(time: number)
从当前加载的场景的开始查找到 time 值,以秒为单位。
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
EventSequencer.seek(95.58)setSceneWarningTime
setSceneWarningTime(endSceneTimeWindow: number)
设置从所有场景 结束 的时间开始发送警告的时间。您可以通过 onSceneEndingWarningForClient 或 onSceneEndingWarningForServer 在客户端或服务器端检测到警告。
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- 加载场景
EventSequencer.loadScene("BeautifulScene")
-- 设置警告时间为场景结束前 5 秒
EventSequencer.setSceneWarningTime(5)
-- 检测场景即将结束时
EventSequencer.onSceneEndingWarningForServer:Connect(function()
warn("场景即将结束!")
end)setSeekingPermissions
setSeekingPermissions(permissions: table)
根据事件的 PlaceId 以及特定的 UserIds 和/或 组 及其内部角色授予查找权限。有关更多信息,请参见 查找和切换场景。
getCurrentSceneEnvironment
getCurrentSceneEnvironment(): Folder (YIELDS)
返回当前场景的客户端或服务器 环境 文件夹,具体取决于是从 客户端 模式脚本还是 服务器 模式脚本调用。
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
local Schema = EventSequencer.createSchema()
local clientEnvironment
local serverEnvironment
Schema.OnSetup = function(timePositionObject)
print("OnSetup (客户端)")
-- 访问场景环境;不适用于内联模式
clientEnvironment = EventSequencer.getCurrentSceneEnvironment()
serverEnvironment = EventSequencer.getCurrentServerEnvironmentFromClient()
print("当前时间是:", timePositionObject.Value)
endlocal ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
local Schema = EventSequencer.createSchema()
local serverEnvironment
local partColorConnection
local changePartColorEvent = script.Parent.Events.ChangePartColor
Schema.OnSetup = function(timePositionObject)
print("OnSetup (服务器)")
serverEnvironment = EventSequencer.getCurrentSceneEnvironment()
partColorConnection = changePartColorEvent.OnServerEvent:Connect(function(player, changedPart, newColor)
serverEnvironment.changedPart.Color = newColor
end)
endgetCurrentServerEnvironmentFromClient
getCurrentServerEnvironmentFromClient(): Folder (YIELDS)
返回当前场景的 服务器端 环境 文件夹。与 getCurrentSceneEnvironment 不同,您可以从 客户端 模式脚本调用此函数。
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
local Schema = EventSequencer.createSchema()
local clientEnvironment
local serverEnvironment
Schema.OnSetup = function(timePositionObject)
print("OnSetup (客户端)")
-- 访问场景环境;不适用于内联模式
clientEnvironment = EventSequencer.getCurrentSceneEnvironment()
serverEnvironment = EventSequencer.getCurrentServerEnvironmentFromClient()
print("当前时间是:", timePositionObject.Value)
endisLoadingScene
isLoadingScene(): boolean
从服务器调用以了解场景是否正在加载。
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
print(EventSequencer.isLoadingScene())
while EventSequencer.isLoadingScene() do
task.wait()
end
print("场景已加载")事件
onSceneEndingWarningForClient
在场景即将结束之前在客户端触发。默认时间为 3 秒,但您可以通过 setSceneWarningTime 进行配置。此事件只能在 LocalScript 中连接。
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- 检测场景即将结束(客户端)
EventSequencer.onSceneEndingWarningForClient:Connect(function()
warn("场景即将结束!")
end)onSceneEndingWarningForServer
在场景即将结束之前在服务器触发。默认时间为 3 秒,但您可以通过 setSceneWarningTime 进行配置。此事件只能在 Script 中连接。
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- 检测场景即将结束(服务器)
EventSequencer.onSceneEndingWarningForServer:Connect(function()
warn("场景即将结束!")
end)onSceneLoadedForClient
在场景开始时在客户端触发。此事件只能在 LocalScript 中连接。
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- 检测场景开始时(客户端)
EventSequencer.onSceneLoadedForClient:Connect(function()
warn("场景正在开始!")
end)onOrchestrationFinished
在场景达到其 时间长度 并有效结束时在服务器触发。此事件接收一个 endedSceneName 字符串名称参数,表示刚刚完成的场景,您可以通过此事件有条件地 加载另一个场景。只能在 Script 中连接。
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- 在当前场景完成时找出下一个要加载的场景
EventSequencer.onOrchestrationFinished:Connect(function(endedSceneName)
if endedSceneName == "PreShow" then
-- “PreShow”结束;加载音乐会中的第一个场景
EventSequencer.loadScene("Track1")
elseif endedSceneName == "Track1" then
-- “Track1”结束;加载音乐会中的第二个场景
EventSequencer.loadScene("Track2")
else
-- 循环回到预演场景
EventSequencer.loadScene("PreShow")
end
end)

