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 Pilots và 24kGoldn, 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:
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.

Đả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.

Tìm và nhấp vào ô Gói.
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.

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:
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.

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:
Mở rộng thư mục Bộ điều phối sự kiện và định vị thư mục Cảnh trống.

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áng và cá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ứa | Mô tả |
|---|---|
| Khách hàng | Chứ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ơi | Chứ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ình | Chứa địa hình cảnh. |
| Ánh sáng | Chứ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ển và hậ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àng và Má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àng và Má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 đó.
Tạo một Script mới trong ServerScriptService.
Dán mã sau vào kịch bản mới.
Script - Đặt Quyền Tìm Kiếmlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))EventSequencer.setSeekingPermissions({placeIDs = {},userIDs = {},groups = {{GroupID = , MinimumRankID = },}})Điền vào các bảng sau trong lời gọi setSeekingPermissions như sau:
placeIDs Danh 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 đó. userIDs Danh 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ợ. groups Danh 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:
Từ menu Cửa sổ trong Studio hoặc thanh công cụ Trang chủ, mở Bảng công cụ.
Với tab Cửa hàng tạo được chọn, chọn Tiện ích từ menu thả xuống.
Trong trường tìm kiếm, nhập Quản lý Cảnh và nhấn Enter để tìm tiện ích.

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.
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 ích | Mô tả |
|---|---|
| Tải khách hàng | Nế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àng | Nế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ảnh | Di chuyển thư mục Khách hàng và Má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.
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.

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.
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
Vì 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.
Cấu hình địa hình cho cảnh thông qua dịch vụ Địa hình ở cấp độ cao nhất.

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.
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ả |
|---|---|
| StartTime | Khi nào phát âm thanh liên quan đến thời gian của cảnh, tính bằng giây. |
| SoundId | ID tài sản của âm thanh để phát. |
| OnStart | Hàm tùy chỉnh được kích hoạt khi âm thanh bắt đầu phát. |
| OnEnd | Hà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ả |
|---|---|
| StartTime | Khi nào phát hoạt ảnh liên quan đến thời gian của cảnh, tính bằng giây. |
| EndTime | Thờ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. |
| Rig | Khung hoạt ảnh để phát hoạt ảnh. |
| AnimationId | ID tài sản của hoạt ảnh để phát. |
| Speed | Tốc độ phát lại của hoạt ảnh; mặc định là 1. |
| FadeInTime | Số 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). |
| FadeOutTime | Số thời gian để làm mờ ra hoạt ảnh, tính bằng giây; mặc định là 0.2 (giây). |
| OnStart | Hàm tùy chỉnh được kích hoạt khi hoạt ảnh bắt đầu phát. |
| OnEnd | Hàm tùy chỉnh được kích hoạt khi hoạt ảnh kết thúc. |
| Looped | Cho biết liệu hoạt ảnh có vòng lặp hay không; mặc định là false. |
| SyncToAudio | Bả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:
|
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ả |
|---|---|
| StartTimes | Bả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. |
| Tween | Bảng xác định đối tượng và các thuộc tính để tween. Chấp nhận các khóa sau:
|
| OnStart | Hàm tùy chỉnh được kích hoạt khi tween bắt đầu phát. |
| OnHeartbeat | Hàm tùy chỉnh được kích hoạt trong mỗi Heartbeat; nhận alpha tween là tham số thứ hai. |
| OnEnd | Hàm tùy chỉnh được kích hoạt khi tween hoàn thành phát. |
| SyncToAudio | Bả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:
|
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ả |
|---|---|
| StartTime | Thờ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. |
| EndTime | Thờ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. |
| Frequency | Cá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. |
| OnStart | Hàm tùy chỉnh được kích hoạt khi chuỗi các khoảng thời gian bắt đầu. |
| OnInterval | Hà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). |
| OnEnd | Hàm tùy chỉnh được kích hoạt khi chuỗi các khoảng thời gian kết thúc. |
| SyncToAudio | Bả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:
|
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ả |
|---|---|
| StartTimes | Bả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. |
| OnStart | Hàm tùy chỉnh được kích hoạt tại mỗi thời điểm đã chỉ định trong bảng StartTimes. |
| Skippable | Boolean 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. |
| SyncToAudio | Bả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:
|
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ờilocal tempConnection = RunService.Heartbeat:Connect(function()end)-- Thông báo cho khuôn khổ về kết nốiSchema:inform(tempConnection)end})endGọ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ỉnhcustomModule.init()-- Gọi hàm "dọn dẹp" trong mô-đun tùy chỉnh khi dọn dẹp cảnhSchema:inform(customModule, customModule.clean)end,})endModuleScript - CustomModulelocal RunService = game:GetService("RunService")local CustomModule = {}CustomModule.init = function()-- Khởi tạo kết nối nhịp timCustomModule.connection = RunService.Heartbeat:Connect(function()end)endCustomModule.clean = function()-- Ngắt kết nối và xóa kết nối nhịp timif CustomModule.connection thenCustomModule.connection:Disconnect()CustomModule.connection = nilendendreturn 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.
Scriptlocal 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.
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))print(EventSequencer.isLoadingScene())while EventSequencer.isLoadingScene() dotask.wait()endprint("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)