ตัวจัดลำดับเหตุการณ์ เป็นเฟรมเวิร์กที่ทรงพลังซึ่งช่วยให้คุณสร้างเหตุการณ์สดที่ข้ามเซิร์ฟเวอร์และฉากตัดต่อจากลำดับของการกระทำและทริกเกอร์ที่มีโครงสร้าง โดยเฉพาะโมดูลนี้ช่วยคุณ:
- สร้างเหตุการณ์หรือฉากตัดต่อบนเฟรมเวิร์กที่มีโครงสร้างผ่านการกำหนดค่าตามกำหนดการของเสียง, การ์ตูนเคลื่อนไหว, และการเปลี่ยนแปลง
- เปลี่ยนผ่านหลายฉากในหลายเซิร์ฟเวอร์ พร้อมซิงโครไนซ์การ์ตูนเคลื่อนไหวและภาพที่ซับซ้อนตามไทม์ไลน์
- ค้นหาเหตุการณ์และดูตัวอย่างประสบการณ์เพื่อการทดสอบและพัฒนา
เฟรมเวิร์กนี้ได้รับการทดสอบในเหตุการณ์ Roblox เช่น คอนเสิร์ตของ Twenty One Pilots และ 24kGoldn รวมถึงประสบการณ์ที่มีผู้เข้าชมสูงมากมาย
เพื่อดู ตัวจัดลำดับเหตุการณ์ ในการทำงานภายในสถานที่ที่แก้ไขได้ โปรดตรวจสอบ เทมเพลตคอนเสิร์ต ใน Roblox Studio เทมเพลตนี้เป็นจุดเริ่มต้นที่ครอบคลุมสำหรับนักพัฒนาในการสร้างเหตุการณ์/คอนเสิร์ตและทำความคุ้นเคยกับฟีเจอร์และคอมโพเนนต์ต่าง ๆ ที่เกี่ยวข้อง

การใช้งานโมดูล
การติดตั้ง
ในการใช้เฟรมเวิร์ก ตัวจัดลำดับเหตุการณ์ ในประสบการณ์:
จากเมนู Window ของ Studio หรือแถบเครื่องมือ Home ให้เปิด Toolbox และเลือกแท็บ Creator Store

ตรวจสอบให้แน่ใจว่าได้เลือกการจัดเรียง Models จากนั้นคลิกที่ปุ่ม See All ในหมวดหมู่ Categories

ค้นหาและคลิกที่บล็อก Packages
ค้นหาโมดูล ตัวจัดลำดับเหตุการณ์ และคลิกที่มัน หรือลากแล้วปล่อยมันลงในมุมมอง 3D

ในหน้าต่าง Explorer ให้ย้ายโมเดล ตัวจัดลำดับเหตุการณ์ ทั้งหมดไปยัง ServerScriptService เมื่อประสบการณ์ทำงาน โมดูลจะเริ่มทำงาน
โหมดเฟรมเวิร์ก
โหมดแทนที่
โหมดเฟรมเวิร์กเริ่มต้นคือ โหมดแทนที่ ซึ่งคุณสามารถออกแบบ ฉาก ที่ไม่เหมือนใครโดยการวาง วัตถุ 3D, ภูมิทัศน์, คุณสมบัติการตั้งค่าแสง, เอฟเฟกต์สิ่งแวดล้อม, และวัตถุส่วนติดต่อผู้ใช้ลงในโฟลเดอร์ Environment ของฉากนั้น เมื่อมีการโหลดฉาก วัตถุและคุณสมบัติเหล่านั้นจะถูกแจกจ่ายไปยัง Workspace, Terrain, และ Lighting, แทนที่ วัตถุ/คุณสมบัติที่มีอยู่เพื่อสร้างสเปซที่ถูกจำลอง
โหมดแบบในบรรทัด
โหมดเฟรมเวิร์กที่เป็นทางเลือกคือ โหมดแบบในบรรทัด ซึ่งในลักษณะเดียวกันคุณสามารถออกแบบฉากที่ไม่เหมือนใครโดยมีตรรกะสคริปต์สำหรับการไหล/เหตุการณ์ของพวกเขา แต่เฟรมเวิร์กจะ ไม่ ทำลาย วัตถุ 3D, ภูมิทัศน์, คุณสมบัติการตั้งค่าแสง, เอฟเฟกต์สิ่งแวดล้อม, และวัตถุส่วนติดต่อผู้ใช้เพื่อจำลองทรัพย์สิน/คุณสมบัติจากโฟลเดอร์ Environment ของฉากเมื่อโหลด
เพื่อเปิดใช้งานโหมดแบบในบรรทัด:
ภายในโมเดล ตัวจัดลำดับเหตุการณ์ ที่คุณวางไว้ใน ServerScriptService ให้เจาะลึกและเลือกค่า Inline ในโฟลเดอร์ ReplicatedStorage

