ตัวจัดลำดับเหตุการณ์

*เนื้อหานี้แปลโดยใช้ AI (เวอร์ชัน Beta) และอาจมีข้อผิดพลาด หากต้องการดูหน้านี้เป็นภาษาอังกฤษ ให้คลิกที่นี่

ตัวจัดลำดับเหตุการณ์ เป็นกรอบการทำงานที่ทรงพลังที่ช่วยให้คุณสร้างเหตุการณ์สดและฉากตัดข้ามเซิร์ฟเวอร์บนลำดับการกระทำและการกระตุ้นที่มีโครงสร้าง โดยเฉพาะอย่างยิ่ง โมดูลนี้ช่วยให้คุณ:

  • สร้างเหตุการณ์หรือฉากตัดในกรอบการทำงานที่มีโครงสร้างผ่านการกำหนดค่าที่กำหนดเวลาเกี่ยวกับเสียง, การเคลื่อนไหว, และการเปลี่ยนแปลง
  • เปลี่ยนผ่านหลายฉากข้ามเซิร์ฟเวอร์หลายตัว โดยการซิงโครไนซ์การเคลื่อนไหวและภาพที่ซับซ้อนกับไทม์ไลน์
  • ค้นหาเหตุการณ์และดูตัวอย่างเกมเพื่อการทดสอบและพัฒนา

กรอบการทำงานนี้ได้รับการทดสอบในเหตุการณ์ Roblox เช่น คอนเสิร์ต Twenty One Pilots และ 24kGoldn รวมถึงเกมที่มีผู้เข้าชมสูงมากมาย

เพื่อดู ตัวจัดลำดับเหตุการณ์ ในการทำงานภายในสถานที่ที่สามารถแก้ไขได้ ให้ตรวจสอบเทมเพลต Concert ใน Roblox Studio เทมเพลตนี้เป็นจุดเริ่มต้นที่ครอบคลุมสำหรับนักพัฒนาในการสร้างเหตุการณ์/คอนเสิร์ตและทำความคุ้นเคยกับฟีเจอร์และส่วนประกอบต่างๆ ที่เกี่ยวข้อง

การใช้งานโมดูล

การติดตั้ง

ในการใช้กรอบการทำงาน ตัวจัดลำดับเหตุการณ์ ในเกม:

  1. จากเมนู Window ของ Studio หรือแถบเครื่องมือ Home ให้เปิด Toolbox และเลือกแท็บ Creator Store

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

  3. ค้นหาและคลิกที่ไทล์ Packages

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

  5. ในหน้าต่าง Explorer ให้ย้ายโมเดล ตัวจัดลำดับเหตุการณ์ ทั้งหมดไปยัง ServerScriptService เมื่อเกมทำงาน โมดูลจะเริ่มทำงาน

โหมดกรอบการทำงาน

โหมดแทนที่

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

โหมดในบรรทัด

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

เพื่อเปิดใช้งานโหมดในบรรทัด:

  1. ภายในโมเดล ตัวจัดลำดับเหตุการณ์ ที่คุณวางใน ServerScriptService ให้ขยายและเลือกค่า Inline ภายในโฟลเดอร์ ReplicatedStorage

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

สร้างฉาก

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

เพื่อเริ่มต้นอย่างรวดเร็ว คุณสามารถค้นหาฉากว่างภายในโฟลเดอร์หลักของโมดูล:

  1. ขยายโฟลเดอร์ ตัวจัดลำดับเหตุการณ์ และค้นหาโฟลเดอร์ BlankScene

  2. ย้ายหรือคัดลอกโฟลเดอร์ 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 และ/หรือ กลุ่ม และบทบาทภายในพวกเขา

  1. สร้าง Script ใหม่ภายใน ServerScriptService

  2. วางโค้ดต่อไปนี้ลงในสคริปต์ใหม่

    Script - Set Seeking Permissions
    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. จากเมนู Window ของ Studio หรือแถบเครื่องมือ Home ให้เปิด Toolbox

  2. เมื่อเลือกแท็บ Creator Store ให้เลือก Plugins จากเมนูแบบเลื่อนลง

  3. ในช่องค้นหา ให้พิมพ์ ตัวจัดการฉาก และกด Enter เพื่อค้นหาปลั๊กอิน

  4. คลิกที่ไอคอนของปลั๊กอินเพื่อดูรายละเอียดและจากนั้นคลิกปุ่ม ติดตั้ง

  5. เมื่อติดตั้งปลั๊กอินแล้ว จะปรากฏในแท็บ 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 ของฉาก

  1. กำหนดคุณสมบัติการให้แสงของฉาก การให้แสง, การประมวลผลหลัง, เอฟเฟกต์บรรยากาศ, และ skyboxes ผ่านบริการ Lighting ระดับสูงสุด

  2. ในหน้าต่างปลั๊กอิน ตัวจัดการฉาก ให้คลิก บันทึกการให้แสง สำหรับฉากที่ต้องการ

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

    อินสแตนซ์ที่ถูกคัดลอก
    คุณสมบัติที่บันทึกไว้

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

