Trình tự 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.

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 Pilots24kGoldn, 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:

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

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

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

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

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

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

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

  1. Mở rộng thư mục Trình tự sự kiện và tìm 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.

Độ 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ánghiệ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:

ContainerMô 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 rig hoạt ảnh.
PlayerSpawnsChứ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ìnhChứa địa hình của cảnh.
Ánh sángChứ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ểnhiệ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àngMá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àngMá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 đó.

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

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

    Kịch bản - Đặ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 cuộc gọi setSeekingPermissions như sau:

    placeIDsDanh 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.
    userIDsDanh 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ợ.
    groupsDanh 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:

  1. Từ menu Cửa sổ của Studio hoặc thanh công cụ tab Trang chủ, mở Hộp công cụ.

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

  3. Trong trường tìm kiếm, gõ Quản lý Cảnh và nhấn Enter để tìm plugin.

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

  5. 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 pluginMô tả
Tải Khách hàngNế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àngNế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ả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 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.

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

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

  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á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

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.

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

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

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

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

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("Âm thanh đang phát")
end,
OnEnd = function(self)
print("Âm thanh đã kết thúc")
end
})
end

OnEndScene

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.

Lược đồ Máy chủ
Schema.OnEndScene = function()
print("OnEndScene (Máy chủ)")
if partColorConnection then
partColorConnection:Disconnect()
partColorConnection = nil
end
end

Cấ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ả
StartTimeKhi nào phát âm thanh liên quan đến độ dài 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 để kích hoạt khi âm thanh bắt đầu phát.
OnEndHà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.
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("Âm thanh đang phát")
end,
OnEnd = function(self)
print("Âm thanh đã kết thúc")
end
})
end

animate

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ả
StartTimeKhi nào phát hoạt ảnh liên quan đến độ dài cảnh, tính bằng giây.
EndTimeThờ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.
RigRig 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 để kích hoạt khi hoạt ảnh bắt đầu phát.
OnEndHàm tùy chỉnh để kích hoạt khi hoạt ảnh kết thúc phát.
LoopedLiệu có lặp lại hoạt ảnh hay không; mặc định là false.
SyncToAudioBả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:
  • Audio – Tham chiếu đến một cấu hình âm thanh.
  • StartAtAudioTime – Khi nào phát hoạt ảnh liên quan đến độ dài âm thanh.
  • EndAtAudioTime – Thời gian tùy chọn khi nào kết thúc hoạt ảnh liên quan đến độ dài â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("Hoạt ảnh đang phát")
end,
OnEnd = function(self)
print("Hoạt ảnh đã dừng")
end
})
end

tween

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ả
StartTimesBảng các thời gian bắt đầu liên quan đến độ dài 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 – Thể hiện TweenInfo cho tween, xác định độ dài 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 để kích hoạt khi tween bắt đầu phát.
OnHeartbeatHàm tùy chỉnh để kích hoạt trên mỗi Heartbeat; nhận alpha tween làm tham số thứ hai.
OnEndHàm tùy chỉnh để kích hoạt khi tween hoàn thành phát.
SyncToAudioBả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:
  • Audio – Tham chiếu đến một cấu hình âm thanh.
  • StartAtAudioTimes – Bảng các thời gian bắt đầu xác định khi nào phát tween liên quan đến độ dài â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("Tween đang phát")
end,
OnHeartbeat = function(self, alpha)
print("Alpha tween", alpha)
end,
OnEnd = function(self)
print("Tween đã hoàn thành")
end,
})
end

interval

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ả
StartTimeThờ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.
EndTimeThờ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.
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 là tại StartTime.
OnStartHàm tùy chỉnh để kích hoạt khi chuỗi các khoảng thời gian bắt đầu.
OnIntervalHà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).
OnEndHàm tùy chỉnh để 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ộ 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:
  • Audio – Tham chiếu đến một cấu hình âm thanh.
  • StartAtAudioTime – Khi nào bắt đầu khoảng thời gian liên quan đến độ dài â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 độ dài â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ừ 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ả
StartTimesBảng các thời gian bắt đầu liên quan đến độ dài cảnh, tính bằng giây.
OnStartHàm tùy chỉnh để kích hoạt tại mỗi thời điểm được 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 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.
SyncToAudioBả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:
  • Audio – Tham chiếu đến một cấu hình âm thanh.
  • StartAtAudioTimes – Bảng các thời gian bắt đầu xác định khi nào kích hoạt hàm OnStart liên quan đến độ dài â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 khung về kết nối
Schema:inform(tempConnection)
end
})
end

inform

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ời
    local tempConnection = RunService.Heartbeat:Connect(function()
    end)
    -- Thông báo cho khung 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 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ỉnh
    customModule.init()
    -- Gọi hàm "clean" 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

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.

Kịch bản
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.

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ảnh hiện đang tải.

Kịch bản
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.

Kịch bản
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ủ.

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

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)
end

isLoadingScene

isLoadingScene(): boolean

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

Kịch bản
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.

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.

Kịch bản
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.

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.

Kịch bản
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)
©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.