이벤트 시퀀서는 구조화된 동작 및 트리거 시퀀스를 기반으로 라이브, 크로스 서버 이벤트 및 컷신을 구축할 수 있게 해주는 강력한 프레임워크입니다. 보다 구체적으로, 이 모듈은 다음을 도와줍니다:
- 오디오, 애니메이션 및 트윈의 예약된 구성을 통해 구조화된 프레임워크에서 이벤트 또는 컷신을 구축합니다.
- 여러 서버에 걸쳐 여러 장면 간 전환을 수행하고 복잡한 애니메이션 및 비주얼을 타임라인에 동기화합니다.
- 이벤트를 탐색하고 테스트 및 개발 목적으로 게임을 미리 볼 수 있습니다.
이 프레임워크는 Twenty One Pilots 및 24kGoldn 콘서트와 같은 Roblox 이벤트에서 검증되었으며, 많은 방문객이 있는 게임에서도 사용되었습니다.
이벤트 시퀀서가 작동하는 모습을 보려면 Roblox Studio에서 콘서트 템플릿을 확인하세요. 이 템플릿은 개발자가 이벤트/콘서트를 만들고 다양한 기능 및 구성 요소에 익숙해질 수 있는 포괄적인 시작점입니다.

모듈 사용법
설치
게임에서 이벤트 시퀀서 프레임워크를 사용하려면:
Studio의 창 메뉴 또는 홈 탭 도구 모음에서 툴박스를 열고 크리에이터 스토어 탭을 선택합니다.

모델 정렬이 선택되었는지 확인한 후, 카테고리의 모두 보기 버튼을 클릭합니다.

패키지 타일을 찾아 클릭합니다.
이벤트 시퀀서 모듈을 찾아 클릭하거나 3D 뷰로 드래그 앤 드롭합니다.

탐색기 창에서 전체 이벤트 시퀀서 모델을 ServerScriptService로 이동합니다. 게임을 실행하면 모듈이 실행되기 시작합니다.
프레임워크 모드
교체 모드
기본 프레임워크 모드는 교체 모드로, 장면을 설계할 때 3D 객체, 지형, 조명 속성, 환경 효과, 및 사용자 인터페이스 객체를 해당 장면의 환경 폴더에 배치합니다. 장면이 로드되면 이러한 객체와 속성이 Workspace, Terrain, 및 Lighting에 분배되어 기존 객체/속성을 교체하여 복제된 공간을 형성합니다.
인라인 모드
대체 프레임워크 모드는 인라인 모드로, 스크립팅 논리를 사용하여 고유한 장면을 설계하지만, 프레임워크는 로드 시 장면의 환경 폴더에서 자산/속성을 복제하기 위해 기존의 3D 객체, 지형, 조명 속성, 환경 효과, 및 사용자 인터페이스 객체를 파괴하지 않습니다.
인라인 모드를 활성화하려면:
ServerScriptService에 배치한 이벤트 시퀀서 모델 내부에서 ReplicatedStorage 폴더 내의 Inline 값을 선택합니다.

속성 창에서 값 체크박스를 켭니다.

장면 만들기
장면은 본질적으로 일련의 폴더로 포장된 전체 이벤트 또는 컷신의 일부입니다. 각 장면은 흐름/이벤트를 정의하는 스크립팅 논리를 포함하며, 장면은 자체 3D 객체, 지형, 조명 속성, 환경 효과, 및 사용자 인터페이스 객체를 저장할 수 있습니다.
빠르게 시작하려면 모듈의 기본 폴더 내에서 빈 장면을 찾을 수 있습니다:
이벤트 시퀀서 폴더를 확장하고 BlankScene 폴더를 찾습니다.

전체 BlankScene 폴더를 ReplicatedStorage로 이동하거나 복사합니다.

시간 길이
각 장면은 시간 길이를 가져야 하며, 이는 초 단위로 정의되어야 합니다. 영화나 콘서트가 정해진 지속 시간을 가지듯이, 시간 길이는 장면 폴더의 TimeLength라는 숫자 속성으로 정의되며, Studio에서 직접 설정하거나 Instance:SetAttribute()를 통해 프로그래밍 방식으로 설정할 수 있습니다.


