Trình tự sự kiện là một khung mạnh mẽ cho phép bạn xây dựng các sự kiện và cảnh cắt ngang trực tiếp, đa máy chủ dựa trên một chuỗi 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 ngang trên một khung có cấu trúc thông qua các cấu hình âm thanh, hoạt ảnh và tween đã 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 qua một sự kiện và xem trước trò chơi để thử nghiệm và phát triển.
Khung này đã được kiểm tra trong các sự kiện Roblox như Twenty One Pilots và 24kGoldn, cũng như nhiều trò chơi có lượng truy cập cao.
Để xem Trình tự sự kiện hoạt động trong một nơi 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 ra các 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 khung Trình tự sự kiện trong một trò chơi:
Từ menu Cửa sổ của Studio hoặc thanh công cụ tab Trang chủ, mở Hộp công cụ và chọn tab Cửa hàng Tạo.

Đảm bảo rằng phân loại Mô hình được chọn, 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 Trình tự sự kiện và nhấp vào nó, hoặc kéo và thả nó vào chế độ xem 3D.

Trong cửa sổ Khám phá, di chuyển toàn bộ mô-đun Trình tự sự kiện vào ServerScriptService. Khi chạy trò chơi, mô-đun sẽ bắt đầu chạy.
Chế độ khung
Chế độ thay thế
Chế độ khung 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, thuộc tính ánh sáng, 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, các đố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ó để tạo thành một không gian sao chép.
Chế độ nội tuyến
Một chế độ khung thay thế là chế độ nội tuyến trong đó bạn cũng thiết kế các cảnh độc đáo với logic kịch bản cho dòng chảy/sự kiện của chúng, nhưng khung sẽ không phá hủy các đối tượng 3D, địa hình, thuộc tính ánh sáng, hiệu ứng môi trường, và các đối tượng giao diện người dùng hiện có để sao chép tài sản/thuộc tính từ thư mục Môi trường của cảnh khi tải.
Để kích hoạt chế độ nội tuyến:
Bên trong mô-đun Trình tự sự kiện mà bạn đã đặt trong ServerScriptService, khoan xuố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 ngang được gói trong một loạt các thư mục. Mỗi cảnh chứa logic kịch bản xác định dòng chảy/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, thuộc tính ánh sáng, hiệu ứng môi trường, và các đối tượng giao diện người dùng của riêng nó.
Để bắt đầu nhanh chóng, bạn có thể tìm thấy một cảnh trống bên trong thư mục chính của mô-đun:
Mở rộng thư mục Trình tự sự kiện và tìm 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.

Độ dài thời gian
Mỗi cảnh nên có một độ dài thời gian, 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 cố định. Độ dài thời gian được xác định là một thuộc tính số trên 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à 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, các đố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ó để tạo thành một không gian sao chép.
Thư mục Môi trường chứa các container sau:
| Container | 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 rig hoạt ảnh. |
| PlayerSpawns | Chứa các phần mà 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ột máy chủ. Nên đặt hầu hết các tài sản hình ảnh ở đây. |
| Địa hình | Chứa địa hình của cảnh. |
| Ánh sáng | Chứa các thuộc tính ánh sáng toàn cầu dưới dạng thuộc tính, cũng như các bộ điều chỉnh như hiệu ứng khí quyển và hiệu ứng xử lý hậu kỳ. |
Sự kiện
Thư mục Sự kiện của một cảnh chỉ là một vị trí giữ chỗ cho RemoteEvents giao tiếp giữa các mô-đun Khách hàng và Máy chủ. Không bắt buộc 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 thi logic lược đồ trên khách hàng.
Máy chủ
Kịch bản này thực thi logic lược đồ trên máy chủ.
Lược đồ cảnh
Lược đồ của một cảnh lược đồ xác định những gì xảy ra vào thời đ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ả mô-đun Khách hàng và Máy chủ của nó và bao gồm móc vòng đời để quản lý khi cấu hình xảy ra.
Móc vòng đời
Móc vòng đời lược đồ cho phép bạn quản lý khi các hoạt động của cảnh xảy ra. Một cảnh trong sản xuất sẽ thường chạy theo 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 cũng 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 trình diễn pháo hoa, và nhiều hơn nữa. Mỗi cấu hình hỗ trợ một số hàm callback nhất định trong đó tham số đầu tiên (self) là thể hiện cấu hình.
Tìm kiếm cảnh
Một tính năng độc đáo của Trình tự 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 qua 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 đa cảnh trước khi triển khai nó vào sản xuất.
Tìm kiếm cảnh không thể truy cập cho tất cả mọi người vì người dùng chỉ đơn giản là 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ư các UserIds cụ thể và/hoặc nhóm và vai trò trong đó.
Tạo một Script mới trong ServerScriptService.
Dán mã sau vào kịch bản mới.
Kịch bản - Đặ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 cuộc gọi setSeekingPermissions như sau:
placeIDs Danh sách các giá trị PlaceId phân tách bằng dấu phẩy để hỗ trợ tìm kiếm bên trong. userIDs Danh sách các giá trị UserIds phân tách bằng dấu phẩy cho những người có thể tìm kiếm bên trong các nơi được hỗ trợ. groups Danh sách các bảng phân tách bằng dấu phẩy, mỗi bảng chứa một ID nhóm và cấp bậc tối thiểu của các thành viên trong nhóm đó có thể tìm kiếm bên trong các nơi được hỗ trợ.
Plugin quản lý cảnh
Plugin Quản lý Cảnh là một công cụ hữu ích để tải và dỡ bỏ các cảnh, ánh sáng, và địa hình. Trừ khi bạn đang sử dụng Chế độ nội tuyến, rất khuyến khích bạn sử dụng plugin này thay vì tự tay đặt/chỉnh sửa các đối tượng và thuộc tính cảnh.
Để cài đặt plugin:
Từ menu Cửa sổ của Studio hoặc thanh công cụ tab Trang chủ, mở Hộp công cụ.
Với tab Cửa hàng Tạo được chọn, chọn Plugin từ menu thả xuống.
Trong trường tìm kiếm, gõ Quản lý Cảnh và nhấn Enter để tìm plugin.

