事件序列器

*此內容是使用 AI(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,該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 生命週期掛鈎中創建的模組、用戶介面物件、連接等,確保當 尋找 時會被正確清理。用例包括:

  • 通知框架如 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
    ModuleScript - 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 PM 時精確調用 loadScene("[SceneName]", 20),框架將再等 5 秒外加請求的 20 秒,於是場景會在 4:15:25 PM 開始播放。

腳本

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 是我們在美國及其他國家地區的部分註冊與未註冊商標。