이벤트 시퀀서

*이 콘텐츠는 AI(베타)를 사용해 번역되었으며, 오류가 있을 수 있습니다. 이 페이지를 영어로 보려면 여기를 클릭하세요.

이벤트 시퀀서는 구조화된 동작 및 트리거 시퀀스를 통해 라이브 크로스 서버 이벤트 및 컷신을 제작할 수 있는 강력한 프레임워크입니다. 더 구체적으로, 이 모듈은 다음을 도와줍니다:

  • 오디오, 애니메이션 및 트윈의 정기적 구성으로 구조화된 프레임워크에서 이벤트 또는 컷신을 구축합니다.
  • 여러 서버를 통해 여러 장면을 전환하며 복잡한 애니메이션 및 시각 효과를 타임라인에 동기화합니다.
  • 이벤트를 탐색하고 테스트 및 개발 목적으로 체험을 미리 볼 수 있습니다.

이 프레임워크는 Twenty One Pilots24kGoldn 콘서트와 같은 Roblox 이벤트에서 철저히 검증되었습니다. 또한 많은 이용자가 방문하는 경험에서도 사용되었습니다.

이벤트 시퀀서가 작동하는 것을 편집 가능한 장소 내에서 확인하려면 Roblox Studio에서 콘서트 템플릿을 확인하십시오. 이 템플릿은 개발자가 이벤트/콘서트를 생성하고 관련된 다양한 기능 및 구성 요소에 익숙해지기 위한 포괄적인 출발점입니다.

모듈 사용법

설치

경험에서 이벤트 시퀀서 프레임워크를 사용하려면:

  1. Studio의 메뉴 또는 탭 툴바에서 툴박스를 열고 크리에이터 스토어 탭을 선택합니다.

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

  3. 패키지 타일을 찾아 클릭합니다.

  4. 이벤트 시퀀서 모듈을 찾은 후 클릭하거나 3D 보기로 드래그 앤 드롭합니다.

  5. 익스플로러 창에서 전체 이벤트 시퀀서 모델을 ServerScriptService로 이동합니다. 경험을 실행하면 모듈이 실행됩니다.

프레임워크 모드

교체 모드

기본 프레임워크 모드는 교체 모드로, 이 모드에서는 3D 객체, 지형, 조명 속성, 환경 효과, 및 사용자 인터페이스 객체를 해당 장면의 환경 폴더에 배치하여 고유한 장면을 설계합니다. 장면이 로드되면 이러한 객체와 속성이 Workspace, Terrain, 및 Lighting으로 분배되며, 기존 객체/속성을 대체하여 클론 공간이 형성됩니다.

인라인 모드

대안적인 프레임워크 모드는 인라인 모드입니다. 이 모드에서는 스크립팅 로직으로 고유한 장면을 설계하지만, 프레임워크는 장면의 환경 폴더에서 로드할 때 기존의 3D 객체, 지형, 조명 속성, 환경 효과, 및 사용자 인터페이스 객체를 제거하지 않습니다.

인라인 모드를 활성화하려면:

  1. ServerScriptService에 배치한 이벤트 시퀀서 모델을 열고 ReplicatedStorage 폴더 안의 Inline 값을 선택합니다.

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

장면 만들기

장면은 기본적으로 일련의 폴더로 포장된 전체 이벤트 또는 컷신의 일부입니다. 각 장면은 그 흐름/이벤트를 정의하는 스크립팅 로직을 포함하고 있으며, 장면은 자신만의 3D 객체, 지형, 조명 속성, 환경 효과, 및 사용자 인터페이스 객체를 저장할 수 있습니다.

빠르게 시작하려면 모듈의 기본 폴더 안에서 빈 장면을 찾을 수 있습니다:

  1. 이벤트 시퀀서 폴더를 확장하고 빈 장면 폴더를 찾습니다.

  2. 전체 빈 장면 폴더를 ReplicatedStorage로 이동하거나 복사합니다.

시간 길이