บันทึกและโหลดภูมิประเทศ

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

  1. กำหนดภูมิประเทศของฉากผ่านบริการ Terrain ระดับสูงสุด

  2. ในหน้าต่างปลั๊กอิน ตัวจัดการฉาก ให้คลิก บันทึกภูมิประเทศ สำหรับฉากที่ต้องการ

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

    เมื่อภูมิประเทศถูกบันทึกสำหรับฉาก คุณสามารถโหลดกลับไปยังบริการ Terrain ระดับสูงสุดได้อย่างรวดเร็วโดยคลิก โหลดภูมิประเทศ จากหน้าต่างปลั๊กอิน

การอ้างอิง API

Schema lifecycle hooks

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("เวลาปัจจุบันคือ:", 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("เวลาปัจจุบันคือ:", 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("เสียงกำลังเล่น")
end,
OnEnd = function(self)
print("เสียงสิ้นสุด")
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เมื่อเล่นเสียงในความสัมพันธ์กับระยะเวลาของฉากในวินาที
SoundIdAsset 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("เสียงกำลังเล่น")
end,
OnEnd = function(self)
print("เสียงสิ้นสุด")
end
})
end

animate

สร้าง Animation ซึ่งเล่นในเวลาที่กำหนด

Configuration Keyคำอธิบาย
StartTimeเมื่อเล่นการเคลื่อนไหวในความสัมพันธ์กับระยะเวลาของฉากในวินาที
EndTimeเวลาที่เลือกเมื่อสิ้นสุดการเคลื่อนไหวในความสัมพันธ์กับระยะเวลาของฉากในวินาที
Rigอุปกรณ์เคลื่อนไหวที่จะเล่นการเคลื่อนไหว
AnimationIdAsset ID ของการเคลื่อนไหวที่จะเล่น
Speedความเร็วในการเล่นของการเคลื่อนไหว; ค่าเริ่มต้นคือ 1
FadeInTimeระยะเวลาในการเบลอการเคลื่อนไหวในวินาที; ค่าเริ่มต้นคือ 0.2 (วินาที)
FadeOutTimeระยะเวลาในการเบลอการเคลื่อนไหวในวินาที; ค่าเริ่มต้นคือ 0.2 (วินาที)
OnStartฟังก์ชันที่กำหนดเองที่จะทำงานเมื่อการเคลื่อนไหวเริ่มเล่น
OnEndฟังก์ชันที่กำหนดเองที่จะทำงานเมื่อการเคลื่อนไหวสิ้นสุดการเล่น
Loopedว่าการเคลื่อนไหวจะวนซ้ำหรือไม่; ค่าเริ่มต้นคือ false
SyncToAudioตารางที่กำหนดว่าการเคลื่อนไหวจะซิงค์กับการกำหนดค่า เสียง หรือไม่ ยอมรับคีย์ต่อไปนี้:
  • Audio – อ้างอิงถึงการกำหนดค่า เสียง
  • StartAtAudioTime – เมื่อเล่นการเคลื่อนไหวในความสัมพันธ์กับระยะเวลาของเสียง
  • EndAtAudioTime – เวลาที่เลือกเมื่อสิ้นสุดการเคลื่อนไหวในความสัมพันธ์กับระยะเวลาของเสียง
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("การเคลื่อนไหวกำลังเล่น")
end,
OnEnd = function(self)
print("การเคลื่อนไหวหยุด")
end
})
end