Nhấp vào biểu tượng của plugin để xem chi tiết của nó và sau đó nhấp vào nút Cài đặt.
Khi plugin được cài đặt, nó sẽ xuất hiện trong tab Plugin của Studio.
Tải và dỡ bỏ cảnh
Như đã nêu trong tạo 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. Plugin giúp bạn nhanh chóng tải 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 plugin | Mô tả |
|---|---|
| Tải Khách hàng | Nếu nội dung khách hàng của cảnh bị dỡ bỏ, di 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ỏ, di chuyển thư mục Môi trường/Máy chủ của nó vào thư mục Workspace/ScenesServer. |
| Dỡ bỏ Khách hàng | Nếu nội dung khách hàng của cảnh đã được tải, di chuyển thư mục Khách hàng của nó từ Workspace/ScenesClient trở lại thư mục [Cảnh]/Môi trường. |
| Dỡ bỏ Máy chủ | Nếu nội dung máy chủ của cảnh đã được tải, di chuyển thư mục Máy chủ của nó từ Workspace/ScenesServer trở lại thư mục [Cảnh]/Môi trường. |
| Dỡ bỏ Tất 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 nơi. Vì đây là một dịch vụ cấp cao nhất, bạn không thể di chuyển nó thủ công đế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 plugin để sao chép các thuộc tính và trẻ em 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, hiệu ứng xử lý hậu kỳ, hiệu ứng khí quyển, và skyboxes của cảnh thông qua dịch vụ Lighting cấp cao nhất.

Trong cửa sổ plugin 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ác thuộc tính ánh sáng giống như thuộc tính của thư mục, cũng như các trẻ em sao chép của dịch vụ Lighting cấp cao nhất.

Các thể hiện đã sao chép 
Các thuộc tính đã lưu Khi các thuộc tính và trẻ em ánh sáng đã đượ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ổ plugin.
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ể di chuyển thủ công địa hình được tạo ra 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 plugin để 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 của cảnh thông qua dịch vụ Địa hình cấp cao nhất.

