Bộ điều phối sự kiện

*Nội dung này được dịch bằng AI (Beta) và có thể có lỗi. Để xem trang này bằng tiếng Anh, hãy nhấp vào đây.

Bộ điều phối sự kiện là một khuôn khổ mạnh mẽ cho phép bạn xây dựng các sự kiện và cảnh cắt trên nhiều máy chủ dựa trên một trình tự hành động và kích hoạt có cấu trúc. Cụ thể hơn, mô-đun này giúp bạn:

  • Xây dựng một sự kiện hoặc cảnh cắt dựa trên một khuôn khổ có cấu trúc thông qua các cấu hình âm thanh, hoạt ảnh và tween được lên lịch.
  • Chuyển tiếp giữa nhiều cảnh trên nhiều máy chủ, đồng bộ hóa các hoạt ảnh và hình ảnh phức tạp theo một dòng thời gian.
  • Tìm kiếm trong một sự kiện và xem trước trải nghiệm để thử nghiệm và phát triển.

Khuôn khổ này đã được thử nghiệm trong các sự kiện Roblox như Twenty One Pilots24kGoldn, cũng như nhiều trải nghiệm được truy cập nhiều.

Để xem Bộ điều phối sự kiện hoạt động trong một địa điểm có thể chỉnh sửa, hãy kiểm tra mẫu Buổi hòa nhạc trong Roblox Studio. Mẫu này là một điểm khởi đầu toàn diện cho các nhà phát triển để tạo sự kiện/ buổi hòa nhạc và làm quen với các tính năng và thành phần khác nhau liên quan.

Sử dụng mô-đun

Cài đặt

Để sử dụng khuôn khổ Bộ điều phối sự kiện trong một trải nghiệm:

  1. Từ menu Cửa sổ trong Studio hoặc thanh công cụ Trang chủ, mở Bảng công cụ và chọn tab Cửa hàng tạo.

  2. Đảm bảo chọn sắp xếp Mô hình, sau đó nhấp vào nút Xem Tất cả cho Danh mục.

  3. Tìm và nhấp vào ô Gói.

  4. Tìm mô-đun Bộ điều phối sự kiện và nhấp vào nó, hoặc kéo và thả vào chế độ xem 3D.

  5. Trong cửa sổ Trình duyệt, di chuyển toàn bộ mô hình Bộ điều phối sự kiện vào ServerScriptService. Khi chạy trải nghiệm, mô-đun sẽ bắt đầu hoạt động.

Chế độ khuôn khổ

Chế độ thay thế

Chế độ khuôn khổ mặc định là chế độ thay thế, trong đó bạn thiết kế các cảnh độc đáo bằng cách đặt các đối tượng 3D, địa hình, các thuộc tính ánh sáng, các hiệu ứng môi trường và các đối tượng giao diện người dùng vào thư mục Môi trường của cảnh đó. Khi một cảnh được tải, những đối tượng và thuộc tính đó sẽ được phân phối vào Workspace, Terrain, và Lighting, thay thế các đối tượng/ thuộc tính hiện có để hình thành một không gian được nhân bản.

Chế độ nội tuyến

Một chế độ khuôn khổ thay thế là chế độ nội tuyến, trong đó bạn tương tự thiết kế các cảnh độc đáo với logic kịch bản cho dòng chảy/các sự kiện của chúng, nhưng khuôn khổ sẽ không phá hủy các đối tượng 3D, địa hình, các thuộc tính ánh sáng, các hiệu ứng môi trường, và các đối tượng giao diện người dùng để sao chép các tài sản/thuộc tính từ thư mục Môi trường của một cảnh khi tải lên.

Để kích hoạt chế độ nội tuyến:

  1. Trong mô hình Bộ điều phối sự kiện mà bạn đã đặt trong ServerScriptService, mở rộng và chọn giá trị Nội tuyến bên trong thư mục ReplicatedStorage.

  2. Trong cửa sổ Thuộc tính, bật hộp kiểm Giá trị của nó.

Tạo cảnh

Một cảnh về cơ bản là một phần của một sự kiện tổng thể hoặc một cảnh cắt được gói trong một loạt các thư mục. Mỗi cảnh chứa logic kịch bản định nghĩa dòng chảy/các sự kiện của nó, và một cảnh có thể lưu trữ các đối tượng 3D, địa hình, các thuộc tính ánh sáng, các hiệu ứng môi trường, và các đối tượng giao diện người dùng của riêng mình.