각 장면은 시간 길이가 있어야 하며, 이는 카운트다운의 단위인 초로 정의됩니다. 이는 영화나 콘서트가 정해진 길이를 가지는 것과 유사합니다. 시간 길이는 장면의 폴더에 있는 TimeLength라는 숫자 속성으로 정의되며, Studio에서 직접 설정하거나 프로그램적으로 Instance:SetAttribute()를 통해 설정할 수 있습니다.

환경

장면의 환경 폴더는 사용자가 보고 듣는 모든 것을 포함합니다. 여기에는 3D 객체, 지형, 조명 속성, 환경 효과, 및 사용자 인터페이스 객체가 포함됩니다. 장면이 로드되면 이러한 객체와 속성이 Workspace, Terrain, 및 Lighting으로 분배되어 기존 객체/속성을 대체하여 클론 공간을 형성합니다.

환경 폴더는 다음과 같은 컨테이너를 포함합니다:

컨테이너설명
클라이언트이벤트에 들어오는 모든 사용자(클라이언트)가 로드할 자산을 포함합니다. 예를 들어 사용자 인터페이스 객체나 애니메이션 리그입니다.
플레이어 스폰사용자가 들어올 때 스폰 되는 부분을 포함합니다. 이 폴더의 모든 부분은 SpawnLocation과 유사하게 동작합니다.
서버서버에서 장면이 처음 생성될 때 로드할 모든 자산을 포함합니다. 대부분의 시각적 자산은 여기로 보내는 것이 좋습니다.
지형장면 지형을 포함합니다.
조명전역 조명 속성기타 효과 등의 수정자를 포함합니다.

이벤트

장면의 이벤트 폴더는 원격 이벤트를 위한 장소입니다. 이는 클라이언트서버 모듈 간의 소통을 위한 것이라 특정 항목을 이 폴더에 배치할 필요는 없습니다.

클라이언트

이 스크립트는 클라이언트에서 스키마 논리를 실행합니다.

서버

이 스크립트는 서버에서 스키마 논리를 실행합니다.

장면 스키마

장면의 스키마는 장면 타임라인의 어느 지점에서 어떤 일이 발생하는지를 정의합니다. 장면의 스키마는 클라이언트서버 모듈 모두에서 정의하고 수명 주기 훅을 포함하여 구성이 발생하는 시점을 관리해야 합니다.

수명 주기 훅

스키마의 수명 주기 훅은 장면 작업이 발생하는 시점을 관리하는 데 도움을 줍니다. 제작 중인 장면은 보통 가장 간단한 흐름으로 실행됩니다:

OnRun은 탐색 시에 중단될 수 있습니다:

모든 세 개의 훅은 장면이 재생될 경우 반복할 수도 있습니다:

구성

스키마의 구성은 장면의 핵심 작동을 정의합니다. 예를 들어 00:32에 오디오를 재생하고, 이 오디오와 동기화된 애니메이션을 대기열에 추가하며, 불꽃놀이 쇼와 같은 장면 이벤트를 예약 등에 사용됩니다. 각 구성은 특정 콜백 함수를 지원하며, 첫 번째 파라미터(self)는 구성 인스턴스입니다.

장면 탐색

이벤트 시퀀서의 고유한 기능 중 하나는 장면을 탐색할 수 있다는 것입니다. 비디오를 탐색하는 것처럼 장면 사이를 이동할 수 있습니다. 교체 모드에서는 여러 장면 사이를 전환하여 전체 다중 장면 이벤트를 미리 볼 수 있습니다.

장면 탐색은 모든 사람에게 제공되지 않습니다. 이벤트를 즐기는 사용자에게는 시간 흐름을 제어할 수 있는 권한이 없어야 합니다. 대신 이벤트의 PlaceId뿐만 아니라 특정 UserIds 및/또는 그룹과 그 안의 역할에 따라 탐색 권한을 부여해야 합니다.

  1. ServerScriptService 내에 새 Script를 생성합니다.

  2. 새로운 스크립트에 다음 코드를 붙여넣습니다.

    스크립트 - 탐색 권한 설정

    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
    EventSequencer.setSeekingPermissions({
    placeIDs = {},
    userIDs = {},
    groups = {
    {GroupID = , MinimumRankID = },
    }
    })
  3. 다음 테이블 내에서 setSeekingPermissions 호출을 다음과 같이 채워넣습니다:

    placeIDs지원하는 탐색을 위한 구분된 PlaceId 목록입니다.
    userIDs지원 장소 내에서 탐색할 수 있는 구분된 UserIds 목록입니다.
    groups각각의 그룹 ID와 해당 그룹의 구성원이 지원 장소 내에서 탐색할 수 있도록 하는 최소 랭크를 포함한 테이블 목록입니다.

