事件序列器

*此内容使用人工智能(Beta)翻译,可能包含错误。若要查看英文页面,请点按 此处

事件序列器是一个强大的框架,使您能够在结构化的动作和触发器序列上构建实时的跨服务器事件和过场动画。更具体地说,此模块帮助您:

  • 通过音频、动画和补间的定时配置,在结构化框架上构建事件或过场动画。
  • 在多个服务器之间过渡多个场景,将复杂的动画和视觉效果与时间线同步。
  • 在事件中查找并预览游戏,以便进行测试和开发。

该框架在 Roblox 事件中经过实战检验,例如 Twenty One Pilots24kGoldn 音乐会,以及许多访问量极高的游戏。

要在可编辑的地方中查看 事件序列器 的实际效果,请查看 Roblox Studio 中的 音乐会 模板。该模板是开发人员创建事件/音乐会并熟悉各种功能和组件的全面起点。

模块使用

安装

要在游戏中使用 事件序列器 框架:

  1. 从 Studio 的 窗口 菜单或 主页 选项卡工具栏中,打开 工具箱 并选择 创作者商店 选项卡。

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

  3. 找到并单击 瓦片。

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

  5. 资源管理器 窗口中,将整个 事件序列器 模型移动到 ServerScriptService 中。运行游戏时,模块将开始运行。

框架模式

替换模式

默认的框架模式是 替换模式,在该模式下,您通过将 3D 对象地形光照属性环境效果 和用户界面对象放入该场景的 环境 文件夹中来设计独特的 场景。当场景加载时,这些对象和属性将分配到 WorkspaceTerrainLighting 中,替换 现有对象/属性以形成克隆空间。

内联模式

另一种框架模式是 内联模式,在该模式下,您同样设计独特的 场景,并为其流/事件编写脚本逻辑,但框架 不会 销毁现有的 3D 对象地形光照属性环境效果 和用户界面对象,以便在加载时从场景的 环境 文件夹克隆资产/属性。

要启用内联模式:

  1. 在您放置在 ServerScriptService 中的 事件序列器 模型内,深入并选择 ReplicatedStorage 文件夹中的 Inline 值。

  2. 属性 窗口中,启用其 复选框。

创建场景

场景 本质上是整体事件或过场动画的一部分,封装在一系列文件夹中。每个场景包含定义其流/事件的脚本逻辑,并且场景可以存储其自己的 3D 对象地形光照属性环境效果 和用户界面对象。

要快速入门,您可以在模块的主文件夹中找到一个空场景:

  1. 展开 事件序列器 文件夹并找到 BlankScene 文件夹。

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

时间长度

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

环境

场景的 环境 文件夹包含用户看到和听到的所有内容,包括 3D 对象地形光照属性环境效果,以及用户界面对象。当场景加载时,这些对象和属性将分配到 WorkspaceTerrainLighting 中,替换现有对象/属性以形成克隆空间。

环境 文件夹包含以下容器:

容器描述
客户端包含任何用户(客户端)加入事件时加载的所有资产,例如用户界面对象或动画装置。
玩家生成点包含用户加入时生成的部件。此文件夹中的任何部件的行为类似于 SpawnLocation
服务器包含在服务器上首次创建场景时加载的所有资产。建议大多数视觉资产放在这里。
地形包含场景地形。
光照包含全局 光照属性 作为属性,以及 大气效果后期处理 效果等修饰符。

事件

场景的 事件 文件夹纯粹是 RemoteEvents 的占位符,用于在 客户端服务器 模块之间进行通信。将任何内容放入此文件夹并不是必需的。

客户端

此脚本在客户端执行 模式 逻辑。

服务器

此脚本在服务器上执行 模式 逻辑。

场景模式

场景的 模式 定义了在场景时间线的什么时刻发生什么。您应该在其 客户端服务器 模块中定义场景的模式,并包含 生命周期钩子 以管理 配置 何时发生。

生命周期钩子

模式 生命周期钩子 让您管理场景操作何时发生。生产中的场景通常会以最简单的流程运行:

OnRun 在查找时可能会被中断:

如果场景被重播,所有三个钩子也可以重复:

配置

模式 配置 定义场景的核心操作,例如在 00:32 播放 音频、排队与该音频同步的 动画、安排场景事件(如烟花表演)等。每个配置支持某些回调函数,其中第一个参数(self)是配置实例。

查找场景

事件序列器 的一个独特功能是能够像查找视频一样在场景之间“查找”。在 替换模式 中,您还可以在场景之间切换,以在将其部署到生产之前预览整个多场景事件。