환경
장면의 환경 폴더에는 사용자가 보고 듣는 모든 것이 포함됩니다. 여기에는 3D 객체, 지형, 조명 속성 및 환경 효과, 그리고 사용자 인터페이스 객체가 포함됩니다. 장면이 로드되면 이러한 객체와 속성이 Workspace, Terrain, 및 Lighting에 분배되어 기존 객체/속성을 교체하여 복제된 공간을 형성합니다.
환경 폴더에는 다음과 같은 컨테이너가 포함됩니다:
| 컨테이너 | 설명 |
|---|---|
| 클라이언트 | 이벤트에 참여하는 모든 사용자가 로드할 자산을 포함합니다. 예를 들어, 사용자 인터페이스 객체나 애니메이션 리그가 있습니다. |
| 플레이어 스폰 | 사용자가 참여할 때 스폰되는 부품을 포함합니다. 이 폴더의 모든 부품은 SpawnLocation과 유사하게 동작합니다. |
| 서버 | 서버에서 장면이 처음 생성될 때 로드할 모든 자산을 포함합니다. 대부분의 시각적 자산은 여기에 두는 것이 좋습니다. |
| 지형 | 장면 지형을 포함합니다. |
| 조명 | 전역 조명 속성을 속성으로 포함하며, 대기 효과 및 후처리 효과와 같은 수정자도 포함합니다. |
이벤트
장면의 이벤트 폴더는 클라이언트와 서버 모듈 간의 통신을 위한 RemoteEvents의 순수한 자리 표시자입니다. 이 폴더에 아무것도 배치할 필요는 없습니다.
클라이언트
이 스크립트는 클라이언트에서 스키마 논리를 실행합니다.
서버
이 스크립트는 서버에서 스키마 논리를 실행합니다.
장면 스키마
장면의 스키마는 장면의 타임라인에서 어떤 일이 언제 발생하는지를 정의합니다. 장면의 스키마는 클라이언트 및 서버 모듈 모두에서 정의해야 하며, 생명 주기 훅을 포함하여 구성이 발생하는 시점을 관리해야 합니다.
생명 주기 훅
스키마 생명 주기 훅은 장면 작업이 발생하는 시점을 관리할 수 있게 해줍니다. 프로덕션 중인 장면은 일반적으로 가장 간단한 흐름으로 실행됩니다:
OnRun은 탐색 중에 중단될 수 있습니다:
세 가지 훅 모두 장면이 재생될 경우 반복될 수 있습니다:
구성
스키마 구성은 장면의 핵심 작업을 정의합니다. 예를 들어, 00:32에 오디오를 재생하거나, 해당 오디오와 동기화하기 위해 애니메이션을 큐에 추가하거나, 불꽃놀이 쇼와 같은 장면 이벤트를 예약하는 등의 작업이 있습니다. 모든 구성은 특정 콜백 함수를 지원하며, 첫 번째 매개변수(self)는 구성 인스턴스입니다.
장면 탐색
이벤트 시퀀서의 고유한 기능은 비디오를 탐색하듯이 장면을 "탐색"할 수 있는 기능입니다. 교체 모드에서는 장면 간 전환을 통해 전체 다중 장면 이벤트를 미리 볼 수 있습니다.
장면 탐색은 모든 사용자에게 접근할 수 없습니다. 이벤트를 단순히 즐기는 사용자는 시간 흐름을 제어할 수 없어야 합니다. 대신, 이벤트의 PlaceId와 특정 UserIds 및/또는 그룹 및 그 안의 역할에 따라 탐색 권한을 부여해야 합니다.
ServerScriptService 내에 새 Script를 생성합니다.
새 스크립트에 다음 코드를 붙여넣습니다.
스크립트 - 탐색 권한 설정local ReplicatedStorage = game:GetService("ReplicatedStorage")local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))EventSequencer.setSeekingPermissions({placeIDs = {},userIDs = {},groups = {{GroupID = , MinimumRankID = },}})setSeekingPermissions 호출 내에서 다음 테이블을 채웁니다:
장면 관리자 플러그인
장면 관리자 플러그인은 장면을 로드하고 언로드하며, 조명 및 지형을 관리하는 유용한 도구입니다. 인라인 모드를 사용하지 않는 한, 이 플러그인을 사용하여 장면 객체 및 속성을 수동으로 배치/편집하는 것보다 사용하는 것이 좋습니다.
플러그인을 설치하려면:
Studio의 창 메뉴 또는 홈 탭 도구 모음에서 툴박스를 엽니다.
크리에이터 스토어 탭이 선택된 상태에서 드롭다운 메뉴에서 플러그인을 선택합니다.
검색 필드에 장면 관리자를 입력하고 Enter를 눌러 플러그인을 찾습니다.