장면 관리자 플러그인

장면 관리자 플러그인은 장면 로딩 및 언로딩, 조명, 및 지형 작업을 위한 유용한 도구입니다. 인라인 모드를 사용하지 않는 한, 이 플러그인을 사용하여 장면 객체 및 속성을 수동으로 배치/편집하는 것보다 이 플러그인을 사용하는 것이 좋습니다.

플러그인을 설치하려면:

  1. Studio의 메뉴 또는 탭 툴바에서 툴박스를 엽니다.

  2. 크리에이터 스토어 탭이 선택된 상태에서 드롭다운 메뉴에서 플러그인을 선택합니다.

  3. 검색 필드에 장면 관리자를 입력하고 Enter를 눌러 플러그인을 찾아봅니다.

  4. 플러그인 아이콘을 클릭하여 세부정보를 보고 설치 버튼을 클릭합니다.

  5. 플러그인이 설치되면 Studio의 플러그인 탭에 나타납니다.

장면 로드 및 언로드

장면 만들기에서 설명한 대로 장면의 환경 폴더에는 사용자가 보고 듣는 모든 것이 포함됩니다. [장면 관리자] 플러그인은 작업공간 내에서 장면의 자산을 빠르게 로드하거나 언로드하는 데 도움을 줍니다.

플러그인 동작설명
클라이언트 로드장면의 클라이언트 콘텐츠가 언로드된 경우 환경/클라이언트 폴더를 작업공간/장면 클라이언트 폴더로 이동합니다.
서버 로드장면의 서버 콘텐츠가 언로드된 경우 환경/서버 폴더를 작업공간/장면 서버 폴더로 이동합니다.
클라이언트 언로드장면의 클라이언트 콘텐츠가 로드된 경우, 작업공간/장면 클라이언트에서 클라이언트 폴더를 다시 [장면]/환경 폴더로 이동합니다.
서버 언로드장면의 서버 콘텐츠가 로드된 경우, 작업공간/장면 서버에서 서버 폴더를 다시 [장면]/환경 폴더로 이동합니다.
모든 장면 언로드모든 로드된 장면의 클라이언트서버 폴더를 다시 해당 환경 폴더로 이동합니다.

조명 저장 및 로드

최상위 Lighting 서비스는 장소의 모든 조명 속성 및 시각 효과를 저장합니다. 이는 최상위 서비스이기 때문에 특정 장면의 환경/서버 또는 환경/클라이언트 폴더로 수동으로 이동할 수 없습니다. 대신 플러그인을 사용하여 장면의 환경/조명 폴더로 속성과 자식 요소를 복사할 수 있습니다.

  1. 최상위 Lighting 서비스에서 장면의 조명 속성, 후처리 효과, 대기 효과, 및 하늘상자를 구성합니다.

  2. 장면 관리자 플러그인 창에서 원하는 장면의 조명 저장을 클릭합니다.

  3. 해당 장면의 환경/조명 구성을 선택하고 확장하면 폴더의 속성과 최상위 Lighting 서비스의 클론 자식 요소와 같은 조명 속성이 표시됩니다.

    클론된 인스턴스
    저장된 속성

    장면에 대한 조명 속성 및 자식 요소가 저장되면, 플러그인 창에서 조명 로드를 클릭하여 최상위 Lighting 서비스로 빠르게 다시 로드할 수 있습니다.

지형 저장 및 로드

최상위 클래스인 TerrainWorkspace 내에 있기 때문에 생성된 지형이나 조각된 지형을 특정 장면의 환경/서버 또는 환경/클라이언트 폴더로 수동으로 이동할 수 없습니다. 대신 플러그인을 사용하여 장면의 환경/지형 폴더로 복사할 수 있습니다.

  1. 최상위 지형 서비스를 통해 장면의 지형을 구성합니다.

  2. 장면 관리자 플러그인 창에서 원하는 장면의 지형 저장을 클릭합니다.

  3. 해당 장면의 환경/지형 폴더를 선택하고 확장하면 저장된 지형을 나타내는 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)