Để bắt đầu nhanh chóng, bạn có thể tìm thấy một cảnh trống trong thư mục chính của mô-đun:

  1. Mở rộng thư mục Bộ điều phối sự kiện và định vị thư mục Cảnh trống.

  2. Di chuyển hoặc sao chép toàn bộ thư mục Cảnh trống vào ReplicatedStorage.

Thời gian dài

Mỗi cảnh nên có một thời gian dài, tính bằng giây, xác định thời gian của nó — giống như một bộ phim hoặc buổi hòa nhạc có thời gian đã chỉ định. Thời gian dài được định nghĩa là một thuộc tính số trong thư mục của cảnh có tên là TimeLength mà bạn có thể đặt trực tiếp trong Studio hoặc lập trình thông qua Instance:SetAttribute().

Môi trường

Thư mục Môi trường của một cảnh chứa mọi thứ mà người dùng thấy và nghe, bao gồm đối tượng 3D, địa hình, thuộc tính ánh sángcác hiệu ứng môi trường, và các đối tượng giao diện người dùng. Khi một cảnh được tải, những đối tượng và thuộc tính đó sẽ được phân phối vào Workspace, Terrain, và Lighting, thay thế các đối tượng/thuộc tính hiện có để hình thành một không gian được nhân bản.

Thư mục Môi trường chứa các thùng chứa sau:

Thùng chứaMô tả
Khách hàngChứa tất cả các tài sản để tải khi bất kỳ người dùng nào (khách hàng) tham gia sự kiện, chẳng hạn như các đối tượng giao diện người dùng hoặc một rương hoạt hình.
Điểm spawn người chơiChứa các phần nơi người dùng xuất hiện khi tham gia. Bất kỳ phần nào trong thư mục này hoạt động tương tự như một SpawnLocation.
Máy chủChứa tất cả các tài sản để tải khi một cảnh được tạo lần đầu tiên trên máy chủ. Được khuyến nghị rằng hầu hết các tài sản hình ảnh sẽ nằm ở đây.
Địa hìnhChứa địa hình cảnh.
Ánh sángChứa các thuộc tính ánh sáng toàn cầu với tư cách là thuộc tính, cũng như các bộ sửa đổi như các hiệu ứng khí quyểnhậu xử lý.

Sự kiện

Thư mục Sự kiện của một cảnh đơn thuần chỉ là một chỗ giữ chỗ cho RemoteEvents giao tiếp giữa các mô-đun Khách hàngMáy chủ. Không cần thiết phải đặt bất kỳ thứ gì vào thư mục này.

Khách hàng

Kịch bản này thực hiện logic lược đồ trên phía khách hàng.

Máy chủ

Kịch bản này thực hiện logic lược đồ trên phía máy chủ.

Lược đồ cảnh

Lược đồ của một cảnh xác định những gì xảy ra ở điểm nào trong dòng thời gian của cảnh. Bạn nên xác định lược đồ của một cảnh trong cả hai mô-đun Khách hàngMáy chủ và bao gồm móc vòng đời để quản lý khi nào các cấu hình xảy ra.

Móc vòng đời

Các móc vòng đời lược đồ cho phép bạn quản lý khi nào các hoạt động của cảnh xảy ra. Một cảnh trong sản xuất thường chạy trong dòng chảy đơn giản nhất:

OnRun có thể bị gián đoạn khi tìm kiếm:

Cả ba móc đều có thể lặp lại nếu cảnh được phát lại:

Cấu hình

Các cấu hình lược đồ xác định các hoạt động cốt lõi của một cảnh, chẳng hạn như phát âm thanh tại 00:32, xếp hàng một hoạt ảnh để đồng bộ với âm thanh đó, lên lịch một sự kiện cảnh như một buổi biểu diễn pháo hoa, và nhiều hơn nữa. Mỗi cấu hình hỗ trợ các chức năng gọi lại nhất định trong đó tham số đầu tiên (self) là phiên bản cấu hình.

Tìm kiếm cảnh

Một tính năng độc đáo của Bộ điều phối sự kiện là khả năng "tìm kiếm" xung quanh các cảnh như bạn có thể tìm kiếm trong một video. Trong Chế độ Thay thế, bạn cũng có thể chuyển đổi giữa các cảnh để xem trước toàn bộ sự kiện nhiều cảnh trước khi đưa vào sản xuất.