ในหน้าต่าง Properties ให้เปิดใช้งานช่องทำเครื่องหมาย Value

สร้างฉาก
ฉาก เป็นส่วนหนึ่งของเหตุการณ์ทั้งหมดหรือฉากตัดต่อที่ถูกห่อหุ้มในชุดของโฟลเดอร์แต่ละชุด ฉากแต่ละชุดมีตรรกะสคริปต์ที่กำหนดการไหล/เหตุการณ์ของมัน และฉากสามารถเก็บ วัตถุ 3D, ภูมิทัศน์, คุณสมบัติการตั้งค่าแสง, เอฟเฟกต์สิ่งแวดล้อม, และวัตถุส่วนติดต่อผู้ใช้เฉพาะ
เพื่อเริ่มต้นอย่างรวดเร็ว คุณสามารถค้นหาฉากว่างเปล่าภายในโฟลเดอร์หลักของโมดูล:
ขยายโฟลเดอร์ ตัวจัดลำดับเหตุการณ์ และค้นหาโฟลเดอร์ BlankScene

ย้ายหรือคัดลอกโฟลเดอร์ BlankScene ทั้งหมดไปยัง ReplicatedStorage

ความยาวเวลา
ฉากแต่ละฉากควรมี ความยาวเวลา เป็นวินาที ซึ่งกำหนดระยะเวลา ของมัน — เช่นเดียวกับภาพยนตร์หรือคอนเสิร์ตที่มีระยะเวลาที่ตั้งไว้ ความยาวเวลาถูกกำหนดเป็น attribute หมายเลขในโฟลเดอร์ของฉากที่ชื่อว่า TimeLength ซึ่งคุณสามารถตั้งค่าโดยตรงใน Studio หรือผ่าน Instance:SetAttribute()