场景查找并非对所有人可用,因为仅仅享受事件的用户不应有能力控制其时间流。相反,您必须根据事件的 PlaceId 以及特定的 UserIds 和/或 及其内部角色授予查找权限。

  1. ServerScriptService 中创建一个新的 Script

  2. 将以下代码粘贴到新脚本中。

    脚本 - 设置查找权限
    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
    EventSequencer.setSeekingPermissions({
    placeIDs = {},
    userIDs = {},
    groups = {
    {GroupID = , MinimumRankID = },
    }
    })
  3. setSeekingPermissions 调用中填写以下表格:

    placeIDs以逗号分隔的 PlaceId 值列表,以支持查找。
    userIDs以逗号分隔的 UserIds 列表,表示可以在支持的地方查找的用户。
    groups以逗号分隔的表格列表,每个表格包含一个 ID 和该组成员可以在支持的地方查找的最低等级。

场景管理器插件

场景管理器 插件是一个有用的工具,用于加载和卸载场景、光照地形。除非您使用 内联模式,否则强烈建议您使用此插件,而不是手动放置/编辑场景对象和属性。

要安装插件:

  1. 从 Studio 的 窗口 菜单或 主页 选项卡工具栏中,打开 工具箱

  2. 在选定 创作者商店 选项卡的情况下,从下拉菜单中选择 插件

  3. 在搜索字段中输入 场景管理器 并按 Enter 查找插件。

  4. 单击插件的图标以查看其详细信息,然后单击 安装 按钮。

  5. 插件安装后,它将出现在 Studio 的 插件 选项卡中。

加载和卸载场景

创建场景 中所述,场景的 环境 文件夹包含用户看到和听到的所有内容,包括 3D 对象。该插件帮助您快速将场景的资产加载到工作区中的有组织文件夹中或从中卸载。

插件操作描述
加载客户端如果场景的客户端内容已卸载,则将其 环境/客户端 文件夹移动到 工作区/场景客户端 文件夹中。
加载服务器如果场景的服务器内容已卸载,则将其 环境/服务器 文件夹移动到 工作区/场景服务器 文件夹中。
卸载客户端如果场景的客户端内容已加载,则将其 客户端 文件夹从 工作区/场景客户端 移回 [场景]/环境 文件夹。
卸载服务器如果场景的服务器内容已加载,则将其 服务器 文件夹从 工作区/场景服务器 移回 [场景]/环境 文件夹。
卸载所有场景将每个加载的场景的 客户端服务器 文件夹移回其 环境 文件夹。

保存和加载光照

顶级的 Lighting 服务存储地方的所有光照属性和视觉效果。由于它是顶级服务,您无法手动将其移动到特定场景的 环境/服务器环境/客户端 文件夹中。相反,您可以利用插件将其属性和子项复制到场景的 环境/光照 文件夹中。

  1. 通过顶级的 Lighting 服务配置场景的 光照属性后期处理 效果、大气效果天空盒

  2. 场景管理器 插件窗口中,单击所需场景的 保存光照

  3. 选择并展开该场景的 环境/光照 配置,您将看到与文件夹的 属性 相同的光照属性,以及顶级 Lighting 服务的克隆子项。

    克隆实例
    保存的属性

    一旦为场景保存了光照属性和子项,您可以通过单击插件窗口中的 加载光照 快速将它们加载回顶级的 Lighting 服务。

保存和加载地形

由于 TerrainWorkspace 中的顶级类,您无法手动将生成或雕刻的地形移动到特定场景的 环境/服务器环境/客户端 文件夹中。相反,您可以利用插件将其复制到场景的 环境/地形 文件夹中。

  1. 通过顶级 地形 服务配置场景的地形。

  2. 场景管理器 插件窗口中,单击所需场景的 保存地形

  3. 选择并展开该场景的 环境/地形 文件夹,您将看到一个 TerrainRegion 对象,表示保存的地形。

    一旦为场景保存了地形,您可以通过单击插件窗口中的 加载地形 快速将其加载回顶级的 Terrain 服务。

API 参考

模式生命周期钩子

OnSetup

OnSetup 生命周期钩子旨在初始化将在 OnRunOnEndScene 中引用的资产和变量,设置 连接,这些连接旨在在场景持续期间保持等。此钩子接收 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)
end
服务器模式
local 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)
end

OnRun

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
})
end

OnEndScene

OnEndScene 生命周期钩子对于清理场景中任何未完成的内容非常有用,例如断开在 OnSetupOnRun 中创建的连接,这些连接在场景持续期间保持。

服务器模式
Schema.OnEndScene = function()
print("OnEndScene (服务器)")
if partColorConnection then
partColorConnection:Disconnect()
partColorConnection = nil
end
end

模式配置

audio

在工作区中创建一个 Sound 对象,该对象在特定时间播放。音频将在场景结束后或 Sound 对象播放完毕后被删除。

配置键描述
StartTime在场景持续时间内播放音频的时间,以秒为单位。
SoundId要播放的音频的资产 ID。
OnStart音频开始播放时触发的自定义函数。
OnEnd音频播放结束时触发的自定义函数。
VolumeSound 对象的音量;默认值为 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
})
end

animate

创建一个在特定时间播放的 Animation