Việc tìm kiếm cảnh không thể truy cập cho tất cả mọi người vì những người dùng đơn giản đang thưởng thức sự kiện không nên có khả năng kiểm soát dòng thời gian của nó. Thay vào đó, bạn phải cấp quyền tìm kiếm dựa trên PlaceId của sự kiện cũng như UserIds cụ thể và/hoặc nhóm và các vai trò trong đó.

  1. Tạo một Script mới trong ServerScriptService.

  2. Dán mã sau vào kịch bản mới.

    Script - Đặt Quyền Tìm Kiếm

    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
    EventSequencer.setSeekingPermissions({
    placeIDs = {},
    userIDs = {},
    groups = {
    {GroupID = , MinimumRankID = },
    }
    })
  3. Điền vào các bảng sau trong lời gọi setSeekingPermissions như sau:

    placeIDsDanh sách các giá trị PlaceId được phân cách bằng dấu phẩy để hỗ trợ tìm kiếm trong đó.
    userIDsDanh sách các UserIds được phân cách bằng dấu phẩy cho những ai có thể tìm kiếm trong các địa điểm được hỗ trợ.
    groupsDanh sách các bảng được phân cách bằng dấu phẩy, mỗi bảng chứa ID nhóm và cấp tối thiểu của các thành viên trong nhóm đó có thể tìm kiếm trong các địa điểm được hỗ trợ.

Tiện ích quản lý cảnh

Tiện ích Quản lý Cảnh là một công cụ hữu ích để tải và dỡ cảnh, ánh sáng, và địa hình. Nếu bạn không sử dụng Chế độ Nội tuyến, thì rất được khuyến nghị bạn nên sử dụng tiện ích này thay vì đặt/chỉnh sửa các đối tượng và thuộc tính cảnh bằng tay.

Để cài đặt tiện ích:

  1. Từ menu Cửa sổ trong Studio hoặc thanh công cụ Trang chủ, mở Bảng công cụ.

  2. Với tab Cửa hàng tạo được chọn, chọn Tiện ích từ menu thả xuống.

  3. Trong trường tìm kiếm, nhập Quản lý Cảnh và nhấn Enter để tìm tiện ích.

  4. Nhấp vào biểu tượng của tiện ích để xem chi tiết và sau đó nhấp vào nút Cài đặt.

  5. Khi tiện ích đã được cài đặt, nó xuất hiện trong tab Tiện ích của Studio.

Tải và dỡ cảnh

Như đã nêu trong phần tạo các cảnh, thư mục Môi trường của một cảnh chứa mọi thứ mà người dùng thấy và nghe, bao gồm đối tượng 3D. Tiện ích giúp bạn nhanh chóng tải các tài sản của một cảnh vào hoặc ra khỏi các thư mục có tổ chức trong không gian làm việc.

Hành động của tiện íchMô tả
Tải khách hàngNếu nội dung khách hàng của cảnh bị dỡ bỏ, chuyển thư mục Môi trường/Khách hàng của nó vào thư mục Workspace/ScenesClient.
Tải máy chủNếu nội dung máy chủ của cảnh bị dỡ bỏ, chuyển thư mục Môi trường/Máy chủ của nó vào thư mục Workspace/ScenesServer.
Dỡ khách hàngNếu nội dung khách hàng của cảnh đã được tải, chuyển thư mục Khách hàng từ Workspace/ScenesClient quay trở lại thư mục [Cảnh]/Môi trường.
Dỡ máy chủNếu nội dung máy chủ của cảnh đã được tải, chuyển thư mục Máy chủ từ Workspace/ScenesServer quay trở lại thư mục [Cảnh]/Môi trường.
Dỡ tất cả các cảnhDi chuyển thư mục Khách hàngMáy chủ của mọi cảnh đã tải trở lại thư mục Môi trường của nó.

Lưu và tải ánh sáng

Dịch vụ Lighting ở cấp độ cao nhất lưu trữ tất cả các thuộc tính ánh sáng và hiệu ứng hình ảnh của một địa điểm. Vì đây là một dịch vụ cấp cao nhất, bạn không thể tự tay di chuyển nó đến thư mục Môi trường/Máy chủ hoặc Môi trường/Khách hàng của một cảnh cụ thể. Thay vào đó, bạn có thể sử dụng tiện ích để sao chép các thuộc tính và các đối tượng con của nó vào thư mục Môi trường/Ánh sáng của cảnh.

  1. Cấu hình các thuộc tính ánh sáng, các hiệu ứng hậu xử lý, các hiệu ứng khí quyển, và các skybox thông qua dịch vụ Lighting ở cấp độ cao nhất.

  2. Trong cửa sổ tiện ích Quản lý Cảnh, nhấp vào Lưu Ánh sáng cho cảnh mong muốn.

  3. Chọn và mở rộng cấu hình Môi trường/Ánh sáng của cảnh đó, và bạn sẽ thấy cùng các thuộc tính ánh sáng như các thuộc tính của thư mục, cũng như các đối tượng con đã sao chép của dịch vụ Lighting ở cấp độ cao nhất.

    Các đối tượng con đã sao chép
    Các thuộc tính đã lưu

    Khi các thuộc tính ánh sáng và các đối tượng con đã được lưu cho một cảnh, bạn có thể nhanh chóng tải chúng trở lại dịch vụ Lighting ở cấp độ cao nhất bằng cách nhấp vào Tải Ánh sáng từ cửa sổ tiện ích.