end
서버 스키마

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 (서버)")
-- 장면 환경에 접근; 인라인 모드에는 적용되지 않음
serverEnvironment = EventSequencer.getCurrentSceneEnvironment()
partColorConnection = changePartColorEvent.OnServerEvent:Connect(function(player, changedPart, newColor)
serverEnvironment.changedPart.Color = newColor
end)
print("현재 시간:", timePositionObject.Value)
end

OnRun

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

OnEndScene

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오디오 재생이 끝날 때 호출되는 커스텀 함수입니다.
VolumeSound 객체의 볼륨; 기본값은 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
})
end

animate

특정 시간에 재생되는 Animation을 생성합니다.

구성 키설명
StartTime장면 지속 시간에 대해 애니메이션을 재생하는 시점입니다(초 단위).
EndTime애니메이션을 종료할 선택적 시간입니다(초 단위).
Rig애니메이션을 재생할 애니메이션 리그입니다.
AnimationId재생할 애니메이션의 자산 ID입니다.
Speed애니메이션의 재생 속도; 기본값은 1입니다.
FadeInTime애니메이션을 페이드인하는 시간(초 단위); 기본값은 0.2초입니다.
FadeOutTime애니메이션을 페이드 아웃 하는 시간(초 단위); 기본값은 0.2초입니다.
OnStart애니메이션이 재생 시작될 때 호출되는 커스텀 함수입니다.
OnEnd애니메이션이 종료될 때 호출되는 커스텀 함수입니다.
Looped애니메이션 반복 여부; 기본값은 false입니다.
SyncToAudio애니메이션을 오디오 구성에 동기화할지 여부를 정의하는 테이블입니다. 다음 키를 수용합니다:
  • Audio오디오 구성에 대한 참조입니다.
  • StartAtAudioTime – 오디오의 지속 시간에 대해 애니메이션을 재생할 시점입니다.
  • EndAtAudioTime – 오디오의 지속 시간에 대해 애니메이션을 종료할 선택적 시간입니다.
클라이언트 스키마

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

tween

구성 가능한 Tween을 생성합니다. 이는 탐색 및 동적 참여에서 유지되며, 이는 서로 다른 시점에서 트윈을 연결할 수 있도록 합니다.

구성 키설명
StartTimes장면의 지속 시간에 대한 시작 시간 테이블(초 단위)
Tween애니메이션의 객체와 속성을 정의하는 테이블입니다. 다음 키를 포함합니다:
  • Object – 트윈할 객체입니다.
  • Info – 트윈 정보를 정의하는 TweenInfo 인스턴스입니다. 지속 시간, Enum.EasingStyle, Enum.EasingDirection 등을 포함합니다.
  • Properties – Tweening 할 객체 속성과 관련 목표 값입니다.
OnStart트윈이 재생을 시작할 때 호출되는 커스텀 함수입니다.
OnHeartbeatHeartbeat에서 호출되는 커스텀 함수입니다. 트윈 알파를 두 번째 파라미터로 수신합니다.
OnEnd트윈이 모든 작업을 종료할 때 호출되는 커스텀 함수입니다.
SyncToAudio트윈을 오디오 구성에 동기화할지 여부를 정의하는 테이블입니다. 다음 키를 포함합니다:
  • Audio오디오 구성에 대한 참조입니다.
  • StartAtAudioTimes – 오디오의 지속 기간에 대해 트윈을 재생하는 시간 테이블입니다.
클라이언트 스키마

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

interval

지정된 주기의 지정된 시간 동안 사용자 정의 콜백 함수를 실행합니다. 반복되는 이벤트(예: 플래시 조명, 오디오의 강도 펄싱 등)에 유용합니다. 가장 낮은 주기는 0초이지만, 기술적으로 최소 주기는 항상 Heartbeat에 제한됩니다.