配置键描述
StartTime在场景持续时间内播放动画的时间,以秒为单位。
EndTime可选的结束动画的时间,以秒为单位,关系到场景的持续时间。
Rig播放动画的动画装置。
AnimationId要播放的动画的资产 ID。
Speed动画的播放速度;默认值为 1。
FadeInTime动画淡入的时间,以秒为单位;默认值为 0.2(秒)。
FadeOutTime动画淡出的时间,以秒为单位;默认值为 0.2(秒)。
OnStart动画开始播放时触发的自定义函数。
OnEnd动画播放结束时触发的自定义函数。
Looped是否循环播放动画;默认值为 false
SyncToAudio定义是否将动画与 音频 配置同步的表。接受以下键:
  • Audio – 对应的 音频 配置。
  • StartAtAudioTime – 在音频持续时间内播放动画的时间。
  • EndAtAudioTime – 可选的结束动画的时间,以音频的持续时间为准。
客户端模式
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
})
end

tween

创建一个可配置的 Tween,在查找和动态加入时保留,这意味着您可以在不同的时间点链接补间,并且一切都应按预期播放和同步。

配置键描述
StartTimes与场景持续时间相关的开始时间表,以秒为单位。
Tween定义要补间的对象和属性的表。接受以下键:
OnStart补间开始播放时触发的自定义函数。
OnHeartbeat在每个 Heartbeat 上触发的自定义函数;接收补间 alpha 作为第二个参数。
OnEnd补间播放结束时触发的自定义函数。
SyncToAudio定义是否将补间与 音频 配置同步的表。接受以下键:
  • Audio – 对应的 音频 配置。
  • StartAtAudioTimes – 定义在音频持续时间内播放补间的开始时间的表。
客户端模式
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,
})
end

interval

在指定的持续时间内以指定的频率(以秒为单位)执行自定义回调函数。适用于重复事件,例如闪烁的灯光、脉冲音频的强度等。最低频率为 0 秒,但技术上最低频率始终限制为 Heartbeat

配置键描述
StartTime在场景持续时间内的间隔持续时间开始时间,以秒为单位。
EndTime在场景持续时间内的间隔持续时间结束时间,以秒为单位。
FrequencyOnInterval 函数应触发的频率,以秒为单位,第一次执行在 StartTime
OnStart一系列间隔开始时触发的自定义函数。
OnInterval在指定持续时间内(StartTimeEndTime)的每个间隔触发的自定义函数。
OnEnd一系列间隔结束时触发的自定义函数。
SyncToAudio定义是否将间隔持续时间与 音频 配置同步的表。接受以下键:
  • Audio – 对应的 音频 配置。
  • StartAtAudioTime – 在音频持续时间内开始间隔持续时间的时间。
  • EndAtAudioTime – 可选的结束间隔持续时间的时间,以音频的持续时间为准。
客户端模式
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,
})
end

schedule

类似于 interval,但您可以为同一事件定义多个特定的开始时间,例如在场景中安排两次烟花表演。

配置键描述
StartTimes与场景持续时间相关的开始时间表,以秒为单位。
OnStartStartTimes 表中每个指定时间触发的自定义函数。
Skippable布尔值,定义是否可以跳过计划事件,适用于晚到的用户或在计划开始时间之前查找时。如果设置为 false,则在加入/查找时间之前安排的所有事件开始时间将在该加入/查找时间发生。如果设置为 true,则仅在加入/查找之后安排的开始时间将发生。默认值为 false
SyncToAudio定义是否将计划与 音频 配置同步的表。接受以下键:
  • Audio – 对应的 音频 配置。
  • StartAtAudioTimes – 定义在音频持续时间内触发 OnStart 函数的开始时间的表。
客户端模式
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
})
end

inform

通知框架任何在 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
    模块脚本 - CustomModule
    local RunService = game:GetService("RunService")
    local CustomModule = {}
    CustomModule.init = function()
    -- 初始化心跳连接
    CustomModule.connection = RunService.Heartbeat:Connect(function()
    end)
    end
    CustomModule.clean = function()
    -- 断开并清除心跳连接
    if CustomModule.connection then
    CustomModule.connection:Disconnect()
    CustomModule.connection = nil
    end
    end
    return 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 (客户端)")
end

seek

seek(time: number)

从当前加载的场景的开始查找到 time 值,以秒为单位。

脚本
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
EventSequencer.seek(95.58)

setSceneWarningTime

setSceneWarningTime(endSceneTimeWindow: number)

设置从所有场景 结束 的时间开始发送警告的时间。您可以通过 onSceneEndingWarningForClientonSceneEndingWarningForServer 在客户端或服务器端检测到警告。

脚本
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)
end
服务器模式
local 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)
end

getCurrentServerEnvironmentFromClient

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)
end

isLoadingScene

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 中连接。

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 中连接。

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)
©2026 Roblox Corporation、Roblox、Roblox 标志及 Powering Imagination 是我们在美国及其他国家或地区的注册与未注册商标。