สภาพแวดล้อม
โฟลเดอร์ Environment ของฉากประกอบด้วยทุกสิ่งที่ผู้ใช้เห็นและได้ยิน รวมถึง วัตถุ 3D, ภูมิทัศน์, คุณสมบัติการตั้งค่าแสง และ เอฟเฟกต์สิ่งแวดล้อม และวัตถุส่วนติดต่อผู้ใช้ เมื่อมีการโหลดฉาก วัตถุและคุณสมบัติเหล่านั้นจะถูกแจกจ่ายไปยัง Workspace, Terrain, และ Lighting แทนที่วัตถุ/คุณสมบัติที่มีอยู่เพื่อสร้างพื้นที่ที่ถูกจำลอง
โฟลเดอร์ Environment ประกอบด้วยตัวเก็บข้อมูลดังต่อไปนี้:
| ตัวเก็บข้อมูล | คำอธิบาย |
|---|---|
| Client | ประกอบด้วยทรัพย์สินทั้งหมดที่โหลดเมื่อผู้ใช้ (ลูกค้า) เข้าร่วมเหตุการณ์ เช่น วัตถุส่วนติดต่อผู้ใช้หรืออุปกรณ์การเคลื่อนไหว |
| PlayerSpawns | ประกอบด้วยส่วนที่ผู้ใช้เกิดเมื่อเข้าร่วม ส่วนใดใดในโฟลเดอร์นี้ทำงานคล้ายกับ SpawnLocation |
| Server | ประกอบด้วยทรัพย์สินทั้งหมดที่จะโหลดเมื่อฉากถูกสร้างขึ้นครั้งแรกในเซิร์ฟเวอร์ แนะนำให้มีทรัพย์สินที่มองเห็นได้ส่วนใหญ่ที่นี่ |
| Terrain | ประกอบด้วยภูมิทัศน์ของฉาก |
| Lighting | ประกอบด้วย คุณสมบัติการตั้งค่าแสง ทั่วไปในลักษณะของ attributes รวมถึงตัวบ่งชี้ต่าง ๆ เช่น เอฟเฟกต์บรรยากาศ และ การประมวลผลหลัง |
เหตุการณ์
โฟลเดอร์ Events ของฉากเป็นเพียงที่ว่างสำหรับ RemoteEvents ที่สื่อสารระหว่าง Client และ Server โมดูล ไม่จำเป็นต้องวางสิ่งใดลงในโฟลเดอร์นี้
Client
สคริปต์นี้ทำให้ตรรกะ schema ทำงานบนลูกค้า
Server
สคริปต์นี้ทำให้ตรรกะ schema ทำงานบนเซิร์ฟเวอร์
Schema ของฉาก
Schema ของฉากกำหนดสิ่งที่จะเกิดขึ้นในช่วงเวลาที่กำหนดในไทม์ไลน์ของฉาก คุณควรกำหนด schema ของฉากในโมดูล Client และ Server ของมันและรวม lifecycle hooks เพื่อจัดการว่าการ กำหนดค่า จะเกิดขึ้นเมื่อใด
lifecycle hooks
schema lifecycle hooks ช่วยให้คุณจัดการได้เมื่อการดำเนินการของฉากเกิดขึ้น ฉากในสภาพผลิตจะทำงานในลำดับที่ง่ายที่สุด:
OnRun อาจถูกหยุดชั่วคราวเมื่อค้นหา:
hooks ทั้งสามสามารถทำซ้ำได้หากฉากถูกเล่นซ้ำ:
กำหนดค่า
schema configurations กำหนดการดำเนินการหลักของฉาก เช่น เล่นเสียง ที่ 00:32, การจัดคิว การ์ตูนเคลื่อนไหว เพื่อซิงโครไนซ์กับเสียงนั้น, กำหนดเหตุการณ์ในฉาก เช่นการแสดงดอกไม้ไฟ และอื่น ๆ ทุกการกำหนดค่าครอบคลุมฟังก์ชันการเรียกกลับบางอย่าง โดยที่พารามิเตอร์แรก (self) คืออินสแตนซ์ของการกำหนดค่า
ค้นหาฉาก
ฟีเจอร์หลักของ ตัวจัดลำดับเหตุการณ์ คือความสามารถในการ "ค้นหา" ฉากเช่นเดียวกับที่คุณอาจค้นผ่านวิดีโอ ใน โหมดแทนที่ คุณยังสามารถเปลี่ยนระหว่างฉากเพื่อดูตัวอย่างเหตุการณ์หลายฉากทั้งหมดก่อนที่จะนำไปใช้งานจริง
การค้นหาฉากไม่สามารถเข้าถึงทุกคนได้ เนื่องจากผู้ใช้ที่เพียงแค่สนุกกับเหตุการณ์ไม่ควรมีความสามารถในการควบคุมการไหลของเวลา อย่างไรก็ตาม คุณต้องมอบสิทธิ์ในการค้นหาตาม PlaceId ของเหตุการณ์ เช่นเดียวกับ UserIds ที่เฉพาะเจาะจงและ/หรือ กลุ่ม และบทบาทภายในพวกเขา
สร้าง Script ใหม่ภายใน ServerScriptService
วางโค้ดต่อไปนี้ลงไปในสคริปต์ใหม่
Script - ตั้งค่าสิทธิ์การค้นหาlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))EventSequencer.setSeekingPermissions({placeIDs = {},userIDs = {},groups = {{GroupID = , MinimumRankID = },}})เติมข้อมูลในตารางต่อไปนี้ภายในการเรียก setSeekingPermissions ดังนี้:
placeIDs รายการที่คั่นด้วยเครื่องหมายจุลภาคของค่าที่ PlaceId เพื่อรองรับการค้นหา userIDs รายการที่คั่นด้วยเครื่องหมายจุลภาคของ UserIds สำหรับผู้ที่สามารถค้นหา ณ สถานที่ที่รองรับได้ groups รายการที่คั่นด้วยเครื่องหมายจุลภาคของตาราง ที่แต่ละตารางมี ID ของ กลุ่ม และอันดับต่ำสุดของสมาชิกในกลุ่มที่สามารถค้นหาได้ในสถานที่ที่รองรับ
ปลั๊กอินตัวจัดการฉาก
ปลั๊กอิน ตัวจัดการฉาก เป็นเครื่องมือที่มีประโยชน์สำหรับการโหลดและอัปโหลดฉาก แสง และ ภูมิทัศน์ เว้นแต่คุณกำลังใช้ โหมดแบบในบรรทัด แนะนำให้ใช้ปลั๊กอินนี้แทนการวาง/แก้ไขวัตถุและคุณสมบัติของฉากด้วยตนเอง
ในการติดตั้งปลั๊กอิน:
จากเมนู Window ของ Studio หรือแถบเครื่องมือ Home ให้เปิด Toolbox
เมื่อเลือกแท็บ Creator Store ให้เลือก Plugins จากเมนูดรอปดาวน์
ในช่องค้นหา พิมพ์ ตัวจัดการฉาก และกด Enter เพื่อค้นหาปลั๊กอิน