구성 키설명
StartTime지속 시간의 시작 시점(장면 지속 시간에 따라), 초입니다.
EndTime지속 시간의 종료 시점입니다.
FrequencyOnInterval 함수가 호출되는 빈도를 초 단위로 정의합니다. 첫 번째 실행은 StartTime에서 발생합니다.
OnStart일련의 간격이 시작될 때 호출되는 커스텀 함수입니다.
OnInterval지정된 지속 시간(StartTime에서 EndTime까지) 내에서 모든 간격에 대해 호출되는 커스텀 함수입니다.
OnEnd일련의 간격이 종료될 때 호출되는 커스텀 함수입니다.
SyncToAudio지속 시간의 오디오 구성에 동기화할지 여부를 정의하는 테이블입니다. 다음 키를 포함합니다:
  • Audio오디오 구성에 대한 참조입니다.
  • StartAtAudioTime – 오디오의 지속 시간에 대해 지속 시간이 시작될 시점입니다.
  • EndAtAudioTime – 오디오의 지속 시간에 대해 종료될 선택적 시간입니다.
클라이언트 스키마

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

schedule

interval와 유사하지만, 특정 이벤트에 대해 여러 가지 특정 시작 시간을 정의할 수 있습니다. 예를 들어 장면 내에서 불꽃놀이 쇼를 두 번 예약할 수 있습니다.

구성 키설명
StartTimes장면 지속 시간에 대한 시작 시간 테이블(초 단위)
OnStartStartTimes 테이블에서 지정된 모든 시간에 전개되는 커스텀 함수입니다.
Skippable즉석에서 가입에 대한 일정을 건너뛸 수 있는지 여부를 정의하는 부울입니다. false로 설정하면 모든 가입/탐색 시간 이전에 예약된 모든 이벤트가 해당 시간에 발생합니다. true로 설정하면 가입/탐색 이후에 예약된 시간이 발생합니다. 기본값은 false입니다.
SyncToAudio일정을 오디오 구성에 동기화할지 여부를 정의하는 테이블입니다. 다음 키를 포함합니다:
  • Audio오디오 구성에 대한 참조입니다.
  • StartAtAudioTimes – 오디오의 지속 시간에 대해 OnStart 함수를 호출할 시간을 정의하는 시간 테이블입니다.
클라이언트 스키마

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

inform

프레임워크에 생성된 모듈, UI 객체, 연결 등을 알려줍니다. 이는 OnRun 생명주기 훅에서 생성된 경우에 적절히 청소되도록 보장합니다. 사용 사례에는 다음이 포함됩니다:

  • 인라인 모드를 제외한 이 모든 것을 기준으로 하여 지정된 타이밍이 확실하도록 보장합니다.

  • 사용자가 생성된 연결(예: 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
    })
    end

함수

loadScene

loadScene(sceneName: string, startTime: number ?)

프로그래밍 방식으로 sceneName을 사용하여 장면을 로드하고 시작 시간을 시작할 수 있습니다. 로드 후 5초의 "유예 기간"이 있어 장면이 서버에서 로드됩니다. 이는 loadScene("[SceneName]", 20)을 정확히 4:15:00 PM에 호출한다면, 요청한 20초 외에 5초를 더 대기하게 됩니다. 즉, 4:15:25 PM에 장면이 시작됩니다.

스크립트

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 (클라이언트)")
end

seek

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)
end
서버 스키마

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

getCurrentServerEnvironmentFromClient

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

isLoadingScene

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에서만 연결할 수 있습니다.

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에서만 연결할 수 있습니다.

LocalScript

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- 장면이 시작될 때 감지(클라이언트 측)
EventSequencer.onSceneLoadedForClient:Connect(function()
warn("장면이 시작됩니다!")
end)

onOrchestrationFinished

장면이 시간 길이에 도달하여 종료될 때 서버에서 발생합니다. 이 이벤트는 방금 종료된 장면의 이름 문자열을 인자로 받고 이를 사용하여 조건부로 다른 장면 로드를 연결할 수 있습니다. 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)
©2026 Roblox Corporation. Roblox 및 Roblox 로고, 'Powering Imagination'은 미국 및 기타 국가 내 당사의 등록 및 미등록 상표입니다.