tween

สร้าง Tween ที่สามารถกำหนดค่าได้ซึ่งถูกเก็บรักษาในการค้นหาและการเข้าร่วมแบบไดนามิก หมายความว่าคุณสามารถเชื่อมโยงการเปลี่ยนแปลงในจุดต่าง ๆ ในเวลาและทุกอย่างควรเล่นและซิงค์ตามที่คาดหวัง

Configuration Keyคำอธิบาย
StartTimesตารางของเวลาที่เริ่มต้นในความสัมพันธ์กับระยะเวลาของฉากในวินาที
Tweenตารางที่กำหนดวัตถุและคุณสมบัติที่จะเปลี่ยนแปลง ยอมรับคีย์ต่อไปนี้:
  • Object – วัตถุที่จะเปลี่ยนแปลง
  • Info – อินสแตนซ์ TweenInfo สำหรับการเปลี่ยนแปลง กำหนดระยะเวลา, Enum.EasingStyle, Enum.EasingDirection เป็นต้น
  • Properties – คุณสมบัติของวัตถุและค่าที่เป้าหมายสำหรับการเปลี่ยนแปลง
OnStartฟังก์ชันที่กำหนดเองที่จะทำงานเมื่อการเปลี่ยนแปลงเริ่มเล่น
OnHeartbeatฟังก์ชันที่กำหนดเองที่จะทำงานในทุก ๆ Heartbeat; รับอัลฟาของการเปลี่ยนแปลงเป็นพารามิเตอร์ที่สอง
OnEndฟังก์ชันที่กำหนดเองที่จะทำงานเมื่อการเปลี่ยนแปลงสิ้นสุดการเล่น
SyncToAudioตารางที่กำหนดว่าการเปลี่ยนแปลงจะซิงค์กับการกำหนดค่า เสียง หรือไม่ ยอมรับคีย์ต่อไปนี้:
  • Audio – อ้างอิงถึงการกำหนดค่า เสียง
  • StartAtAudioTimes – ตารางของเวลาที่เริ่มต้นที่กำหนดเมื่อเล่นการเปลี่ยนแปลงในความสัมพันธ์กับระยะเวลาของเสียง
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("การเปลี่ยนแปลงกำลังเล่น")
end,
OnHeartbeat = function(self, alpha)
print("อัลฟาของการเปลี่ยนแปลง", alpha)
end,
OnEnd = function(self)
print("การเปลี่ยนแปลงเสร็จสิ้น")
end,
})
end

interval

ดำเนินการฟังก์ชันการเรียกกลับที่กำหนดเองในระยะเวลาที่กำหนดในความถี่ที่กำหนดในวินาที มีประโยชน์สำหรับเหตุการณ์ที่ทำซ้ำเช่นไฟกระพริบ, การกระตุ้นความเข้มของเสียง เป็นต้น ความถี่ต่ำสุดที่เป็นไปได้คือ 0 วินาที แต่จริง ๆ แล้วความถี่ขั้นต่ำจะถูกจำกัดเสมอที่ Heartbeat