플러그인 아이콘을 클릭하여 세부정보를 보고 설치 버튼을 클릭합니다.
플러그인이 설치되면 Studio의 플러그인 탭에 나타납니다.
장면 로드 및 언로드
장면 만들기에서 설명한 바와 같이, 장면의 환경 폴더에는 사용자가 보고 듣는 모든 것이 포함됩니다. 여기에는 3D 객체가 포함됩니다. 이 플러그인은 장면의 자산을 작업 공간 내의 정리된 폴더로 빠르게 로드하는 데 도움을 줍니다.
| 플러그인 작업 | 설명 |
|---|---|
| 클라이언트 로드 | 장면의 클라이언트 콘텐츠가 언로드된 경우, 환경/클라이언트 폴더를 작업 공간/장면 클라이언트 폴더로 이동합니다. |
| 서버 로드 | 장면의 서버 콘텐츠가 언로드된 경우, 환경/서버 폴더를 작업 공간/장면 서버 폴더로 이동합니다. |
| 클라이언트 언로드 | 장면의 클라이언트 콘텐츠가 로드된 경우, 작업 공간/장면 클라이언트에서 클라이언트 폴더를 [장면]/환경 폴더로 다시 이동합니다. |
| 서버 언로드 | 장면의 서버 콘텐츠가 로드된 경우, 작업 공간/장면 서버에서 서버 폴더를 [장면]/환경 폴더로 다시 이동합니다. |
| 모든 장면 언로드 | 모든 로드된 장면의 클라이언트 및 서버 폴더를 환경 폴더로 다시 이동합니다. |
조명 저장 및 로드
최상위 Lighting 서비스는 장소의 모든 조명 속성과 시각 효과를 저장합니다. 최상위 서비스이기 때문에 특정 장면의 환경/서버 또는 환경/클라이언트 폴더로 수동으로 이동할 수 없습니다. 대신, 플러그인을 사용하여 장면의 환경/조명 폴더로 속성과 자식 객체를 복사할 수 있습니다.
장면 관리자 플러그인 창에서 원하는 장면에 대해 조명 저장을 클릭합니다.
지형 저장 및 로드
Terrain은 Workspace 내의 최상위 클래스이므로, 생성되거나 조각화된 지형을 특정 장면의 환경/서버 또는 환경/클라이언트 폴더로 수동으로 이동할 수 없습니다. 대신, 플러그인을 사용하여 장면의 환경/지형 폴더로 복사할 수 있습니다.
최상위 지형 서비스를 통해 장면의 지형을 구성합니다.

장면 관리자 플러그인 창에서 원하는 장면에 대해 지형 저장을 클릭합니다.
해당 장면의 환경/지형 폴더를 선택하고 확장하면, 저장된 지형을 나타내는 TerrainRegion 객체를 볼 수 있습니다.