Lưu và tải địa hình

Terrain là một lớp cấp cao nhất trong Workspace, bạn không thể tự tay di chuyển địa hình được tạo hoặc điêu khắc đến thư mục Môi trường/Máy chủ hoặc Môi trường/Khách hàng của một cảnh cụ thể. Thay vào đó, bạn có thể sử dụng tiện ích để sao chép nó vào thư mục Môi trường/Địa hình của cảnh.

  1. Cấu hình địa hình cho cảnh thông qua dịch vụ Địa hình ở cấp độ cao nhất.

  2. Trong cửa sổ tiện ích Quản lý Cảnh, nhấp vào Lưu Địa hình cho cảnh mong muốn.

  3. Chọn và mở rộng thư mục Môi trường/Địa hình của cảnh đó và bạn sẽ thấy một đối tượng TerrainRegion đại diện cho địa hình đã lưu.

    Khi địa hình đã được lưu cho một cảnh, bạn có thể nhanh chóng tải lại nó vào dịch vụ Terrain ở cấp độ cao nhất bằng cách nhấp vào Tải Địa hình từ cửa sổ tiện ích.

Tham chiếu API

Các móc vòng đời lược đồ

OnSetup

Móc vòng đời OnSetup dành cho việc khởi tạo các tài sản và biến mà sẽ được tham chiếu trong OnRun hoặc OnEndScene, thiết lập các kết nối mà dự định kéo dài trong suốt thời gian của cảnh, v.v. Móc này nhận tham số timePositionObject cho phép bạn đọc thời gian hiện tại tại thời điểm thiết lập.

Lược đồ Khách hàng

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 (Khách hàng)")
-- Truy cập các môi trường của cảnh; không áp dụng cho Chế độ Nội tuyến
clientEnvironment = EventSequencer.getCurrentSceneEnvironment()
serverEnvironment = EventSequencer.getCurrentServerEnvironmentFromClient()
-- Chờ các tài sản
dummy = clientEnvironment:WaitForChild("Dummy")
print("Thời gian hiện tại là:", timePositionObject.Value)
end
Lược đồ Máy chủ

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 (Máy chủ)")
-- Truy cập môi trường cảnh; không áp dụng cho Chế độ Nội tuyến
serverEnvironment = EventSequencer.getCurrentSceneEnvironment()
partColorConnection = changePartColorEvent.OnServerEvent:Connect(function(player, changedPart, newColor)
serverEnvironment.changedPart.Color = newColor
end)
print("Thời gian hiện tại là:", timePositionObject.Value)
end

OnRun

OnRun là móc vòng đời hoạt động chính trong một lược đồ. Nó nên chứa tất cả các cấu hình có thời gian cho cảnh, từ việc phát âm thanh hoặc một hoạt ảnh đến lên lịch một sự kiện như một buổi biểu diễn pháo hoa.

Lược đồ Khách hàng

Schema.OnRun = function()
print("OnRun (Khách hàng)")
local MainAudio = Schema:audio({
StartTime = 1,
SoundId = "rbxassetid://1838673350",
OnStart = function(self)
print("Đang phát âm thanh")
end,
OnEnd = function(self)
print("Đã kết thúc âm thanh")
end
})
end

OnEndScene

Móc vòng đời OnEndScene hữu ích để dọn dẹp bất kỳ thứ gì còn lại trong cảnh, chẳng hạn như ngắt kết nối các kết nối được tạo trong OnSetup hoặc OnRun sẽ vẫn tồn tại trong suốt thời gian của cảnh.

Lược đồ Máy chủ

Schema.OnEndScene = function()
print("OnEndScene (Máy chủ)")
if partColorConnection then
partColorConnection:Disconnect()
partColorConnection = nil
end
end

Các cấu hình lược đồ

audio

Tạo một đối tượng Sound trong không gian làm việc sẽ phát vào một thời điểm nhất định. Âm thanh sau đó sẽ bị xóa sau khi cảnh kết thúc hoặc sau khi đối tượng Sound đã phát xong.