คลิกที่ไอคอนของปลั๊กอินเพื่อดูรายละเอียดแล้วคลิกที่ปุ่ม ติดตั้ง
เมื่อปลั๊กอินติดตั้งแล้ว จะปรากฏในแท็บ Plugins ของ Studio
โหลดและอัปโหลดฉาก
ตามที่ได้ชี้แจงใน การสร้างฉาก โฟลเดอร์ Environment ของฉากประกอบด้วยทุกสิ่งที่ผู้ใช้เห็นและได้ยิน รวมถึง วัตถุ 3D ปลั๊กอินช่วยให้คุณโหลดทรัพย์สินของฉากไปยังหรือออกจากโฟลเดอร์ที่จัดเรียงภายในพื้นที่ทำงานได้อย่างรวดเร็ว
| การกระทำของปลั๊กอิน | คำอธิบาย |
|---|---|
| โหลดลูกค้า | หากเนื้อหาลูกค้าของฉากไม่ถูกโหลด จะย้ายโฟลเดอร์ Environment/Client ของมันไปยัง Workspace/ScenesClient |
| โหลดเซิร์ฟเวอร์ | หากเนื้อหาเซิร์ฟเวอร์ของฉากไม่ถูกโหลด จะย้ายโฟลเดอร์ Environment/Server ของมันไปยัง Workspace/ScenesServer |
| อัปโหลดลูกค้า | หากเนื้อหาลูกค้าของฉากถูกโหลด จะย้ายโฟลเดอร์ Client จาก Workspace/ScenesClient กลับไปยังโฟลเดอร์ [Scene]/Environment |
| อัปโหลดเซิร์ฟเวอร์ | หากเนื้อหาเซิร์ฟเวอร์ของฉากถูกโหลด จะย้ายโฟลเดอร์ Server จาก Workspace/ScenesServer กลับไปยังโฟลเดอร์ [Scene]/Environment |
| อัปโหลดฉากทั้งหมด | ย้ายโฟลเดอร์ Client และ Server ของฉากที่โหลดไปกลับยังโฟลเดอร์ Environment |
บันทึกและโหลดแสง
บริการ Lighting ระดับสูงเก็บคุณสมบัติการตั้งค่าแสงและเอฟเฟกต์ภาพทั้งหมดของสถานที่ เนื่องจากเป็นบริการระดับสูง คุณจึงไม่สามารถย้ายมันไปยังโฟลเดอร์ Environment/Server หรือ Environment/Client ของฉากเฉพาะได้ แทนที่คุณสามารถใช้ปลั๊กอินเพื่อคัดลอกคุณสมบัติและลูกของมันไปยังโฟลเดอร์ Environment/Lighting ของฉาก
กำหนด คุณสมบัติการตั้งค่าแสง, เอฟเฟกต์การประมวลผลหลัง, เอฟเฟกต์บรรยากาศ, และ พื้นผิวฟ้า ของฉากผ่านบริการ Lighting ระดับสูง

ในหน้าต่างปลั๊กอิน ตัวจัดการฉาก ให้คลิก บันทึกแสง สำหรับฉากที่ต้องการ
เลือกและขยายคุณสมบัติ Environment/Lighting ของฉากนั้นและคุณจะเห็นคุณสมบัติการตั้งค่าแสงเดียวกันเป็น attributes ของโฟลเดอร์ รวมถึงลูกที่ถูกจำลองจากบริการ Lighting ระดับสูง

ตัวอย่างที่จำลอง 
คุณสมบัติที่บันทึกแล้ว เมื่อลักษณะแสงและเด็กถูกบันทึกสำหรับฉากแล้ว คุณสามารถโหลดพวกเขากลับเข้าสู่บริการ Lighting ระดับสูงได้อย่างรวดเร็วโดยคลิก โหลดแสง จากหน้าต่างปลั๊กอิน
บันทึกและโหลดภูมิทัศน์
เนื่องจาก Terrain เป็นคลาสระดับสูงใน Workspace คุณจึงไม่สามารถย้ายภูมิทัศน์ที่สร้างขึ้นหรือปั่นออกไปยังโฟลเดอร์ Environment/Server หรือ Environment/Client ของฉากเฉพาะได้ แทนที่คุณสามารถใช้ปลั๊กอินเพื่อคัดลอกมันไปยังโฟลเดอร์ Environment/Terrain ของฉาก
กำหนดภูมิทัศน์ของฉากผ่านบริการ Terrain ระดับสูง

ในหน้าต่างปลั๊กอิน ตัวจัดการฉาก ให้คลิก บันทึกภูมิทัศน์ สำหรับฉากที่ต้องการ
เลือกและขยายโฟลเดอร์ Environment/Terrain ของฉากนั้นและคุณจะเห็นวัตถุ TerrainRegion ซึ่งเป็นตัวแทนของภูมิทัศน์ที่ถูกบันทึก

