ตัวจัดลำดับเหตุการณ์ เป็นกรอบการทำงานที่ทรงพลังที่ช่วยให้คุณสร้างเหตุการณ์สดและฉากตัดข้ามเซิร์ฟเวอร์บนลำดับการกระทำและการกระตุ้นที่มีโครงสร้าง โดยเฉพาะอย่างยิ่ง โมดูลนี้ช่วยให้คุณ:
- สร้างเหตุการณ์หรือฉากตัดในกรอบการทำงานที่มีโครงสร้างผ่านการกำหนดค่าที่กำหนดเวลาเกี่ยวกับเสียง, การเคลื่อนไหว, และการเปลี่ยนแปลง
- เปลี่ยนผ่านหลายฉากข้ามเซิร์ฟเวอร์หลายตัว โดยการซิงโครไนซ์การเคลื่อนไหวและภาพที่ซับซ้อนกับไทม์ไลน์
- ค้นหาเหตุการณ์และดูตัวอย่างเกมเพื่อการทดสอบและพัฒนา
กรอบการทำงานนี้ได้รับการทดสอบในเหตุการณ์ Roblox เช่น คอนเสิร์ต Twenty One Pilots และ 24kGoldn รวมถึงเกมที่มีผู้เข้าชมสูงมากมาย
เพื่อดู ตัวจัดลำดับเหตุการณ์ ในการทำงานภายในสถานที่ที่สามารถแก้ไขได้ ให้ตรวจสอบเทมเพลต Concert ใน 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 หรือโปรแกรมmatically ผ่าน Instance:SetAttribute()


สภาพแวดล้อม
โฟลเดอร์ Environment ของฉากประกอบด้วยทุกสิ่งที่ผู้ใช้เห็นและได้ยิน รวมถึง วัตถุ 3D, ภูมิประเทศ, คุณสมบัติการให้แสง และ เอฟเฟกต์สิ่งแวดล้อม, และวัตถุอินเทอร์เฟซผู้ใช้ เมื่อฉากโหลด วัตถุและคุณสมบัติเหล่านั้นจะถูกแจกจ่ายไปยัง Workspace, Terrain, และ Lighting, แทนที่วัตถุ/คุณสมบัติที่มีอยู่เพื่อสร้างพื้นที่ที่ถูกคัดลอก
โฟลเดอร์ Environment ประกอบด้วยตัวเก็บถาวรต่อไปนี้:
| ตัวเก็บถาวร | คำอธิบาย |
|---|---|
| Client | ประกอบด้วยทรัพย์สินทั้งหมดที่โหลดเมื่อผู้ใช้ใด ๆ (ไคลเอนต์) เข้าร่วมเหตุการณ์ เช่น วัตถุอินเทอร์เฟซผู้ใช้หรืออุปกรณ์เคลื่อนไหว |
| PlayerSpawns | ประกอบด้วยชิ้นส่วนที่ผู้ใช้เกิดขึ้นเมื่อเข้าร่วม ชิ้นส่วนใด ๆ ในโฟลเดอร์นี้ทำงานคล้ายกับ SpawnLocation |
| Server | ประกอบด้วยทรัพย์สินทั้งหมดที่โหลดเมื่อฉากถูกสร้างขึ้นครั้งแรกบนเซิร์ฟเวอร์ แนะนำให้วัตถุที่มองเห็นส่วนใหญ่ไปที่นี่ |
| Terrain | ประกอบด้วยภูมิประเทศของฉาก |
| Lighting | ประกอบด้วย คุณสมบัติการให้แสง ทั่วไปในฐานะคุณสมบัติ รวมถึงตัวปรับแต่งเช่น เอฟเฟกต์บรรยากาศ และ การประมวลผลหลัง |
เหตุการณ์
โฟลเดอร์ Events ของฉากเป็นเพียงที่ว่างสำหรับ RemoteEvents ที่สื่อสารระหว่างโมดูล Client และ Server ไม่จำเป็นต้องวางอะไรในโฟลเดอร์นี้
Client
สคริปต์นี้ทำงานตรรกะ schema บนไคลเอนต์
Server
สคริปต์นี้ทำงานตรรกะ schema บนเซิร์ฟเวอร์
สคีมาฉาก
schema ของฉากกำหนดสิ่งที่เกิดขึ้นในช่วงเวลาใดในไทม์ไลน์ของฉาก คุณควรกำหนด schema ของฉากในทั้งโมดูล Client และ Server และรวม lifecycle hooks เพื่อจัดการเมื่อ configurations เกิดขึ้น
Lifecycle hooks
schema lifecycle hooks ช่วยให้คุณจัดการเมื่อการดำเนินการของฉากเกิดขึ้น ฉากในผลิตภัณฑ์จะทำงานในลำดับที่ง่ายที่สุด:
OnRun อาจถูกขัดจังหวะเมื่อค้นหา:
ทั้งสาม hooks สามารถทำซ้ำได้หากฉากถูกเล่นซ้ำ:
การกำหนดค่า
schema configurations กำหนดการดำเนินการหลักของฉาก เช่น เล่นเสียง ที่ 00:32, การรอคิว การเคลื่อนไหว เพื่อซิงค์กับเสียงนั้น, กำหนดเวลาการแสดงเหตุการณ์ เช่นการแสดงดอกไม้ไฟ และอื่น ๆ การกำหนดค่าทุกอย่างสนับสนุนฟังก์ชันการเรียกกลับบางอย่างซึ่งพารามิเตอร์แรก (self) คืออินสแตนซ์การกำหนดค่า
ค้นหาฉาก
ฟีเจอร์ที่ไม่เหมือนใครของ ตัวจัดลำดับเหตุการณ์ คือความสามารถในการ "ค้นหา" รอบ ๆ ฉากเหมือนกับที่คุณอาจค้นหาผ่านวิดีโอ ใน โหมดแทนที่ คุณยังสามารถสลับระหว่างฉากเพื่อดูตัวอย่างเหตุการณ์หลายฉากทั้งหมดก่อนที่จะนำไปใช้ในผลิตภัณฑ์
การค้นหาฉากไม่สามารถเข้าถึงได้สำหรับทุกคน เนื่องจากผู้ใช้ที่เพลิดเพลินกับเหตุการณ์ไม่ควรมีความสามารถในการควบคุมการไหลของเวลา แทนที่จะเป็นเช่นนั้น คุณต้องมอบสิทธิ์ในการค้นหาตาม PlaceId ของเหตุการณ์รวมถึง UserIds และ/หรือ กลุ่ม และบทบาทภายในพวกเขา
สร้าง Script ใหม่ภายใน ServerScriptService
วางโค้ดต่อไปนี้ลงในสคริปต์ใหม่
Script - Set Seeking Permissionslocal 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 ของฉาก
กำหนดคุณสมบัติการให้แสงของฉาก การให้แสง, การประมวลผลหลัง, เอฟเฟกต์บรรยากาศ, และ skyboxes ผ่านบริการ Lighting ระดับสูงสุด

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

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

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