Khóa Cấu hình Mô tả
StartTimeKhi nào phát âm thanh liên quan đến thời gian của cảnh, tính bằng giây.
SoundIdID tài sản của âm thanh để phát.
OnStartHàm tùy chỉnh được kích hoạt khi âm thanh bắt đầu phát.
OnEndHàm tùy chỉnh được kích hoạt khi âm thanh kết thúc.
VolumeÂm lượng của đối tượng Sound; mặc định là 0.5.
Lược đồ Khách hàng

Schema.OnRun = function()
print("OnRun (Khách hàng)")
local MainAudio = Schema:audio({
StartTime = 1,
SoundId = "rbxassetid://1838673350",
OnStart = function(self)
print("Đang phát âm thanh")
end,
OnEnd = function(self)
print("Đã kết thúc âm thanh")
end
})
end

animate

Tạo một Animation sẽ phát vào một thời điểm nhất định.

Khóa Cấu hình Mô tả
StartTimeKhi nào phát hoạt ảnh liên quan đến thời gian của cảnh, tính bằng giây.
EndTimeThời điểm tùy chọn khi nào kết thúc hoạt ảnh liên quan đến thời gian của cảnh, tính bằng giây.
RigKhung hoạt ảnh để phát hoạt ảnh.
AnimationIdID tài sản của hoạt ảnh để phát.
SpeedTốc độ phát lại của hoạt ảnh; mặc định là 1.
FadeInTimeSố thời gian để làm mờ vào hoạt ảnh, tính bằng giây; mặc định là 0.2 (giây).
FadeOutTimeSố thời gian để làm mờ ra hoạt ảnh, tính bằng giây; mặc định là 0.2 (giây).
OnStartHàm tùy chỉnh được kích hoạt khi hoạt ảnh bắt đầu phát.
OnEndHàm tùy chỉnh được kích hoạt khi hoạt ảnh kết thúc.
LoopedCho biết liệu hoạt ảnh có vòng lặp hay không; mặc định là false.
SyncToAudioBảng xác định liệu có đồng bộ hoạt ảnh với cấu hình âm thanh hay không. Chấp nhận các khóa sau:
  • Audio – Tham chiếu đến cấu hình âm thanh.
  • StartAtAudioTime – Khi nào phát hoạt ảnh liên quan đến thời gian của âm thanh.
  • EndAtAudioTime – Thời gian tùy chọn khi nào kết thúc hoạt ảnh liên quan đến thời gian của âm thanh.
Lược đồ Khách hàng

Schema.OnRun = function()
print("OnRun (Khách hàng)")
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("Đang phát hoạt ảnh")
end,
OnEnd = function(self)
print("Đã dừng hoạt ảnh")
end
})
end

tween

Tạo một Tween có thể cấu hình mà sẽ được bảo toàn trong việc tìm kiếm và tham gia động, nghĩa là bạn có thể kết nối các tween ở các điểm thời gian khác nhau và mọi thứ sẽ phát và đồng bộ như mong đợi.

Khóa Cấu hình Mô tả
StartTimesBảng các thời điểm bắt đầu liên quan đến thời gian của cảnh, tính bằng giây.
TweenBảng xác định đối tượng và các thuộc tính để tween. Chấp nhận các khóa sau:
  • Object – Đối tượng để tween.
  • Info – phiên bản TweenInfo cho tween, xác định thời gian của nó, Enum.EasingStyle, Enum.EasingDirection, v.v.
  • Properties – Các thuộc tính của đối tượng và các giá trị mục tiêu liên quan đến tween.
OnStartHàm tùy chỉnh được kích hoạt khi tween bắt đầu phát.
OnHeartbeatHàm tùy chỉnh được kích hoạt trong mỗi Heartbeat; nhận alpha tween là tham số thứ hai.
OnEndHàm tùy chỉnh được kích hoạt khi tween hoàn thành phát.
SyncToAudioBảng xác định liệu có đồng bộ tween với cấu hình âm thanh hay không. Chấp nhận các khóa sau:
  • Audio – Tham chiếu đến cấu hình âm thanh.
  • StartAtAudioTimes – Bảng các thời điểm bắt đầu xác định khi nào phát tween liên quan đến thời gian của âm thanh.
Lược đồ Khách hàng

Schema.OnRun = function()
print("OnRun (Khách hàng)")
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("Đang phát tween")
end,
OnHeartbeat = function(self, alpha)
print("Alpha tween", alpha)
end,
OnEnd = function(self)
print("Tween đã hoàn thành")
end,
})
end

interval

