事件序列器

*此內容是使用 AI(Beta 測試版)翻譯,可能含有錯誤。若要以英文檢視此頁面,請按一下這裡

事件序列器是一個強大的框架,使您能夠在結構化的動作和觸發器序列上構建即時的跨伺服器事件和過場動畫。更具體地說,這個模組幫助您:

  • 通過音頻、動畫和過渡的計劃配置,在結構化的框架上構建事件或過場動畫。
  • 在多個伺服器之間轉換多個場景,將複雜的動畫和視覺效果同步到時間線。
  • 在事件中尋找並預覽遊戲以進行測試和開發。

這個框架在 Roblox 事件中經過實戰考驗,例如 Twenty One Pilots24kGoldn 音樂會,以及許多高訪問量的遊戲。

要在可編輯的地方中查看 事件序列器 的實際運作,請查看 Roblox Studio 中的 音樂會 模板。這個模板是開發者創建事件/音樂會的全面起點,並使他們熟悉各種功能和組件。

模組使用

安裝

要在遊戲中使用 事件序列器 框架:

  1. 從 Studio 的 視窗 菜單或 首頁 標籤工具欄中,打開 工具箱 並選擇 創作者商店 標籤。

  2. 確保選擇了 模型 排序,然後點擊 查看所有 按鈕以查看 類別

  3. 找到並點擊 磚塊。

  4. 找到 事件序列器 模組並點擊它,或將其拖放到 3D 視圖中。

  5. 資源管理器 窗口中,將整個 事件序列器 模型移動到 ServerScriptService。運行遊戲時,模組將開始運行。

框架模式

替換模式

默認的框架模式是 替換模式,在此模式下,您通過將 3D 物件地形照明屬性環境效果 和用戶界面物件放入該場景的 環境 文件夾中來設計獨特的 場景。當場景加載時,這些物件和屬性將分配到 WorkspaceTerrainLighting替換 現有的物件/屬性以形成克隆空間。

行內模式

另一種框架模式是 行內模式,在此模式下,您同樣設計獨特的 場景,並為其流程/事件編寫腳本邏輯,但框架將 銷毀現有的 3D 物件地形照明屬性環境效果 和用戶界面物件,以便在加載時從場景的 環境 文件夾克隆資產/屬性。

要啟用行內模式:

  1. 在您放置在 ServerScriptService 中的 事件序列器 模型內,深入並選擇 行內 值,該值位於 ReplicatedStorage 文件夾內。

  2. 屬性 窗口中,打開其 復選框。

創建場景

場景 本質上是整體事件或過場動畫的一部分,包裹在一系列文件夾中。每個場景包含定義其流程/事件的腳本邏輯,並且場景可以存儲自己的 3D 物件地形照明屬性環境效果 和用戶界面物件。

要快速入門,您可以在模組的主文件夾中找到一個空場景:

  1. 展開 事件序列器 文件夾並找到 空白場景 文件夾。

  2. 將整個 空白場景 文件夾移動或複製到 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 生命週期鉤子中創建的模組、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
  • OnRun 生命週期鉤子中初始化連接或其他引用的 ModuleScript 中調用自定義“清理”函數。

    伺服器架構
    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),則框架將在請求的 20 秒之外再等待 5 秒,於是場景將在 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 是我們在美國及其他國家地區的部分註冊與未註冊商標。