Trong cửa sổ plugin 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 nó trở lại 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ổ plugin.
Tham chiếu API
Móc vòng đời lược đồ
OnSetup
Móc vòng đời OnSetup được thiết kế để khởi tạo các tài sản và biến sẽ được tham chiếu trong OnRun hoặc OnEndScene, thiết lập kết nối mà dự kiến sẽ 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.
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 môi trường cảnh; không áp dụng cho Chế độ Nội tuyến
clientEnvironment = EventSequencer.getCurrentSceneEnvironment()
serverEnvironment = EventSequencer.getCurrentServerEnvironmentFromClient()
-- Chờ tài sản
dummy = clientEnvironment:WaitForChild("Dummy")
print("Thời gian hiện tại là:", timePositionObject.Value)
endlocal ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
local Schema = EventSequencer.createSchema()
local serverEnvironment
local partColorConnection
local changePartColorEvent = script.Parent.Events.ChangePartColor
Schema.OnSetup = function(timePositionObject)
print("OnSetup (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)
endOnRun
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 theo thời gian cho cảnh, từ việc phát âm thanh hoặc một hoạt ảnh đến việc lên lịch một sự kiện như một buổi trình diễn pháo hoa.
Schema.OnRun = function()
print("OnRun (Khách hàng)")
local MainAudio = Schema:audio({
StartTime = 1,
SoundId = "rbxassetid://1838673350",
OnStart = function(self)
print("Âm thanh đang phát")
end,
OnEnd = function(self)
print("Âm thanh đã kết thúc")
end
})
endOnEndScene
Móc vòng đời OnEndScene hữu ích cho việc dọn dẹp bất cứ điều 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 mà vẫn còn trong suốt thời gian của cảnh.
Schema.OnEndScene = function()
print("OnEndScene (Máy chủ)")
if partColorConnection then
partColorConnection:Disconnect()
partColorConnection = nil
end
endCấu hình lược đồ
audio
Tạo một đối tượng Sound trong không gian làm việc mà phát tại 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 hoàn thành phát.
| Khóa Cấu hình | Mô tả |
|---|---|
| StartTime | Khi nào phát âm thanh liên quan đến độ dài 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 để kích hoạt khi âm thanh bắt đầu phát. |
| OnEnd | Hàm tùy chỉnh để kích hoạt khi âm thanh kết thúc phát. |
| Volume | Âm lượng của đối tượng Sound; mặc định là 0.5. |
Schema.OnRun = function()
print("OnRun (Khách hàng)")
local MainAudio = Schema:audio({
StartTime = 1,
SoundId = "rbxassetid://1838673350",
OnStart = function(self)
print("Âm thanh đang phát")
end,
OnEnd = function(self)
print("Âm thanh đã kết thúc")
end
})
endanimate
Tạo một Animation mà phát tại 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 độ dài cảnh, tính bằng giây. |
| EndTime | Thời gian tùy chọn khi nào kết thúc hoạt ảnh liên quan đến độ dài cảnh, tính bằng giây. |
| Rig | Rig 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 để kích hoạt khi hoạt ảnh bắt đầu phát. |
| OnEnd | Hàm tùy chỉnh để kích hoạt khi hoạt ảnh kết thúc phát. |
| Looped | Liệu có lặp lại hoạt ảnh hay không; mặc định là false. |
| SyncToAudio | Bảng xác định liệu có đồng bộ hóa hoạt ảnh với một cấu hình âm thanh hay không. Chấp nhận các khóa sau:
|
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("Hoạt ảnh đang phát")
end,
OnEnd = function(self)
print("Hoạt ảnh đã dừng")
end
})
endtween
Tạo một Tween có thể cấu hình mà được bảo tồn trong việc tìm kiếm và trong việc tham gia động, có nghĩa là bạn có thể xâu chuỗi các tween tại các điểm khác nhau trong thời gian 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 gian bắt đầu liên quan đến độ dài 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 để kích hoạt khi tween bắt đầu phát. |
| OnHeartbeat | Hàm tùy chỉnh để kích hoạt trên mỗi Heartbeat; nhận alpha tween làm tham số thứ hai. |
| OnEnd | Hàm tùy chỉnh để kích hoạt khi tween hoàn thành phát. |
| SyncToAudio | Bảng xác định liệu có đồng bộ hóa tween với một cấu hình âm thanh hay không. Chấp nhận các khóa sau:
|
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("Tween đang phát")
end,
OnHeartbeat = function(self, alpha)
print("Alpha tween", alpha)
end,
OnEnd = function(self)
print("Tween đã hoàn thành")
end,
})
endinterval
Thực thi một hàm callback tùy chỉnh trong một khoảng thời gian xác định với 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, làm cho cường độ âm thanh nhấp nháy, v.v. Tần suất thấp nhất có thể là 0 giây, nhưng về kỹ thuật, tần suất tối thiểu luôn bị giới hạn ở 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 độ dài 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 độ dài 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 là tại StartTime. |
| OnStart | Hàm tùy chỉnh để kích hoạt khi chuỗi các khoảng thời gian bắt đầu. |
| OnInterval | Hàm tùy chỉnh để kích hoạt tại 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 để 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ộ hóa khoảng thời gian với một cấu hình âm thanh hay không. Chấp nhận các khóa sau:
|
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,
})
endschedule
Tương tự như interval ngoại trừ bạn có thể xác định nhiều thời gian bắt đầu cụ thể cho cùng một sự kiện, chẳng hạn như lên lịch một buổi trình 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 gian bắt đầu liên quan đến độ dài cảnh, tính bằng giây. |
| OnStart | Hàm tùy chỉnh để kích hoạt tại mỗi thời điểm được 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 gian bắt đầu sự kiện đã lên lịch trước thời điểm tham gia/tìm kiếm sẽ xảy ra tại thời điểm tham gia/tìm kiếm đó. Nếu được đặt thành true, chỉ các thời gian bắt đầu đã lên lịch sau thời điểm 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ộ hóa lịch trình với một cấu hình âm thanh hay không. Chấp nhận các khóa sau:
|
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 khung về kết nối
Schema:inform(tempConnection)
end
})
endinform
Thông báo cho khung về bất kỳ mô-đun, đối tượng UI, kết nối, v.v. nào được tạo trong móc vòng đời OnRun, đảm bảo chúng được dọn dẹp đúng cách khi tìm kiếm. Các trường hợp sử dụng bao gồm:
Thông báo cho khung 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 sớm hơn trong độ dài 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 khung 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 móc vòng đời OnRun.
Lược đồ 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 "init" trong mô-đun tùy chỉnhcustomModule.init()-- Gọi hàm "clean" 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
Hàm
loadScene
loadScene(sceneName: string, startTime: number ?)
Tải một cảnh theo chương trình bằng sceneName và bắt đầu nó tại startTime từ đầu. Sẽ có một "thời gian ân hạn" 5 giây để 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("[SceneName]", 20) vào đúng 4:15:00 PM, khung sẽ chờ 5 giây ngoài thời gian 20 giây đã yêu cầu, bắt đầu cảnh vào lúc 4:15:25 PM.
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 kết thúc
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 biểu diễn
EventSequencer.loadScene("PreShow")
end
end)createSchema
createSchema(): table
Trả về một thể hiện của lược đồ cảnh để tạo logic cho cảnh.
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)")
endseek
seek(time: number)
Tìm kiếm đến giá trị time, tính bằng giây, từ đầu cảnh hiện đang tải.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
EventSequencer.seek(95.58)setSceneWarningTime
setSceneWarningTime(endSceneTimeWindow: number)
Đặt khoảng thời gian từ cuối 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.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- Tải cảnh
EventSequencer.loadScene("BeautifulScene")
-- Đặ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ư các UserIds cụ thể và/hoặc nhóm và 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 máy chủ, tùy thuộc vào việc nó được gọi từ kịch bản lược đồ Khách hàng hay Máy chủ.
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 môi trường 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)
endlocal ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
local Schema = EventSequencer.createSchema()
local serverEnvironment
local partColorConnection
local changePartColorEvent = script.Parent.Events.ChangePartColor
Schema.OnSetup = function(timePositionObject)
print("OnSetup (Máy chủ)")
serverEnvironment = EventSequencer.getCurrentSceneEnvironment()
partColorConnection = changePartColorEvent.OnServerEvent:Connect(function(player, changedPart, newColor)
serverEnvironment.changedPart.Color = newColor
end)
endgetCurrentServerEnvironmentFromClient
getCurrentServerEnvironmentFromClient(): Folder (YIELDS)
Trả về thư mục Môi trường máy chủ của cảnh hiện tại. Không giống như getCurrentSceneEnvironment, bạn có thể gọi điều này từ kịch bản 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 môi trường 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)
endisLoadingScene
isLoadingScene(): boolean
Gọi từ máy chủ để biết liệu một cảnh hiện đang tải hay không.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
print(EventSequencer.isLoadingScene())
while EventSequencer.isLoadingScene() do
task.wait()
end
print("Cảnh đã tải")Sự kiện
onSceneEndingWarningForClient
Kích hoạt trên 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.
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 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.
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 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.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- Phát hiện khi cảnh 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 máy chủ khi một cảnh đã đạt đến độ dài thời gian của nó và đã kết thúc hiệu quả. Sự kiện này nhận một tham số chuỗi endedSceneName cho tên cảnh vừa kết thúc và bạn có thể xâu chuỗi từ sự kiện này để có điều kiện tải một cảnh khác. Chỉ có thể kết nối trong một 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 kết thúc
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 biểu diễn
EventSequencer.loadScene("PreShow")
end
end)