Thực hiện một hàm gọi lại tùy chỉnh với thời gian nhất định ở một tần suất đã xác định, tính bằng giây. Hữu ích cho các sự kiện lặp lại như đèn nhấp nháy, tạo nhịp cho âm thanh, v.v. Tần suất thấp nhất có thể là 0 giây, nhưng thực tế tần suất tối thiểu luôn bị ràng buộc vào Heartbeat.

Khóa Cấu hình Mô tả
StartTimeThời điểm bắt đầu của khoảng thời gian liên quan đến thời gian của cảnh, tính bằng giây.
EndTimeThời điểm kết thúc của khoảng thời gian liên quan đến thời gian của cảnh, tính bằng giây.
FrequencyCách thường xuyên hàm OnInterval nên được kích hoạt, tính bằng giây, với lần thực thi đầu tiên vào StartTime.
OnStartHàm tùy chỉnh được kích hoạt khi chuỗi các khoảng thời gian bắt đầu.
OnIntervalHàm tùy chỉnh được kích hoạt trong mỗi khoảng thời gian trong khoảng thời gian đã xác định (StartTime đến EndTime).
OnEndHàm tùy chỉnh được kích hoạt khi chuỗi các khoảng thời gian kết thúc.
SyncToAudioBảng xác định liệu có đồng bộ khoảng thời gian với cấu hình âm thanh hay không. Chấp nhận các khóa sau:
  • Audio – Tham chiếu đến cấu hình âm thanh.
  • StartAtAudioTime – Khi nào bắt đầu khoảng thời gian liên quan đến thời gian của âm thanh.
  • EndAtAudioTime – Thời gian tùy chọn khi nào kết thúc khoảng thời gian liên quan đến thời gian của âm thanh.
Lược đồ Khách hàng

Schema.OnRun = function()
print("OnRun (Khách hàng)")
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

Tương tự như interval ngoại trừ việc bạn có thể xác định nhiều thời điểm bắt đầu cụ thể cho cùng một sự kiện, chẳng hạn như lên lịch cho một buổi biểu diễn pháo hoa hai lần trong một cảnh.

Khóa Cấu hình Mô tả
StartTimesBảng các thời điểm bắt đầu liên quan đến thời gian của cảnh, tính bằng giây.
OnStartHàm tùy chỉnh được kích hoạt tại mỗi thời điểm đã chỉ định trong bảng StartTimes.
SkippableBoolean xác định liệu sự kiện đã lên lịch có thể bị bỏ qua cho người dùng tham gia muộn, hoặc khi tìm kiếm trước thời gian bắt đầu đã lên lịch. Nếu được đặt thành false, tất cả các thời điểm bắt đầu sự kiện đã lên lịch trước thời gian tham gia/tìm kiếm sẽ xảy ra tại thời gian tham gia/tìm kiếm đó. Nếu được đặt thành true, chỉ các thời điểm bắt đầu sự kiện đã lên lịch sau thời gian tham gia/tìm kiếm sẽ xảy ra. Mặc định là false.
SyncToAudioBảng xác định liệu có đồng bộ lịch trình với cấu hình âm thanh hay không. Chấp nhận các khóa sau:
  • Audio – Tham chiếu đến cấu hình âm thanh.
  • StartAtAudioTimes – Bảng các thời điểm bắt đầu xác định khi nào kích hoạt hàm OnStart liên quan đến thời gian của âm thanh.
Lược đồ Khách hàng

Schema.OnRun = function()
print("OnRun (Khách hàng)")
Schema:schedule({
StartTimes = {5, 27.25},
OnStart = function(self)
-- Khởi tạo kết nối nhịp tim tạm thời
local tempConnection = RunService.Heartbeat:Connect(function()
end)
-- Thông báo cho khuôn khổ về kết nối
Schema:inform(tempConnection)
end
})
end

inform