장면에 대한 지형이 저장되면, 플러그인 창에서 지형 로드를 클릭하여 최상위 Terrain 서비스로 빠르게 다시 로드할 수 있습니다.
API 참조
스키마 생명 주기 훅
OnSetup
OnSetup 생명 주기 훅은 OnRun 또는 OnEndScene에서 참조될 자산 및 변수를 초기화하는 데 사용됩니다. 장면의 지속 시간 동안 지속될 연결을 설정하는 등의 작업을 수행합니다. 이 훅은 timePositionObject 매개변수를 수신하여 설정 시 현재 시간을 읽을 수 있게 해줍니다.
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 (클라이언트)")
-- 장면 환경에 접근; 인라인 모드에는 적용되지 않음
clientEnvironment = EventSequencer.getCurrentSceneEnvironment()
serverEnvironment = EventSequencer.getCurrentServerEnvironmentFromClient()
-- 자산 대기
dummy = clientEnvironment:WaitForChild("Dummy")
print("현재 시간:", 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 (서버)")
-- 장면 환경에 접근; 인라인 모드에는 적용되지 않음
serverEnvironment = EventSequencer.getCurrentSceneEnvironment()
partColorConnection = changePartColorEvent.OnServerEvent:Connect(function(player, changedPart, newColor)
serverEnvironment.changedPart.Color = newColor
end)
print("현재 시간:", timePositionObject.Value)
endOnRun
OnRun은 스키마 내의 주요 운영 생명 주기 훅입니다. 이곳에는 장면의 모든 타이밍 구성이 포함되어야 하며, 오디오 또는 애니메이션을 재생하거나 불꽃놀이와 같은 이벤트를 예약하는 등의 작업이 포함됩니다.
Schema.OnRun = function()
print("OnRun (클라이언트)")
local MainAudio = Schema:audio({
StartTime = 1,
SoundId = "rbxassetid://1838673350",
OnStart = function(self)
print("오디오 재생 중")
end,
OnEnd = function(self)
print("오디오 종료")
end
})
endOnEndScene
OnEndScene 생명 주기 훅은 장면에서 남아 있는 모든 것을 정리하는 데 유용합니다. 예를 들어, OnSetup 또는 OnRun에서 생성된 연결을 끊거나 장면의 지속 시간 동안 남아 있는 연결을 정리하는 등의 작업을 수행합니다.
Schema.OnEndScene = function()
print("OnEndScene (서버)")
if partColorConnection then
partColorConnection:Disconnect()
partColorConnection = nil
end
end스키마 구성
audio
특정 시간에 재생되는 Sound 객체를 작업 공간에 생성합니다. 장면이 끝나거나 Sound 객체가 재생을 마친 후에 소리는 삭제됩니다.
| 구성 키 | 설명 |
|---|---|
| StartTime | 장면 지속 시간에 대한 오디오 재생 시점(초 단위). |
| SoundId | 재생할 오디오의 자산 ID. |
| OnStart | 오디오 재생이 시작될 때 호출되는 사용자 정의 함수. |
| OnEnd | 오디오 재생이 끝날 때 호출되는 사용자 정의 함수. |
| Volume | Sound 객체의 볼륨; 기본값은 0.5입니다. |
Schema.OnRun = function()
print("OnRun (클라이언트)")
local MainAudio = Schema:audio({
StartTime = 1,
SoundId = "rbxassetid://1838673350",
OnStart = function(self)
print("오디오 재생 중")
end,
OnEnd = function(self)
print("오디오 종료")
end
})
endanimate
특정 시간에 재생되는 Animation을 생성합니다.
| 구성 키 | 설명 |
|---|---|
| StartTime | 장면 지속 시간에 대한 애니메이션 재생 시점(초 단위). |
| EndTime | 장면 지속 시간에 대한 애니메이션 종료 시점(초 단위, 선택 사항). |
| Rig | 애니메이션을 재생할 애니메이션 리그. |
| AnimationId | 재생할 애니메이션의 자산 ID. |
| Speed | 애니메이션의 재생 속도; 기본값은 1입니다. |
| FadeInTime | 애니메이션이 서서히 나타나는 데 걸리는 시간(초 단위); 기본값은 0.2(초)입니다. |
| FadeOutTime | 애니메이션이 서서히 사라지는 데 걸리는 시간(초 단위); 기본값은 0.2(초)입니다. |
| OnStart | 애니메이션 재생이 시작될 때 호출되는 사용자 정의 함수. |
| OnEnd | 애니메이션 재생이 끝날 때 호출되는 사용자 정의 함수. |
| Looped | 애니메이션을 반복할지 여부; 기본값은 false입니다. |
| SyncToAudio | 애니메이션을 오디오 구성에 동기화할지 여부를 정의하는 테이블입니다. 다음 키를 수용합니다:
|
Schema.OnRun = function()
print("OnRun (클라이언트)")
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("애니메이션 재생 중")
end,
OnEnd = function(self)
print("애니메이션 중지")
end
})
endtween
구성 가능한 Tween을 생성하며, 이는 탐색 및 동적 참여에서 보존됩니다. 즉, 서로 다른 시점에서 트윈을 연결할 수 있으며 모든 것이 예상대로 재생되고 동기화됩니다.
| 구성 키 | 설명 |
|---|---|
| StartTimes | 장면 지속 시간에 대한 시작 시간의 테이블(초 단위). |
| Tween | 트윈할 객체 및 속성을 정의하는 테이블입니다. 다음 키를 수용합니다:
|
| OnStart | 트윈이 재생되기 시작할 때 호출되는 사용자 정의 함수. |
| OnHeartbeat | 모든 Heartbeat에서 호출되는 사용자 정의 함수; 두 번째 매개변수로 트윈 알파를 수신합니다. |
| OnEnd | 트윈이 재생을 마칠 때 호출되는 사용자 정의 함수. |
| SyncToAudio | 트윈을 오디오 구성에 동기화할지 여부를 정의하는 테이블입니다. 다음 키를 수용합니다:
|
Schema.OnRun = function()
print("OnRun (클라이언트)")
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("트윈 재생 중")
end,
OnHeartbeat = function(self, alpha)
print("트윈 알파", alpha)
end,
OnEnd = function(self)
print("트윈 완료")
end,
})
endinterval
지정된 주기(초 단위) 동안 사용자 정의 콜백 함수를 실행합니다. 깜빡이는 조명, 오디오의 강도 펄스 등과 같은 반복 이벤트에 유용합니다. 가능한 최소 주기는 0초이지만, 기술적으로 최소 주기는 항상 Heartbeat로 제한됩니다.
| 구성 키 | 설명 |
|---|---|
| StartTime | 장면 지속 시간에 대한 간격 시작 시점(초 단위). |
| EndTime | 장면 지속 시간에 대한 간격 종료 시점(초 단위). |
| Frequency | OnInterval 함수가 호출되어야 하는 빈도(초 단위); 첫 번째 실행은 StartTime에서 발생합니다. |
| OnStart | 일련의 간격이 시작될 때 호출되는 사용자 정의 함수. |
| OnInterval | 지정된 기간(StartTime에서 EndTime까지) 내의 모든 간격에서 호출되는 사용자 정의 함수. |
| OnEnd | 일련의 간격이 종료될 때 호출되는 사용자 정의 함수. |
| SyncToAudio | 간격 지속 시간을 오디오 구성에 동기화할지 여부를 정의하는 테이블입니다. 다음 키를 수용합니다:
|
Schema.OnRun = function()
print("OnRun (클라이언트)")
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
interval와 유사하지만, 동일한 이벤트에 대해 여러 특정 시작 시간을 정의할 수 있습니다. 예를 들어, 장면에서 불꽃놀이 쇼를 두 번 예약하는 것입니다.
| 구성 키 | 설명 |
|---|---|
| StartTimes | 장면 지속 시간에 대한 시작 시간의 테이블(초 단위). |
| OnStart | StartTimes 테이블의 각 지정된 시간에 호출되는 사용자 정의 함수. |
| Skippable | 예약된 이벤트가 늦게 참여하는 사용자 또는 예약된 시작 시간보다 앞서 탐색할 때 건너뛸 수 있는지 여부를 정의하는 부울입니다. false로 설정하면, 참여/탐색 시간 이전에 예약된 모든 이벤트 시작 시간이 해당 참여/탐색 시간에 발생합니다. true로 설정하면, 참여/탐색 이후에 예약된 시작 시간만 발생합니다. 기본값은 false입니다. |
| SyncToAudio | 일정을 오디오 구성에 동기화할지 여부를 정의하는 테이블입니다. 다음 키를 수용합니다:
|
Schema.OnRun = function()
print("OnRun (클라이언트)")
Schema:schedule({
StartTimes = {5, 27.25},
OnStart = function(self)
-- 임시 하트비트 연결 초기화
local tempConnection = RunService.Heartbeat:Connect(function()
end)
-- 연결을 프레임워크에 알림
Schema:inform(tempConnection)
end
})
endinform
프레임워크에 OnRun 생명 주기 훅에서 생성된 모듈, UI 객체, 연결 등을 알립니다. 이렇게 하면 탐색 시 적절하게 정리됩니다. 사용 사례는 다음과 같습니다:
RunService.Heartbeat와 같은 임시 애드혹 연결을 프레임워크에 알리면, 탐색 시 해당 연결이 정리됩니다.
서버 스키마Schema.OnRun = function()print("OnRun (서버)")Schema:schedule({StartTimes = {5},OnStart = function(self)-- 임시 하트비트 연결 초기화local tempConnection = RunService.Heartbeat:Connect(function()end)-- 연결을 프레임워크에 알림Schema:inform(tempConnection)end})endOnRun 생명 주기 훅에서 연결 또는 다른 참조를 초기화하는 ModuleScript에서 사용자 정의 "정리" 함수를 호출합니다.
서버 스키마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 (서버)")Schema:schedule({StartTimes = {5},OnStart = function(self)-- 사용자 정의 모듈의 "init" 함수 호출customModule.init()-- 장면 정리 시 사용자 정의 모듈의 "clean" 함수 호출Schema:inform(customModule, customModule.clean)end,})end모듈 스크립트 - CustomModulelocal RunService = game:GetService("RunService")local CustomModule = {}CustomModule.init = function()-- 하트비트 연결 초기화CustomModule.connection = RunService.Heartbeat:Connect(function()end)endCustomModule.clean = function()-- 하트비트 연결 끊고 정리if CustomModule.connection thenCustomModule.connection:Disconnect()CustomModule.connection = nilendendreturn CustomModule
함수
loadScene
loadScene(sceneName: string, startTime: number ?)
sceneName으로 장면을 프로그래밍 방식으로 로드하고 시작 시점에서 startTime으로 시작합니다. 장면이 서버에서 로드될 때까지 5초의 "유예 기간"이 있습니다. 이는 loadScene("[SceneName]", 20)을 정확히 오후 4시 15분에 호출하면, 프레임워크가 요청된 20초에 추가로 5초를 기다려 오후 4시 15분 25초에 장면이 시작됨을 의미합니다.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- 현재 장면이 끝날 때 로드할 다음 장면 결정
EventSequencer.onOrchestrationFinished:Connect(function(endedSceneName)
if endedSceneName == "PreShow" then
-- "PreShow"가 끝났습니다; 콘서트의 첫 번째 장면 로드
EventSequencer.loadScene("Track1")
elseif endedSceneName == "Track1" then
-- "Track1"이 끝났습니다; 콘서트의 두 번째 장면 로드
EventSequencer.loadScene("Track2")
else
-- 프리쇼 장면으로 다시 루프
EventSequencer.loadScene("PreShow")
end
end)createSchema
createSchema(): table
장면에 대한 논리를 생성하기 위해 장면 스키마의 인스턴스를 반환합니다.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
local Schema = EventSequencer.createSchema()
Schema.OnSetup = function(timePositionObject)
print("OnSetup (클라이언트)")
endseek
seek(time: number)
현재 로드된 장면의 시작에서 time 값(초 단위)으로 탐색합니다.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
EventSequencer.seek(95.58)setSceneWarningTime
setSceneWarningTime(endSceneTimeWindow: number)
경고가 발송되는 모든 장면의 종료 시점까지의 시간을 설정합니다. 클라이언트 측에서는 onSceneEndingWarningForClient를 통해, 서버 측에서는 onSceneEndingWarningForServer를 통해 경고를 감지할 수 있습니다.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- 장면 로드
EventSequencer.loadScene("BeautifulScene")
-- 장면 종료 5초 전에 경고 시간 설정
EventSequencer.setSceneWarningTime(5)
-- 장면이 종료될 때 감지
EventSequencer.onSceneEndingWarningForServer:Connect(function()
warn("장면이 종료될 예정입니다!")
end)setSeekingPermissions
setSeekingPermissions(permissions: table)
이벤트의 PlaceId와 특정 UserIds 및/또는 그룹 및 그 안의 역할에 따라 탐색 권한을 부여합니다. 탐색 및 장면 전환에 대한 자세한 내용은 장면 탐색을 참조하세요.
getCurrentSceneEnvironment
getCurrentSceneEnvironment(): Folder (YIELDS)
클라이언트 스키마 스크립트 또는 서버 스키마 스크립트에서 호출되는지에 따라 현재 장면의 클라이언트 측 또는 서버 측 환경 폴더를 반환합니다.
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 (클라이언트)")
-- 장면 환경에 접근; 인라인 모드에는 적용되지 않음
clientEnvironment = EventSequencer.getCurrentSceneEnvironment()
serverEnvironment = EventSequencer.getCurrentServerEnvironmentFromClient()
print("현재 시간:", 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 (서버)")
serverEnvironment = EventSequencer.getCurrentSceneEnvironment()
partColorConnection = changePartColorEvent.OnServerEvent:Connect(function(player, changedPart, newColor)
serverEnvironment.changedPart.Color = newColor
end)
endgetCurrentServerEnvironmentFromClient
getCurrentServerEnvironmentFromClient(): Folder (YIELDS)
현재 장면의 서버 측 환경 폴더를 반환합니다. getCurrentSceneEnvironment와 달리, 클라이언트 스키마 스크립트에서 호출할 수 있습니다.
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 (클라이언트)")
-- 장면 환경에 접근; 인라인 모드에는 적용되지 않음
clientEnvironment = EventSequencer.getCurrentSceneEnvironment()
serverEnvironment = EventSequencer.getCurrentServerEnvironmentFromClient()
print("현재 시간:", timePositionObject.Value)
endisLoadingScene
isLoadingScene(): boolean
장면이 현재 로드 중인지 확인하기 위해 서버에서 호출됩니다.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
print(EventSequencer.isLoadingScene())
while EventSequencer.isLoadingScene() do
task.wait()
end
print("장면 로드 완료")이벤트
onSceneEndingWarningForClient
장면이 종료되기 전에 클라이언트에서 발생합니다. 기본 시간은 3초이지만, setSceneWarningTime을 통해 구성할 수 있습니다. 이 이벤트는 LocalScript에서만 연결할 수 있습니다.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- 장면이 종료될 예정일 때 감지 (클라이언트 측)
EventSequencer.onSceneEndingWarningForClient:Connect(function()
warn("장면이 종료될 예정입니다!")
end)onSceneEndingWarningForServer
장면이 종료되기 전에 서버에서 발생합니다. 기본 시간은 3초이지만, setSceneWarningTime을 통해 구성할 수 있습니다. 이 이벤트는 Script에서만 연결할 수 있습니다.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- 장면이 종료될 예정일 때 감지 (서버 측)
EventSequencer.onSceneEndingWarningForServer:Connect(function()
warn("장면이 종료될 예정입니다!")
end)onSceneLoadedForClient
장면이 시작될 때 클라이언트에서 발생합니다. 이 이벤트는 LocalScript에서만 연결할 수 있습니다.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- 장면이 시작될 때 감지 (클라이언트 측)
EventSequencer.onSceneLoadedForClient:Connect(function()
warn("장면이 시작됩니다!")
end)onOrchestrationFinished
장면이 시간 길이에 도달하고 효과적으로 종료되었을 때 서버에서 발생합니다. 이 이벤트는 종료된 장면의 이름을 나타내는 endedSceneName 문자열 인수를 수신하며, 이 이벤트를 통해 조건부로 다른 장면을 로드할 수 있습니다. Script에서만 연결할 수 있습니다.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- 현재 장면이 끝날 때 로드할 다음 장면 결정
EventSequencer.onOrchestrationFinished:Connect(function(endedSceneName)
if endedSceneName == "PreShow" then
-- "PreShow"가 끝났습니다; 콘서트의 첫 번째 장면 로드
EventSequencer.loadScene("Track1")
elseif endedSceneName == "Track1" then
-- "Track1"이 끝났습니다; 콘서트의 두 번째 장면 로드
EventSequencer.loadScene("Track2")
else
-- 프리쇼 장면으로 다시 루프
EventSequencer.loadScene("PreShow")
end
end)