เมื่อตัวภูมิทัศน์ถูกบันทึกสำหรับฉาก คุณสามารถโหลดมันกลับเข้าสู่บริการ Terrain ระดับสูงได้อย่างรวดเร็วโดยการคลิก โหลดภูมิทัศน์ จากหน้าต่างปลั๊กอิน
การอ้างอิง API
Lifecycle hooks ของ schema
OnSetup
OnSetup lifecycle hook ถูกตั้งใจเพื่อเริ่มต้นทรัพย์สินและตัวแปรที่จะถูกอ้างอิงใน OnRun หรือ OnEndScene ตั้งค่าการเชื่อมต่อ connections ที่ตั้งใจจะอยู่ตลอดระยะเวลาของฉาก เป็นต้น hook นี้จะรับพารามิเตอร์ timePositionObject ซึ่งทำให้คุณอ่านเวลาในปัจจุบันที่ตั้งขึ้นได้
Client Schema
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 (Client)")
-- เข้าถึงสภาพแวดล้อมของฉาก ไม่สามารถใช้งานได้กับโหมดแบบในบรรทัด
clientEnvironment = EventSequencer.getCurrentSceneEnvironment()
serverEnvironment = EventSequencer.getCurrentServerEnvironmentFromClient()
-- รอทรัพย์สิน
dummy = clientEnvironment:WaitForChild("Dummy")
print("Current time is:", timePositionObject.Value)
end
Server Schema
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 (Server)")
-- เข้าถึงสภาพแวดล้อมของฉาก ไม่สามารถใช้งานได้กับโหมดแบบในบรรทัด
serverEnvironment = EventSequencer.getCurrentSceneEnvironment()
partColorConnection = changePartColorEvent.OnServerEvent:Connect(function(player, changedPart, newColor)
serverEnvironment.changedPart.Color = newColor
end)
print("Current time is:", timePositionObject.Value)
end
OnRun
OnRun เป็น lifecycle hook การดำเนินการหลักภายใน schema ควรมีการตั้งค่าทั้งหมด configurations ที่มีเวลาสำหรับฉาก เช่นการเล่น เสียง หรือ การ์ตูนเคลื่อนไหว ไปจนถึง การกำหนดเหตุการณ์ เช่นการแสดงดอกไม้ไฟ
Client Schema
Schema.OnRun = function()
print("OnRun (Client)")
local MainAudio = Schema:audio({
StartTime = 1,
SoundId = "rbxassetid://1838673350",
OnStart = function(self)
print("Audio playing")
end,
OnEnd = function(self)
print("Audio ended")
end
})
end
OnEndScene
OnEndScene lifecycle hook มีประโยชน์ในการทำความสะอาดสิ่งที่ยังคงอยู่ในฉาก เช่นการตัดการเชื่อมต่อที่สร้างขึ้นใน OnSetup หรือ OnRun ที่ยังมีอยู่ตลอดระยะเวลาของฉาก
Server Schema
Schema.OnEndScene = function()
print("OnEndScene (Server)")
if partColorConnection then
partColorConnection:Disconnect()
partColorConnection = nil
end
end
การกำหนดค่า schema
audio
สร้างวัตถุ Sound ในพื้นที่ทำงานซึ่งเล่นในเวลาที่กำหนด เสียงจะถูกลบหลังจากฉากจบ หรือหลังจากที่วัตถุ Sound เสร็จสิ้นการเล่น
| Configuration Key | คำอธิบาย |
|---|---|
| StartTime | เมื่อใดที่เสียงจะเล่นเกี่ยวกับระยะเวลาของฉาก ในวินาที |
| SoundId | ID ของสินทรัพย์เสียงที่จะเล่น |
| OnStart | ฟังก์ชันที่กำหนดเองที่จะทำงานเมื่อเสียงเริ่มเล่น |
| OnEnd | ฟังก์ชันที่กำหนดเองที่จะทำงานเมื่อเสียงหยุดเล่น |
| Volume | ระดับเสียงของวัตถุ Sound; ค่าเริ่มต้นคือ 0.5 |
Client Schema
Schema.OnRun = function()
print("OnRun (Client)")
local MainAudio = Schema:audio({
StartTime = 1,
SoundId = "rbxassetid://1838673350",
OnStart = function(self)
print("Audio playing")
end,
OnEnd = function(self)
print("Audio ended")
end
})
end
animate
สร้าง Animation ซึ่งเล่นในเวลาที่กำหนด
| Configuration Key | คำอธิบาย |
|---|---|
| StartTime | เมื่อใดที่การ์ตูนเคลื่อนไหวจะเล่นเกี่ยวกับระยะเวลาของฉาก ในวินาที |
| EndTime | ระยะเวลาที่ยุติการ์ตูนเคลื่อนไหวในภายหลังเกี่ยวกับระยะเวลาของฉาก เป็นทางเลือก |
| Rig | การ์ตูนเคลื่อนไหวที่จะเล่น |
| AnimationId | ID ของสินทรัพย์การ์ตูนเคลื่อนไหวที่จะเล่น |
| Speed | ความเร็วในการเล่นการ์ตูนเคลื่อนไหว; ค่าเริ่มต้นคือ 1 |
| FadeInTime | ระยะเวลาในการเข้าเล่นการ์ตูนเคลื่อนไหวในวินาที; ค่าเริ่มต้นคือ 0.2 (วินาที) |
| FadeOutTime | ระยะเวลาในการออกจากการ์ตูนเคลื่อนไหวในวินาที; ค่าเริ่มต้นคือ 0.2 (วินาที) |
| OnStart | ฟังก์ชันที่กำหนดเองที่จะทำงานเมื่อการ์ตูนเคลื่อนไหวเริ่มเล่น |
| OnEnd | ฟังก์ชันที่กำหนดเองที่จะทำงานเมื่อการ์ตูนเคลื่อนไหวหยุดเล่น |
| Looped | ว่าการ์ตูนเคลื่อนไหวจะวนซ้ำหรือไม่; ค่าเริ่มต้นคือ false |
| SyncToAudio | ตารางที่กำหนดว่าจะซิงโครไนซ์การ์ตูนเคลื่อนไหวกับการกำหนด เสียง หรือไม่ ยอมรับคีย์ต่อไปนี้:
|
Client Schema
Schema.OnRun = function()
print("OnRun (Client)")
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("Animation playing")
end,
OnEnd = function(self)
print("Animation stopped")
end
})
end
tween
สร้าง Tween ที่สามารถปรับแต่งได้และถูกเก็บในการค้นหาและในการเข้าร่วมที่มีพลศาสตร์ ซึ่งหมายความว่าคุณสามารถเชื่อมต่อการเปลี่ยนแปลงในจุดต่าง ๆ ในเวลาและทุกอย่างควรเล่นและซิงโครไนซ์ตามที่คาดหวัง
| Configuration Key | คำอธิบาย |
|---|---|
| StartTimes | ตารางของเวลาเริ่มต้นในระยะเวลาที่เกี่ยวข้องกับฉาก ในวินาที |
| Tween | ตารางที่กำหนดวัตถุและคุณสมบัติที่จะเปลี่ยนแปลง ยอมรับคีย์ต่อไปนี้:
|
| OnStart | ฟังก์ชันที่กำหนดเองที่จะทำงานเมื่อการเปลี่ยนแปลงเริ่มเล่น |
| OnHeartbeat | ฟังก์ชันที่กำหนดเองที่จะทำงานในทุก Heartbeat; รับพารามิเตอร์การเปลี่ยนแปลงเป็นพารามิเตอร์ที่สอง |
| OnEnd | ฟังก์ชันที่กำหนดเองที่จะทำงานเมื่อการเปลี่ยนแปลงจบการทำงาน |
| SyncToAudio | ตารางที่กำหนดว่าให้ซิงโครไนซ์การเปลี่ยนแปลงกับการกำหนด เสียง หรือไม่ ยอมรับคีย์ต่อไปนี้:
|
Client Schema
Schema.OnRun = function()
print("OnRun (Client)")
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("Tween playing")
end,
OnHeartbeat = function(self, alpha)
print("Tween alpha", alpha)
end,
OnEnd = function(self)
print("Tween completed")
end,
})
end
interval
ดำเนินการฟังก์ชันการเรียกกลับที่กำหนดเองซ้ำในระยะเวลาที่กำหนดที่ความถี่ที่กำหนด ในวินาที มีประโยชน์สำหรับเหตุการณ์ซ้ำเช่นแสงแฟลช เปลี่ยนความเข้มของเสียง ฯลฯ ความถี่ต่ำสุดที่เป็นไปได้คือ 0 วินาที แต่ทางเทคนิคแล้วความถี่ขั้นต่ำจะถูกจำกัดที่ Heartbeat
| Configuration Key | คำอธิบาย |
|---|---|
| StartTime | จุดเริ่มต้นของระยะเวลาช่วงซึ่งเกี่ยวกับระยะเวลาของฉาก ในวินาที |
| EndTime | สิ้นสุดระยะเวลาช่วงซึ่งเกี่ยวกับระยะเวลาของฉาก ในวินาที |
| Frequency | ความถี่ว่าฟังก์ชัน OnInterval ควรทำงานบ่อยเพียงใด ในวินาที โดยการทำงานครั้งแรกจะอยู่ที่ StartTime |
| OnStart | ฟังก์ชันที่กำหนดเองที่จะทำงานเมื่อชุดช่วงเริ่มต้น |
| OnInterval | ฟังก์ชันที่กำหนดเองที่จะทำงานในทุกช่วงระหว่างระยะเวลาที่กำหนด (StartTime ถึง EndTime) |
| OnEnd | ฟังก์ชันที่กำหนดเองที่จะทำงานเมื่อชุดช่วงสิ้นสุด |
| SyncToAudio | ตารางที่กำหนดว่าให้ซิงโครไนซ์ระยะเวลาช่วงกับการกำหนด เสียง หรือไม่ ยอมรับคีย์ต่อไปนี้:
|
Client Schema
Schema.OnRun = function()
print("OnRun (Client)")
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 ยกเว้นคุณสามารถกำหนดเวลาเริ่มต้นเฉพาะสำหรับเหตุการณ์เดียวกันหลายครั้ง เช่นการจัดตารางการแสดงดอกไม้ไฟสองครั้งในฉากเดียวกัน
| Configuration Key | คำอธิบาย |
|---|---|
| StartTimes | ตารางของเวลาเริ่มต้นในระยะเวลาของฉาก ในวินาที |
| OnStart | ฟังก์ชันที่กำหนดเองที่จะทำงานในทุกช่วงเวลาที่กำหนดในตาราง StartTimes |
| Skippable | ค่าตรรกะที่กำหนดว่างานที่กำหนดสามารถข้ามได้หรือไม่สำหรับผู้ที่เข้าร่วมช้า หรือสำหรับการค้นหาข้างหน้าในช่วงเวลาที่กำหนด ถ้าตั้งค่าเป็น false, เวลาเริ่มทั้งหมดที่จัดตารางก่อนเวลาที่เข้าร่วม/ค้นหาจะเกิดขึ้นในเวลานั้น ถ้าตั้งค่าเป็น true, จะเกิดขึ้นเฉพาะเวลาเริ่มที่จัดตาราง หลังจาก การเข้าร่วม/ค้นหา ค่าดีฟอลต์คือ false. |
| SyncToAudio | ตารางที่กำหนดว่าจะซิงโครไนซ์การกำหนดเวลานั้นกับการกำหนด เสียง หรือไม่ ยอมรับคีย์ต่อไปนี้:
|
Client Schema
Schema.OnRun = function()
print("OnRun (Client)")
Schema:schedule({
StartTimes = {5, 27.25},
OnStart = function(self)
-- เริ่มเชื่อมต่อ heartbeat ชั่วคราว
local tempConnection = RunService.Heartbeat:Connect(function()
end)
-- แจ้งให้เฟรมเวิร์กทราบเกี่ยวกับการเชื่อมต่อ
Schema:inform(tempConnection)
end
})
end
inform
แจ้งให้เฟรมเวิร์กทราบเกี่ยวกับโมดูล, วัตถุ UI, การเชื่อมต่อ เป็นต้น ที่สร้างขึ้นในการเรียกคืน OnRun เพื่อให้มั่นใจว่าพวกมันจะถูกทำความสะอาดเมื่อ ค้นหา กรณีการใช้งานรวมถึง:
การแจ้งให้เฟรมเวิร์กทราบเกี่ยวกับการเชื่อมต่อชั่วคราวเช่น RunService.Heartbeat จึงทำให้การเชื่อมต่อนั้นจะถูกทำความสะอาดเมื่อค้นหาจุดก่อนหน้าของระยะเวลาฉาก
Server SchemaSchema.OnRun = function()print("OnRun (Server)")Schema:schedule({StartTimes = {5},OnStart = function(self)-- เริ่มเชื่อมต่อ heartbeat ชั่วคราวlocal tempConnection = RunService.Heartbeat:Connect(function()end)-- แจ้งให้เฟรมเวิร์กทราบเกี่ยวกับการเชื่อมต่อSchema:inform(tempConnection)end})endการเรียกฟังก์ชัน "การทำความสะอาด" ที่กำหนดเองใน ModuleScript ที่เริ่มต้นการเชื่อมต่อหรืออ้างอิงอื่น ๆ ในระหว่าง OnRun lifecycle hook
Server Schemalocal 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 (Server)")Schema:schedule({StartTimes = {5},OnStart = function(self)-- เรียก "ฟังก์ชัน init" ในโมดูลที่กำหนดcustomModule.init()-- เรียก "ฟังก์ชัน clean" ในโมดูลที่กำหนดในระหว่างการทำความสะอาดฉากSchema:inform(customModule, customModule.clean)end,})endModuleScript - CustomModulelocal RunService = game:GetService("RunService")local CustomModule = {}CustomModule.init = function()-- เริ่มการเชื่อมต่อ heartbeatCustomModule.connection = RunService.Heartbeat:Connect(function()end)endCustomModule.clean = function()-- ตัดการเชื่อมต่อและล้างการเชื่อมต่อ heartbeatif CustomModule.connection thenCustomModule.connection:Disconnect()CustomModule.connection = nilendendreturn CustomModule
ฟังก์ชัน
loadScene
loadScene(sceneName: string, startTime: number ?)
โหลดฉากตาม sceneName โดยทำงานที่เวลา startTime จากจุดเริ่มต้น จะมีช่วง "กรace" 5 วินาทีสำหรับฉากในการโหลดจากเซิร์ฟเวอร์ก่อนที่จะมีการค้นหาและเริ่มทำงาน นั่นหมายความว่าหากคุณเรียก loadScene("[SceneName]", 20) ในเวลา 16:15:00 น. เฟรมเวิร์กจะรอ 5 วินาทีเพิ่มพร้อมช่วงเวลา 20 ส่งผลให้ฉากเริ่มในเวลา 16:15:25 น.
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
-- กลับไปที่ฉาก PreShow
EventSequencer.loadScene("PreShow")
end
end)
createSchema
createSchema(): table
ส่งคืนอินสแตนซ์ของ schema ของฉากเพื่อสร้างตรรกะสำหรับฉาก
Client Schema
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
local Schema = EventSequencer.createSchema()
Schema.OnSetup = function(timePositionObject)
print("OnSetup (Client)")
end
seek
seek(time: number)
ค้นหาไปยังค่าของ time ในวินาทีจากจุดเริ่มต้นของฉากที่โหลดอยู่ในปัจจุบัน
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))EventSequencer.seek(95.58)
setSceneWarningTime
setSceneWarningTime(endSceneTimeWindow: number)
ตั้งค่าระยะเวลาจาก สิ้นสุด ของฉากทั้งหมดที่มีการส่งคำเตือน คุณสามารถตรวจจับคำเตือนนี้ได้ทั้งทางฝั่งลูกค้าผ่าน onSceneEndingWarningForClient หรือทางฝั่งเซิร์ฟเวอร์ผ่าน onSceneEndingWarningForServer
Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- โหลดฉาก
EventSequencer.loadScene("BeautifulScene")
-- ตั้งค่าช่วงเตือน 5 วินาที ก่อนที่ฉากจะสิ้นสุด
EventSequencer.setSceneWarningTime(5)
-- ตรวจจับเมื่อฉากใกล้จะสิ้นสุด
EventSequencer.onSceneEndingWarningForServer:Connect(function()
warn("Scene is about to end!")
end)
setSeekingPermissions
setSeekingPermissions(permissions: table)
มอบหมายสิทธิในการค้นหาตาม PlaceId ของเหตุการณ์ เช่นเดียวกับ UserIds ที่เฉพาะเจาะจงและ/หรือ กลุ่ม และบทบาทภายในพวกเขา ดู ค้นหาและเปลี่ยนฉาก สำหรับข้อมูลเพิ่มเติม
getCurrentSceneEnvironment
getCurrentSceneEnvironment(): Folder (YIELDS)
คืนค่าของ folder Environment ของฉากปัจจุบันฝั่งไคลเอนต์หรือฝั่งเซิร์ฟเวอร์ขึ้นอยู่กับว่าจะระบบเรียกใช้จากสคริปต์ schema Client หรือ Server
Client Schema
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 (Client)")
-- เข้าถึงสภาพแวดล้อมของฉาก ไม่สามารถใช้งานได้กับโหมดแบบในบรรทัด
clientEnvironment = EventSequencer.getCurrentSceneEnvironment()
serverEnvironment = EventSequencer.getCurrentServerEnvironmentFromClient()
print("Current time is:", timePositionObject.Value)
end
Server Schema
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 (Server)")
-- เข้าถึงสภาพแวดล้อมของฉาก ไม่สามารถใช้งานได้กับโหมดแบบในบรรทัด
serverEnvironment = EventSequencer.getCurrentSceneEnvironment()
partColorConnection = changePartColorEvent.OnServerEvent:Connect(function(player, changedPart, newColor)
serverEnvironment.changedPart.Color = newColor
end)
end
getCurrentServerEnvironmentFromClient
getCurrentServerEnvironmentFromClient(): Folder (YIELDS)
คืนค่าของ folder Environment ของฉากปัจจุบัน ฝั่งเซิร์ฟเวอร์ คุณสามารถเรียกใช้จากสคริปต์ schema Client
Client Schema
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 (Client)")
-- เข้าถึงสภาพแวดล้อมของฉาก ไม่สามารถใช้งานได้กับโหมดแบบในบรรทัด
clientEnvironment = EventSequencer.getCurrentSceneEnvironment()
serverEnvironment = EventSequencer.getCurrentServerEnvironmentFromClient()
print("Current time is:", timePositionObject.Value)
end
isLoadingScene
isLoadingScene(): boolean
เรียกใช้จากเซิร์ฟเวอร์เพื่อให้ทราบว่าฉากกำลังทำการโหลดอยู่
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))print(EventSequencer.isLoadingScene())while EventSequencer.isLoadingScene() dotask.wait()endprint("Scene loaded")
เหตุการณ์
onSceneEndingWarningForClient
เกิดขึ้นในฝั่งลูกค้าก่อนที่ฉากจะสิ้นสุด เวลาเริ่มต้นค่าเริ่มต้นคือ 3 วินาที แต่คุณสามารถกำหนดค่าได้ผ่าน setSceneWarningTime เหตุการณ์นี้สามารถเชื่อมต่อได้เฉพาะใน LocalScript
LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- ตรวจจับเมื่อฉากใกล้จะสิ้นสุด (ฝั่งลูกค้า)
EventSequencer.onSceneEndingWarningForClient:Connect(function()
warn("Scene is about to end!")
end)
onSceneEndingWarningForServerเกิดเหตุการณ์ขึ้นที่เซิร์ฟเวอร์ก่อนที่ฉากจะสิ้นสุด เวลาเริ่มต้นคือ 3 วินาที แต่คุณสามารถกำหนดค่าผ่าน setSceneWarningTime ได้ เหตุการณ์นี้สามารถเชื่อมต่อได้ใน Script
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
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)