Thông báo cho khuôn khổ bất kỳ mô-đun nào, đối tượng UI, kết nối, v.v. được tạo trong móc vòng đời OnRun, đảm bảo rằng chúng được dọn dẹp đúng cách khi tìm kiếm. Một số trường hợp sử dụng bao gồm:

  • Thông báo cho khuôn khổ về một kết nối tạm thời như RunService.Heartbeat để kết nối được dọn dẹp khi tìm kiếm đến một điểm trước đó trong thời gian của cảnh.

    Lược đồ Máy chủ

    Schema.OnRun = function()
    print("OnRun (Máy chủ)")
    Schema:schedule({
    StartTimes = {5},
    OnStart = function(self)
    -- Khởi tạo kết nối nhịp tim tạm thời
    local tempConnection = RunService.Heartbeat:Connect(function()
    end)
    -- Thông báo cho khuôn khổ về kết nối
    Schema:inform(tempConnection)
    end
    })
    end
  • Gọi một hàm "dọn dẹp" tùy chỉnh trong một ModuleScript khởi tạo một kết nối hoặc tham chiếu khác trong trong móc vòng đời OnRun.

    Lãnh thổ Máy chủ

    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 (Máy chủ)")
    Schema:schedule({
    StartTimes = {5},
    OnStart = function(self)
    -- Gọi hàm "khởi tạo" trong mô-đun tùy chỉnh
    customModule.init()
    -- Gọi hàm "dọn dẹp" trong mô-đun tùy chỉnh khi dọn dẹp cảnh
    Schema:inform(customModule, customModule.clean)
    end,
    })
    end
    ModuleScript - CustomModule

    local RunService = game:GetService("RunService")
    local CustomModule = {}
    CustomModule.init = function()
    -- Khởi tạo kết nối nhịp tim
    CustomModule.connection = RunService.Heartbeat:Connect(function()
    end)
    end
    CustomModule.clean = function()
    -- Ngắt kết nối và xóa kết nối nhịp tim
    if CustomModule.connection then
    CustomModule.connection:Disconnect()
    CustomModule.connection = nil
    end
    end
    return CustomModule

Các chức năng

loadScene

loadScene(sceneName: string, startTime: number ?)

Tải chương trình một cảnh theo sceneName và bắt đầu nó tại startTime từ đầu. Sẽ có một "thời gian ân hạn" 5 giây cho cảnh tải từ máy chủ trước khi tìm kiếm xảy ra và cảnh bắt đầu phát. Điều này có nghĩa là nếu bạn gọi loadScene("[TênCảnh]", 20) vào lúc chính xác 4:15:00 PM, khuôn khổ sẽ chờ 5 giây ngoài 20 giây đã yêu cầu, khởi động cảnh tại 4:15:25 PM.

Script

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- Tìm cảnh tiếp theo để tải khi cảnh hiện tại hoàn thành
EventSequencer.onOrchestrationFinished:Connect(function(endedSceneName)
if endedSceneName == "PreShow" then
-- "PreShow" đã kết thúc; tải cảnh đầu tiên trong buổi hòa nhạc
EventSequencer.loadScene("Track1")
elseif endedSceneName == "Track1" then
-- "Track1" đã kết thúc; tải cảnh thứ hai trong buổi hòa nhạc
EventSequencer.loadScene("Track2")
else
-- Quay lại cảnh trước buổi hòa nhạc
EventSequencer.loadScene("PreShow")
end
end)

createSchema

createSchema(): table

Trả về một phiên bản của lược đồ cảnh để tạo logic cho cảnh.

Lược đồ Khách hàng

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
local Schema = EventSequencer.createSchema()
Schema.OnSetup = function(timePositionObject)
print("OnSetup (Khách hàng)")
end

seek

seek(time: number)

Tìm kiếm đến giá trị time, tính bằng giây, từ đầu của cảnh hiện tại đã được tải.

Script

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
EventSequencer.seek(95.58)

setSceneWarningTime

setSceneWarningTime(endSceneTimeWindow: number)

Đặt số thời gian từ cuối của tất cả các cảnh mà một cảnh báo được phát đi. Bạn có thể phát hiện cảnh báo này ở phía khách hàng thông qua onSceneEndingWarningForClient hoặc ở phía máy chủ thông qua onSceneEndingWarningForServer.

Script

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- Tải cảnh
EventSequencer.loadScene("Cảnh Đẹp")
-- Đặt thời gian cảnh báo là 5 giây trước khi cảnh kết thúc
EventSequencer.setSceneWarningTime(5)
-- Phát hiện khi cảnh sắp kết thúc
EventSequencer.onSceneEndingWarningForServer:Connect(function()
warn("Cảnh sắp kết thúc!")
end)

setSeekingPermissions

setSeekingPermissions(permissions: table)

Cấp quyền tìm kiếm dựa trên PlaceId của sự kiện cũng như UserIds cụ thể và/hoặc nhóm và các vai trò trong đó. Xem tìm kiếm và chuyển đổi cảnh để biết thêm thông tin.

getCurrentSceneEnvironment

getCurrentSceneEnvironment(): Folder (YIELDS)

Trả về thư mục Môi trường của cảnh hiện tại phía khách hàng hoặc phía máy chủ, tùy thuộc vào việc nó được gọi từ mô-đun lược đồ Khách hàng hay mô-đun lược đồ Máy chủ.