เมื่อภูมิประเทศถูกบันทึกสำหรับฉาก คุณสามารถโหลดกลับไปยังบริการ Terrain ระดับสูงสุดได้อย่างรวดเร็วโดยคลิก โหลดภูมิประเทศ จากหน้าต่างปลั๊กอิน
การอ้างอิง API
Schema lifecycle hooks
OnSetup
OnSetup lifecycle hook มีไว้สำหรับการเริ่มต้นทรัพย์สินและตัวแปรที่จะถูกอ้างอิงใน OnRun หรือ OnEndScene การตั้งค่าการเชื่อมต่อ connections ที่ตั้งใจจะคงอยู่ตลอดระยะเวลาของฉาก เป็นต้น hook นี้รับพารามิเตอร์ 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 (Client)")
-- เข้าถึงสภาพแวดล้อมของฉาก; ไม่ใช้กับโหมดในบรรทัด
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 (Server)")
-- เข้าถึงสภาพแวดล้อมของฉาก; ไม่ใช้กับโหมดในบรรทัด
serverEnvironment = EventSequencer.getCurrentSceneEnvironment()
partColorConnection = changePartColorEvent.OnServerEvent:Connect(function(player, changedPart, newColor)
serverEnvironment.changedPart.Color = newColor
end)
print("เวลาปัจจุบันคือ:", timePositionObject.Value)
endOnRun
OnRun เป็น lifecycle hook การดำเนินการหลักภายใน schema ควรมีการกำหนดค่า configurations ที่มีเวลาสำหรับฉากทั้งหมด ตั้งแต่การเล่น เสียง หรือ การเคลื่อนไหว ไปจนถึง การกำหนดเวลาการแสดงเหตุการณ์ เช่นการแสดงดอกไม้ไฟ
Schema.OnRun = function()
print("OnRun (Client)")
local MainAudio = Schema:audio({
StartTime = 1,
SoundId = "rbxassetid://1838673350",
OnStart = function(self)
print("เสียงกำลังเล่น")
end,
OnEnd = function(self)
print("เสียงสิ้นสุด")
end
})
endOnEndScene
OnEndScene lifecycle hook มีประโยชน์สำหรับการทำความสะอาดสิ่งที่ยังคงอยู่ในฉาก เช่น การตัดการเชื่อมต่อการเชื่อมต่อที่สร้างขึ้นใน OnSetup หรือ OnRun ที่ยังคงอยู่ตลอดระยะเวลาของฉาก
Schema.OnEndScene = function()
print("OnEndScene (Server)")
if partColorConnection then
partColorConnection:Disconnect()
partColorConnection = nil
end
endการกำหนดค่า schema
audio
สร้างวัตถุ Sound ในพื้นที่ทำงานซึ่งเล่นในเวลาที่กำหนด เสียงจะถูกลบหลังจากฉากสิ้นสุดหรือหลังจากวัตถุ Sound เสร็จสิ้นการเล่น
| Configuration Key | คำอธิบาย |
|---|---|
| StartTime | เมื่อเล่นเสียงในความสัมพันธ์กับระยะเวลาของฉากในวินาที |
| SoundId | Asset ID ของเสียงที่จะเล่น |
| OnStart | ฟังก์ชันที่กำหนดเองที่จะทำงานเมื่อเสียงเริ่มเล่น |
| OnEnd | ฟังก์ชันที่กำหนดเองที่จะทำงานเมื่อเสียงสิ้นสุดการเล่น |
| Volume | ระดับเสียงของวัตถุ Sound; ค่าเริ่มต้นคือ 0.5 |
Schema.OnRun = function()
print("OnRun (Client)")
local MainAudio = Schema:audio({
StartTime = 1,
SoundId = "rbxassetid://1838673350",
OnStart = function(self)
print("เสียงกำลังเล่น")
end,
OnEnd = function(self)
print("เสียงสิ้นสุด")
end
})
endanimate
สร้าง Animation ซึ่งเล่นในเวลาที่กำหนด
| Configuration Key | คำอธิบาย |
|---|---|
| StartTime | เมื่อเล่นการเคลื่อนไหวในความสัมพันธ์กับระยะเวลาของฉากในวินาที |
| EndTime | เวลาที่เลือกเมื่อสิ้นสุดการเคลื่อนไหวในความสัมพันธ์กับระยะเวลาของฉากในวินาที |
| Rig | อุปกรณ์เคลื่อนไหวที่จะเล่นการเคลื่อนไหว |
| AnimationId | Asset ID ของการเคลื่อนไหวที่จะเล่น |
| Speed | ความเร็วในการเล่นของการเคลื่อนไหว; ค่าเริ่มต้นคือ 1 |
| FadeInTime | ระยะเวลาในการเบลอการเคลื่อนไหวในวินาที; ค่าเริ่มต้นคือ 0.2 (วินาที) |
| FadeOutTime | ระยะเวลาในการเบลอการเคลื่อนไหวในวินาที; ค่าเริ่มต้นคือ 0.2 (วินาที) |
| OnStart | ฟังก์ชันที่กำหนดเองที่จะทำงานเมื่อการเคลื่อนไหวเริ่มเล่น |
| OnEnd | ฟังก์ชันที่กำหนดเองที่จะทำงานเมื่อการเคลื่อนไหวสิ้นสุดการเล่น |
| Looped | ว่าการเคลื่อนไหวจะวนซ้ำหรือไม่; ค่าเริ่มต้นคือ false |
| SyncToAudio | ตารางที่กำหนดว่าการเคลื่อนไหวจะซิงค์กับการกำหนดค่า เสียง หรือไม่ ยอมรับคีย์ต่อไปนี้:
|
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("การเคลื่อนไหวกำลังเล่น")
end,
OnEnd = function(self)
print("การเคลื่อนไหวหยุด")
end
})
endtween
สร้าง Tween ที่สามารถกำหนดค่าได้ซึ่งถูกเก็บรักษาในการค้นหาและการเข้าร่วมแบบไดนามิก หมายความว่าคุณสามารถเชื่อมโยงการเปลี่ยนแปลงในจุดต่าง ๆ ในเวลาและทุกอย่างควรเล่นและซิงค์ตามที่คาดหวัง
| Configuration Key | คำอธิบาย |
|---|---|
| StartTimes | ตารางของเวลาที่เริ่มต้นในความสัมพันธ์กับระยะเวลาของฉากในวินาที |
| Tween | ตารางที่กำหนดวัตถุและคุณสมบัติที่จะเปลี่ยนแปลง ยอมรับคีย์ต่อไปนี้:
|
| OnStart | ฟังก์ชันที่กำหนดเองที่จะทำงานเมื่อการเปลี่ยนแปลงเริ่มเล่น |
| OnHeartbeat | ฟังก์ชันที่กำหนดเองที่จะทำงานในทุก ๆ Heartbeat; รับอัลฟาของการเปลี่ยนแปลงเป็นพารามิเตอร์ที่สอง |
| OnEnd | ฟังก์ชันที่กำหนดเองที่จะทำงานเมื่อการเปลี่ยนแปลงสิ้นสุดการเล่น |
| SyncToAudio | ตารางที่กำหนดว่าการเปลี่ยนแปลงจะซิงค์กับการกำหนดค่า เสียง หรือไม่ ยอมรับคีย์ต่อไปนี้:
|
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("การเปลี่ยนแปลงกำลังเล่น")
end,
OnHeartbeat = function(self, alpha)
print("อัลฟาของการเปลี่ยนแปลง", alpha)
end,
OnEnd = function(self)
print("การเปลี่ยนแปลงเสร็จสิ้น")
end,
})
endinterval
ดำเนินการฟังก์ชันการเรียกกลับที่กำหนดเองในระยะเวลาที่กำหนดในความถี่ที่กำหนดในวินาที มีประโยชน์สำหรับเหตุการณ์ที่ทำซ้ำเช่นไฟกระพริบ, การกระตุ้นความเข้มของเสียง เป็นต้น ความถี่ต่ำสุดที่เป็นไปได้คือ 0 วินาที แต่จริง ๆ แล้วความถี่ขั้นต่ำจะถูกจำกัดเสมอที่ Heartbeat
| Configuration Key | คำอธิบาย |
|---|---|
| StartTime | จุดเริ่มต้นของระยะเวลาช่วงในความสัมพันธ์กับระยะเวลาของฉากในวินาที |
| EndTime | จุดสิ้นสุดของระยะเวลาช่วงในความสัมพันธ์กับระยะเวลาของฉากในวินาที |
| Frequency | ความถี่ที่ฟังก์ชัน OnInterval ควรทำงานในวินาที โดยการดำเนินการครั้งแรกจะเกิดขึ้นที่ StartTime |
| OnStart | ฟังก์ชันที่กำหนดเองที่จะทำงานเมื่อชุดของช่วงเริ่มต้น |
| OnInterval | ฟังก์ชันที่กำหนดเองที่จะทำงานในทุกช่วงภายในระยะเวลาที่กำหนด (StartTime ถึง EndTime) |
| OnEnd | ฟังก์ชันที่กำหนดเองที่จะทำงานเมื่อชุดของช่วงสิ้นสุด |
| SyncToAudio | ตารางที่กำหนดว่าระยะเวลาช่วงจะซิงค์กับการกำหนดค่า เสียง หรือไม่ ยอมรับคีย์ต่อไปนี้:
|
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,
})
endschedule
คล้ายกับ interval ยกเว้นว่าคุณสามารถกำหนดเวลาที่เริ่มต้นเฉพาะหลาย ๆ เวลา สำหรับเหตุการณ์เดียวกัน เช่น การกำหนดเวลาการแสดงดอกไม้ไฟสองครั้งในฉาก
| Configuration Key | คำอธิบาย |
|---|---|
| StartTimes | ตารางของเวลาที่เริ่มต้นในความสัมพันธ์กับระยะเวลาของฉากในวินาที |
| OnStart | ฟังก์ชันที่กำหนดเองที่จะทำงานในทุกเวลาที่กำหนดในตาราง StartTimes |
| Skippable | บูลีนที่กำหนดว่ากิจกรรมที่กำหนดเวลาสามารถข้ามได้สำหรับผู้ใช้ที่เข้าร่วมช้า หรือเมื่อค้นหาล่วงหน้าก่อนเวลาที่กำหนด หากตั้งค่าเป็น false เวลาที่เริ่มต้นของกิจกรรมทั้งหมดที่กำหนดไว้ก่อนเวลาที่เข้าร่วม/ค้นหาจะเกิดขึ้นในเวลานั้น หากตั้งค่าเป็น true จะเกิดขึ้นเฉพาะเวลาที่เริ่มต้นที่กำหนดไว้ หลังจาก การเข้าร่วม/ค้นหา ค่าเริ่มต้นคือ false |
| SyncToAudio | ตารางที่กำหนดว่าการกำหนดเวลาจะซิงค์กับการกำหนดค่า เสียง หรือไม่ ยอมรับคีย์ต่อไปนี้:
|
Schema.OnRun = function()
print("OnRun (Client)")
Schema:schedule({
StartTimes = {5, 27.25},
OnStart = function(self)
-- เริ่มต้นการเชื่อมต่อการเต้นหัวใจชั่วคราว
local tempConnection = RunService.Heartbeat:Connect(function()
end)
-- แจ้งกรอบการทำงานเกี่ยวกับการเชื่อมต่อ
Schema:inform(tempConnection)
end
})
endinform
แจ้งกรอบการทำงานเกี่ยวกับโมดูล, วัตถุ UI, การเชื่อมต่อ ฯลฯ ที่ถูกสร้างขึ้นใน lifecycle hook OnRun เพื่อให้แน่ใจว่าพวกเขาจะถูกทำความสะอาดอย่างเหมาะสมเมื่อ ค้นหา กรณีการใช้งานรวมถึง:
แจ้งกรอบการทำงานเกี่ยวกับการเชื่อมต่อชั่วคราวที่ไม่เป็นทางการเช่น RunService.Heartbeat เพื่อให้การเชื่อมต่อนั้นถูกทำความสะอาดเมื่อค้นหาไปยังจุดก่อนหน้าในระยะเวลาของฉาก
Server SchemaSchema.OnRun = function()print("OnRun (Server)")Schema:schedule({StartTimes = {5},OnStart = function(self)-- เริ่มต้นการเชื่อมต่อการเต้นหัวใจชั่วคราวlocal tempConnection = RunService.Heartbeat:Connect(function()end)-- แจ้งกรอบการทำงานเกี่ยวกับการเชื่อมต่อSchema:inform(tempConnection)end})endเรียกใช้ฟังก์ชัน "ทำความสะอาด" ที่กำหนดเองใน ModuleScript ที่เริ่มต้นการเชื่อมต่อหรือการอ้างอิงอื่น ๆ ใน lifecycle hook OnRun
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()-- เริ่มต้นการเชื่อมต่อการเต้นหัวใจ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 วินาทีสำหรับฉากในการโหลดจากเซิร์ฟเวอร์ก่อนที่การค้นหาจะเกิดขึ้นและฉากเริ่มเล่น นี่หมายความว่าหากคุณเรียก loadScene("[SceneName]", 20) ในเวลา 16:15:00 น. กรอบการทำงานจะรอ 5 วินาทีบวกกับ 20 วินาที ทำให้ฉากเริ่มต้นที่ 16: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
ส่งคืนอินสแตนซ์ของ schema ของฉากเพื่อสร้างตรรกะสำหรับฉาก
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
local Schema = EventSequencer.createSchema()
Schema.OnSetup = function(timePositionObject)
print("OnSetup (Client)")
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)
ส่งคืนโฟลเดอร์ Environment ของฉากปัจจุบันในฝั่งไคลเอนต์หรือฝั่งเซิร์ฟเวอร์ ขึ้นอยู่กับว่าเรียกจากโมดูล Client หรือโมดูล Server
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("เวลาปัจจุบันคือ:", 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 (Server)")
serverEnvironment = EventSequencer.getCurrentSceneEnvironment()
partColorConnection = changePartColorEvent.OnServerEvent:Connect(function(player, changedPart, newColor)
serverEnvironment.changedPart.Color = newColor
end)
endgetCurrentServerEnvironmentFromClient
getCurrentServerEnvironmentFromClient(): Folder (YIELDS)
ส่งคืนโฟลเดอร์ Environment ของฉากใน ฝั่งเซิร์ฟเวอร์ ปัจจุบัน แตกต่างจาก getCurrentSceneEnvironment คุณสามารถเรียกใช้ฟังก์ชันนี้จากโมดูล Client
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("เวลาปัจจุบันคือ:", 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)เกิดเหตุการณ์บนเซิร์ฟเวอร์ก่อนที่ฉากจะสิ้นสุด เวลาเริ่มต้นคือ 3 วินาที แต่คุณสามารถกำหนดค่าได้ผ่าน [setSceneWarningTime](#setscenewarningtime) เหตุการณ์นี้สามารถเชื่อมต่อได้เฉพาะใน `Class.Script`
```lua title="Script" highlight="6,8"
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)