Configuration Keyคำอธิบาย
StartTimeจุดเริ่มต้นของระยะเวลาช่วงในความสัมพันธ์กับระยะเวลาของฉากในวินาที
EndTimeจุดสิ้นสุดของระยะเวลาช่วงในความสัมพันธ์กับระยะเวลาของฉากในวินาที
Frequencyความถี่ที่ฟังก์ชัน OnInterval ควรทำงานในวินาที โดยการดำเนินการครั้งแรกจะเกิดขึ้นที่ StartTime
OnStartฟังก์ชันที่กำหนดเองที่จะทำงานเมื่อชุดของช่วงเริ่มต้น
OnIntervalฟังก์ชันที่กำหนดเองที่จะทำงานในทุกช่วงภายในระยะเวลาที่กำหนด (StartTime ถึง EndTime)
OnEndฟังก์ชันที่กำหนดเองที่จะทำงานเมื่อชุดของช่วงสิ้นสุด
SyncToAudioตารางที่กำหนดว่าระยะเวลาช่วงจะซิงค์กับการกำหนดค่า เสียง หรือไม่ ยอมรับคีย์ต่อไปนี้:
  • Audio – อ้างอิงถึงการกำหนดค่า เสียง
  • StartAtAudioTime – เมื่อเริ่มระยะเวลาช่วงในความสัมพันธ์กับระยะเวลาของเสียง
  • EndAtAudioTime – เวลาที่เลือกเมื่อสิ้นสุดระยะเวลาช่วงในความสัมพันธ์กับระยะเวลาของเสียง
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ตารางที่กำหนดว่าการกำหนดเวลาจะซิงค์กับการกำหนดค่า เสียง หรือไม่ ยอมรับคีย์ต่อไปนี้:
  • Audio – อ้างอิงถึงการกำหนดค่า เสียง
  • StartAtAudioTimes – ตารางของเวลาที่เริ่มต้นที่กำหนดเมื่อเรียกใช้ฟังก์ชัน OnStart ในความสัมพันธ์กับระยะเวลาของเสียง
Client Schema
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
})
end

inform

แจ้งกรอบการทำงานเกี่ยวกับโมดูล, วัตถุ UI, การเชื่อมต่อ ฯลฯ ที่ถูกสร้างขึ้นใน lifecycle hook OnRun เพื่อให้แน่ใจว่าพวกเขาจะถูกทำความสะอาดอย่างเหมาะสมเมื่อ ค้นหา กรณีการใช้งานรวมถึง:

  • แจ้งกรอบการทำงานเกี่ยวกับการเชื่อมต่อชั่วคราวที่ไม่เป็นทางการเช่น RunService.Heartbeat เพื่อให้การเชื่อมต่อนั้นถูกทำความสะอาดเมื่อค้นหาไปยังจุดก่อนหน้าในระยะเวลาของฉาก

    Server Schema
    Schema.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 Schema
    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 (Server)")
    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 วินาทีสำหรับฉากในการโหลดจากเซิร์ฟเวอร์ก่อนที่การค้นหาจะเกิดขึ้นและฉากเริ่มเล่น นี่หมายความว่าหากคุณเรียก 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
-- กลับไปที่ฉากก่อนการแสดง
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 ในวินาทีจากจุดเริ่มต้นของฉากที่โหลดอยู่ในปัจจุบัน

Script
local 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("ฉากใกล้จะสิ้นสุด!")
end)

setSeekingPermissions

setSeekingPermissions(permissions: table)

มอบสิทธิ์ในการค้นหาตาม PlaceId ของเหตุการณ์รวมถึง UserIds และ/หรือ กลุ่ม และบทบาทภายในพวกเขา ดู ค้นหาและสลับฉาก สำหรับข้อมูลเพิ่มเติม

getCurrentSceneEnvironment

getCurrentSceneEnvironment(): Folder (YIELDS)

ส่งคืนโฟลเดอร์ Environment ของฉากปัจจุบันในฝั่งไคลเอนต์หรือฝั่งเซิร์ฟเวอร์ ขึ้นอยู่กับว่าเรียกจากโมดูล 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("เวลาปัจจุบันคือ:", 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)

ส่งคืนโฟลเดอร์ Environment ของฉากใน ฝั่งเซิร์ฟเวอร์ ปัจจุบัน แตกต่างจาก getCurrentSceneEnvironment คุณสามารถเรียกใช้ฟังก์ชันนี้จากโมดูล 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("เวลาปัจจุบันคือ:", timePositionObject.Value)
end

isLoadingScene

isLoadingScene(): boolean

เรียกใช้จากเซิร์ฟเวอร์เพื่อทราบว่าฉากกำลังโหลดอยู่หรือไม่

Script
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)เกิดเหตุการณ์บนเซิร์ฟเวอร์ก่อนที่ฉากจะสิ้นสุด เวลาเริ่มต้นคือ 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

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)
©2026 Roblox Corporation. Roblox, โลโก้ Roblox และ Powering Imagination เป็นส่วนหนึ่งของเครื่องหมายการค้าที่จดทะเบียน และไม่ได้จดทะเบียนของเราในสหรัฐฯ และประเทศอื่นๆ