Lược đồ Khách hàng

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 (Khách hàng)")
-- Truy cập các môi trường của cảnh; không áp dụng cho Chế độ Nội tuyến
clientEnvironment = EventSequencer.getCurrentSceneEnvironment()
serverEnvironment = EventSequencer.getCurrentServerEnvironmentFromClient()
print("Thời gian hiện tại là:", timePositionObject.Value)
end
Lược đồ Máy chủ

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 (Máy chủ)")
serverEnvironment = EventSequencer.getCurrentSceneEnvironment()
partColorConnection = changePartColorEvent.OnServerEvent:Connect(function(player, changedPart, newColor)
serverEnvironment.changedPart.Color = newColor
end)
end

getCurrentServerEnvironmentFromClient

getCurrentServerEnvironmentFromClient(): Folder (YIELDS)

Trả về thư mục Môi trường của cảnh hiện tại mới . Khác với getCurrentSceneEnvironment, bạn có thể gọi điều này từ mô-đun lược đồ Khách hàng.

Lược đồ Khách hàng

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 (Khách hàng)")
-- Truy cập các môi trường của cảnh; không áp dụng cho Chế độ Nội tuyến
clientEnvironment = EventSequencer.getCurrentSceneEnvironment()
serverEnvironment = EventSequencer.getCurrentServerEnvironmentFromClient()
print("Thời gian hiện tại là:", timePositionObject.Value)
end

isLoadingScene

isLoadingScene(): boolean

Gọi từ máy chủ để biết liệu một cảnh hiện đang được tải hay không.

Script

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
print(EventSequencer.isLoadingScene())
while EventSequencer.isLoadingScene() do
task.wait()
end
print("Cảnh đã được tải")

Sự kiện

onSceneEndingWarningForClient

Kích hoạt trên phía khách hàng trước khi cảnh sắp kết thúc. Thời gian mặc định là 3 giây, nhưng bạn có thể cấu hình nó thông qua setSceneWarningTime. Sự kiện này chỉ có thể được kết nối trong một LocalScript.

LocalScript

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- Phát hiện khi cảnh sắp kết thúc (ở phía khách hàng)
EventSequencer.onSceneEndingWarningForClient:Connect(function()
warn("Cảnh sắp kết thúc!")
end)

onSceneEndingWarningForServer

Kích hoạt trên phía máy chủ trước khi cảnh sắp kết thúc. Thời gian mặc định là 3 giây, nhưng bạn có thể cấu hình nó thông qua setSceneWarningTime. Sự kiện này chỉ có thể được kết nối trong một Script.

Script

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- Phát hiện khi cảnh sắp kết thúc (ở phía máy chủ)
EventSequencer.onSceneEndingWarningForServer:Connect(function()
warn("Cảnh sắp kết thúc!")
end)

onSceneLoadedForClient

Kích hoạt trên phía khách hàng khi cảnh bắt đầu. Sự kiện này chỉ có thể được kết nối trong một LocalScript.

LocalScript

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- Phát hiện khi cảnh đang bắt đầu (ở phía khách hàng)
EventSequencer.onSceneLoadedForClient:Connect(function()
warn("Cảnh đang bắt đầu!")
end)

onOrchestrationFinished

Kích hoạt trên phía máy chủ khi một cảnh đã đạt đến thời gian dài của nó và đã kết thúc. Sự kiện này nhận một chuỗi tên tham số endedSceneName cho cảnh vừa hoàn thành và bạn có thể dựa vào sự kiện này để tải một cảnh khác một cách điều kiện. Chỉ có thể được kết nối trong một Script.

Script

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- Tìm cảnh tiếp theo để tải khi cảnh hiện tại hoàn thành
EventSequencer.onOrchestrationFinished:Connect(function(endedSceneName)
if endedSceneName == "PreShow" then
-- "PreShow" đã kết thúc; tải cảnh đầu tiên trong buổi hòa nhạc
EventSequencer.loadScene("Track1")
elseif endedSceneName == "Track1" then
-- "Track1" đã kết thúc; tải cảnh thứ hai trong buổi hòa nhạc
EventSequencer.loadScene("Track2")
else
-- Quay lại cảnh trước buổi hòa nhạc
EventSequencer.loadScene("PreShow")
end
end)
©2026 Roblox Corporation. Roblox, logo Roblox và Powering Imagination là các nhãn hiệu đã đăng ký và chưa đăng ký của chúng tôi tại Hoa Kỳ và các quốc gia khác.