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

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

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

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

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

เพื่อดู ตัวจัดลำดับเหตุการณ์ ในการทำงานภายในสถานที่ที่แก้ไขได้ โปรดตรวจสอบ เทมเพลตคอนเสิร์ต ใน 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 หรือผ่าน 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 ที่เฉพาะเจาะจงและ/หรือ กลุ่ม และบทบาทภายในพวกเขา

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

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

    Script - ตั้งค่าสิทธิ์การค้นหา

    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. ในหน้าต่างปลั๊กอิน ตัวจัดการฉาก ให้คลิก บันทึกแสง สำหรับฉากที่ต้องการ

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

    ตัวอย่างที่จำลอง
    คุณสมบัติที่บันทึกแล้ว

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

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

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

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

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

  3. เลือกและขยายโฟลเดอร์ 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เมื่อใดที่เสียงจะเล่นเกี่ยวกับระยะเวลาของฉาก ในวินาที
SoundIdID ของสินทรัพย์เสียงที่จะเล่น
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การ์ตูนเคลื่อนไหวที่จะเล่น
AnimationIdID ของสินทรัพย์การ์ตูนเคลื่อนไหวที่จะเล่น
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("Animation playing")
end,
OnEnd = function(self)
print("Animation stopped")
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("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ตารางที่กำหนดว่าให้ซิงโครไนซ์ระยะเวลาช่วงกับการกำหนด เสียง หรือไม่ ยอมรับคีย์ต่อไปนี้:
  • 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)
-- เริ่มเชื่อมต่อ heartbeat ชั่วคราว
local tempConnection = RunService.Heartbeat:Connect(function()
end)
-- แจ้งให้เฟรมเวิร์กทราบเกี่ยวกับการเชื่อมต่อ
Schema:inform(tempConnection)
end
})
end

inform

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

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

    Server Schema

    Schema.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 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()
    -- เริ่มการเชื่อมต่อ heartbeat
    CustomModule.connection = RunService.Heartbeat:Connect(function()
    end)
    end
    CustomModule.clean = function()
    -- ตัดการเชื่อมต่อและล้างการเชื่อมต่อ heartbeat
    if CustomModule.connection then
    CustomModule.connection:Disconnect()
    CustomModule.connection = nil
    end
    end
    return 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 ในวินาทีจากจุดเริ่มต้นของฉากที่โหลดอยู่ในปัจจุบัน

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("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

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

Script

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
print(EventSequencer.isLoadingScene())
while EventSequencer.isLoadingScene() do
task.wait()
end
print("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)
©2026 Roblox Corporation. Roblox, โลโก้ Roblox และ Powering Imagination เป็นส่วนหนึ่งของเครื่องหมายการค้าที่จดทะเบียน และไม่ได้จดทะเบียนของเราในสหรัฐฯ และประเทศอื่นๆ