EventSequencerは、アクションやトリガーの構造化されたシーケンスにライブ、クロスサーバーイベント、カットシーンを構築することができる強力なフレームワークです。 具体的には、このモジュールは以下の事に役立ちます。
- オーディオ、アニメーション、トゥイーンのスケジュール設定で、構造化されたフレームワークにイベントやカットシーンを構築します。
- 複数のサーバー間で複数のシーンを遷移し、複雑なアニメーションやビジュアルをタイムラインに同期させます。
- イベント中をくまなく探し、テストや開発のためにバーチャル空間をプレビューします。
このフレームワークは、トゥエンティ・ワン・パイロッツや24kGoldnのコンサートなどの Roblox イベントや、たくさんの人が訪れる多数のバーチャル空間で実戦テストされています。
編集可能な場所でのEventSequencerの動作を表示するには、Roblox Studio のコンサートテンプレートを確認します。 このテンプレートは、開発者がイベント/コンサートを作成し、関連するさまざまな機能やコンポーネントに慣れるための、全体の取り掛かりとしての役割を担っています。
モジュールの使用法
インストール
バーチャル空間でEventSequencerフレームワークを使用する方法
表示タブから、ツールボックスを開き、マーケットプレイスタブを選択します。
モデルのソートが選択されていることを確認し、カテゴリのすべてのボタンを表示をクリックします。
DEV モジュールタイルを見つけてクリックします。
イベントシーケンサーモジュールを見つけてクリックするか、3D ビューにドラッグ&ドロップします。
エクスプローラウィンドウで、EventSequencerモデル全体をServerScriptServiceに移動します。 バーチャル空間を実行すると、モジュールはそれ自体をさまざまなサービスに配布し、実行を開始します。
フレームワークモード
置換モード
デフォルトのフレームワークモードは、3D オブジェクト、地形、 照明プロパティ、 環境エフェクト、 ユーザーインターフェースオブジェクトをシーンの環境 フォルダに配置することで、ユニークなシーンをデザインする置き換え モードです。 TerrainはWorkspace内のトップレベルのクラスであるため、生成されたまたは彫刻された地形を特定のシーンの環境/サーバーまたは環境/クライアントフォルダに手動で移動することはできません。
インラインモード
代替のフレームワークモードは、フローまたはイベントのスクリプトロジックで同様に独自のシーンをデザインするインラインモードですが、読み込み時にシーンの環境フォルダからアセットまたはプロパティをクローンするために、既存の3D オブジェクト、地形、照明プロパティ、環境エフェクト、ユーザーインターフェースオブジェクトを破棄することはありません。
インラインモードを有効にするには:
ServerScriptServiceに配置したEventSequencerフォルダの中で、ReplicatedStorageフォルダ内のインライン値までドリルダウンして選択します。
プロパティウィンドウで、値チェックボックスをオンに切り替えます。
シーンの作成
シーンとは、基本的に一連のフォルダにまとめられたイベント全体またはカットシーンの一部です。 各シーンには、そのフロー/イベントを定義するスクリプトロジックが含まれており、シーンは独自の3D オブジェクト、地形、照明プロパティ、環境エフェクト、ユーザーインターフェースオブジェクトを格納できます。
すぐに開始できるよう、モジュールのメインフォルダ内に空のシーンがあります。
EventSequencerフォルダを展開し、BlankSceneフォルダを見つけます。
BlankSceneフォルダ全体をReplicatedStorageに移動またはコピーします。
時間の長さ
時間の長さは、Studio で直接またはでプログラム的に設定できるTimeLengthという名前のシーンのフォルダに、数字属性Instance:SetAttribute()として定義されます。 時間の長さは、TimeLengthというシーンのフォルダの数値属性 として定義され、Studio で直接設定するか、Instance:SetAttribute()を使ってプログラムで設定することができます。
環境
シーンの環境フォルダには、3D オブジェクト、地形、照明プロパティと環境エフェクト、ユーザーインターフェースオブジェクトなど、ユーザーが見たり聞いたりするものがすべて含まれています。 シーンが読み込まれると、それらのオブジェクトやプロパティはClass.Workspace``Class.Lighting、Terrain、に分配され、既存のオブジェクト/プロパティを置き換えてクローン空間を形成します。
環境フォルダには、以下のコンテナが含まれています。
コンテナ | 概要 |
---|---|
クライアント | ユーザーインターフェース user interface オブジェクトやアニメーションリグなど、ユーザー(クライアント)がイベントに参加すると読み込むすべてのアセットが含まれています。 |
PlayerSpawns | 参加時にユーザーがスポーンするパーツが含まれています。 このフォルダ内の任意のパーツは、SpawnLocationと同様に動作します。 |
サーバー | サーバーでシーンを最初に作成するときに読み込むすべてのアセットが含まれています。 ビジュアルアセットのほとんどをここに備えておくことをお勧めします。 |
地形 | シーンの地形が含まれています。 |
照明 | 属性としてのグローバル照明プロパティ lighting properties 、大気エフェクト atmospheric effects や後処理 post-processing などのモディファイアも含まれます。 |
イベント
シーンのイベントフォルダは、クライアントとサーバーモジュール間で通信するRemoteEventsのプレースホルダーです。 このフォルダに何かを入れるる必要はありません。
クライアント
このスクリプトは、クライアントでスキーマロジックを実行します。
サーバー
このスクリプトは、サーバーでスキーマロジックを実行します。
シーンスキーマ
シーンのスキーマは、シーンのタイムライン内のどの時点で何が起こるかを定義します。 クライアントとサーバーモジュールの両方でシーンのスキーマを定義し、構成が発生したときに管理するためのライフサイクルフックを含める必要があります。
ライフサイクルフック
スキーマのライフサイクルフックでは、シーン操作が発生した時に管理できます。 稼働中のシーンは、通常、最もシンプルなフローで実行されます。
OnRunは、以下のものを検索すると中断される可能性があります。
3つのフックは、シーンがリプレイされた場合にも繰り返すことができます。
設定
00:32 にオーディオを再生したり、そのオーディオに同期してアニメーションをキューイングしたり、花火などのシーンイベントをスケジューリングしたりするなど、スキーマ構成はシーンのコアとなる操作を定義します。 すべての構成は、最初のパラメータ(self)が構成インスタンスである特定のコールバック関数をサポートしています。
シーンの検索
EventSequencerのユニークな機能は、動画のようにシーンを「検索」できる機能です。 置換モードでは、シーンを切り替えて、本番にデプロイする前にマルチシーンイベント全体をプレビューすることもできます。
単にイベントを楽しむだけのユーザーは時間の流れをコントロールできないため、シーンの検索は誰でもアクセスできるものではありません。 代わりに、イベントのPlaceIdだけでなく、特定のUserIdsおよび/またはグループとその中の役割に基づいて、検索許可を与える必要があります。
Script内に新しいServerScriptServiceを作成します。
以下のコードを新しいスクリプトに貼り付けます。
Script - Set Seeking Permissionslocal ReplicatedStorage = game:GetService("ReplicatedStorage")local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))EventSequencer.setSeekingPermissions({placeIDs = {},userIDs = {},groups = {{GroupID = , MinimumRankID = },}})setSeekingPermissionsコール内で、以下の表に次のように入力します。
placeIDs | 検索をサポートするための、カンマで区切られたPlaceId値のリスト。 |
userIDs | サポートされている場所内で検索できるユーザーの、カンマで区切られたUserId値のリスト。 |
groups | 各テーブルにグループ group IDと、サポートされている場所で検索できるグループのメンバーの最小ランクが含まれた、カンマで区切られたテーブルのリスト。 |
シーンマネージャープラグイン
シーン管理プラグインは、シーン、照明、地形の読み込みとアンロードに便利なツールです。 インラインモードを使用している場合を除いて、シーンオブジェクトやプロパティを手動で配置/編集する代わりに、このプラグインを使用することを強くお勧めします。
プラグインをインストールするには:
Studio の表示メニューから、ツールボックスを開きます。
マーケットプレイスタブが選択されている状態で、ドロップダウンメニューからプラグインを選択します。
検索フィールドにシーンマネージャーと入力し、Enterキーを押してプラグインを見つけます。
プラグインのアイコンをクリックして詳細を表示し、青色のインストールボタンをクリックします。
プラグインがインストールされると、Studio のプラグインタブに表示されます。
シーンの読み込みとアンロード
シーンの作成で説明されているように、シーンの環境フォルダには、3D オブジェクトなど、ユーザーが見たり聞いたりするものがすべて含まれています。 プラグインは、シーンのアセットをワークスペース内の整理されたフォルダに素早く読み込むのに役立ちます。
プラグインアクション | 概要 |
---|---|
クライアントを読み込む | シーンのクライアントコンテンツがアンロードされている場合、環境/クライアントフォルダをワークスペース/ScenesClientフォルダに移動します。 |
サーバーを読み込む | シーンのサーバーコンテンツがアンロードされている場合、環境/サーバーフォルダをワークスペース/ScenesServerフォルダに移動します。 |
クライアントをアンロード | シーンのクライアントコンテンツが読み込まれている場合、クライアントフォルダをワークスペース/ScenesClientから**[Scene]**/環境フォルダに戻します。 |
サーバーをアンロード | シーンのサーバーコンテンツが読み込まれている場合、サーバーフォルダをワークスペース/ScenesServerから**[Scene]**/環境フォルダに戻します。 |
すべてのシーンをアンロード | 読み込まれたシーンのクライアントとサーバーフォルダを環境フォルダに戻します。 |
照明の保存と読み込み
トップレベルのLightingサービスは、場所の照明プロパティと視覚効果をすべて保存します。 トップレベルのサービスであるため、特定のシーンの環境/サーバーまたは環境/クライアントフォルダに手動で移動することはできません代わりに、プラグインを利用して、そのプロパティと子供をシーンの環境/照明フォルダにコピーできます。 代わりに、プラグインを利用して、そのプロパティと子供をシーンの環境/照明 フォルダにコピーできます。
シーンマネージャープラグインウィンドウで、目的のシーンの照明を保存をクリックします。
照明プロパティと子をシーンに保存したら、プラグインウィンドウで 照明の読み込みをクリックすることで、それらを最上位のLightingサービスにすぐに読み込むことができます。
地形の保存と読み込み
のサービスであるため、特定のシーンの環境/サーバーまたは環境/クライアントフォルダに手動で移動することはできません。 代わりに、プラグインを利用して、そのプロパティと子供をシーンの環境/照明フォルダにコピーできます。
トップレベルの地形サービスでシーンの地形を構成します。
シーンマネージャープラグインウィンドウで、目的のシーンの地形を保存をクリックします。
そのシーンの環境/地形フォルダを選択して展開すると、保存された地形を表すTerrainRegionオブジェクトが表示されます。
地形がシーンに保存されると、プラグインウィンドウから地形をロードをクリックすることで、トップレベルのTerrainサービスに素早く読み込むことができます。
API リファレンス
スキーマライフサイクルフック
OnSetup
OnSetupライフサイクルフックは、OnRunまたはOnEndSceneで参照されるアセットや変数の初期化や、シーンの持続を目的としたconnectionsのセットアップを想定しています。 このフックは、セットアップ時の現在の時刻を読み取ることができるtimePositionObjectパラメータを受け取ります。
Client Schema
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 (Client)")
-- Access scene environments; does not apply to Inline Mode
clientEnvironment = EventSequencer.getCurrentSceneEnvironment()
serverEnvironment = EventSequencer.getCurrentServerEnvironmentFromClient()
-- Wait for assets
dummy = clientEnvironment:WaitForChild("Dummy")
print("Current time is:", timePositionObject.Value)
end
Server Schema
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 (Server)")
-- Access scene environment; does not apply to Inline Mode
serverEnvironment = EventSequencer.getCurrentSceneEnvironment()
partColorConnection = changePartColorEvent.OnServerEvent:Connect(function(player, changedPart, newColor)
serverEnvironment.changedPart.Color = newColor
end)
print("Current time is:", timePositionObject.Value)
end
OnRun
OnRunは、スキーマ内の主要なオペレーションライフサイクルフックです。 オーディオやアニメーションの再生から、花火大会のようなイベントのスケジュールまで、シーンのすべての時間設定が含まれている必要があります。
Client Schema
Schema.OnRun = function()
print("OnRun (Client)")
local MainAudio = Schema:audio({
StartTime = 1,
SoundId = "rbxassetid://1838673350",
OnStart = function(self)
print("Audio playing")
end,
OnEnd = function(self)
print("Audio ended")
end
})
end
OnEndScene
OnEndSceneライフサイクルフックは、OnSetupやOnRunで作成され、シーンの間残っている接続を切断するなど、シーンで未解決のものをクリーンアップするのに便利です。
Server Schema
Schema.OnEndScene = function()
print("OnEndScene (Server)")
if partColorConnection then
partColorConnection:Disconnect()
partColorConnection = nil
end
end
スキーマ設定
オーディオ
特定の時間にプレイするワークスペースにSoundオブジェクトを作成します。 シーンの終了後、またはSoundオブジェクトがプレイ終了した後にサウンドが削除されます。
設定キー | 概要 |
---|---|
StartTime | シーン持続時間に対してオーディオを再生する時間(秒)です。 |
SoundId | プレイするオーディオのアセットID。 |
OnStart | オーディオの再生開始時に起動するカスタム関数です。 |
OnEnd | オーディオの再生終了時に起動するカスタム関数です。 |
Volume | Soundオブジェクトの音量、デフォルトは0.5です。 |
Client Schema
Schema.OnRun = function()
print("OnRun (Client)")
local MainAudio = Schema:audio({
StartTime = 1,
SoundId = "rbxassetid://1838673350",
OnStart = function(self)
print("Audio playing")
end,
OnEnd = function(self)
print("Audio ended")
end
})
end
アニメーション
特定の時間にプレイするAnimationを作成します。
設定キー | 概要 |
---|---|
StartTime | シーン持続時間に対してアニメーションを再生する時間(秒)です。 |
EndTime | シーン持続時間に対してアニメーションを終了する任意の時間(秒)です。 |
Rig | アニメーションを再生するアニメーションリグです。 |
AnimationId | 再生するアニメーションのアセットIDです。 |
Speed | アニメーションの再生速度、デフォルトは1です。 |
FadeInTime | アニメーションをフェードインさせる時間(秒)、デフォルトは0.2(秒)です。 |
FadeOutTime | アニメーションをフェードアウトさせる時間(秒)、デフォルトは0.2(秒)です。 |
OnStart | アニメーションの再生開始時に起動するカスタム関数です。 |
OnEnd | アニメーションの再生終了時に起動するカスタム関数です。 |
Looped | アニメーションをループさせるかどうか、デフォルトはfalseです。 |
SyncToAudio | オーディオ設定にアニメーションを同期させるかどうかを定義するテーブルです。 以下のキーを承認します。
|
Client Schema
Schema.OnRun = function()
print("OnRun (Client)")
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("Animation playing")
end,
OnEnd = function(self)
print("Animation stopped")
end
})
end
トゥイーン
検索やダイナミックジョインで保存される設定可能なTweenを作成します。 つまり、別の時点でツイーンをチェーンすることができ、すべて期待どおりに再生し、同期する必要があります。
設定キー | 概要 |
---|---|
StartTimes | シーン持続時間に対する開始時間のテーブル(秒)です。 |
Tween | トゥイーンさせるオブジェクトとプロパティを定義するテーブルです。 以下のキーを承認します。
|
OnStart | トゥイーンの再生開始時に起動するカスタム関数です。 |
OnHeartbeat | Heartbeatごとに起動し、第2パラメータとしてトゥイーンアルファを受け取るカスタム関数です。 |
OnEnd | トゥイーンの再生終了時に起動するカスタム関数です。 |
SyncToAudio | オーディオ設定にチューニングを同期させるかどうかを定義するテーブルです。 以下のキーを承認します。
|
Client Schema
Schema.OnRun = function()
print("OnRun (Client)")
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 playing")
end,
OnHeartbeat = function(self, alpha)
print("Tween alpha", alpha)
end,
OnEnd = function(self)
print("Tween completed")
end,
})
end
間隔
指定した頻度で、指定した時間(秒)にわたってカスタムコールバック関数を実行します。 ライトの点滅、オーディオの強弱のパルス化など、イベントを繰り返すのに便利です。 最低周波数は 0 秒ですが、技術的には最低周波数は常にHeartbeatにクランプされています。
設定キー | 概要 |
---|---|
StartTime | シーン持続時間に対する間隔時間の開始(秒)です。 |
EndTime | シーン持続時間に対する間隔時間の終了(秒)です。 |
Frequency | OnInterval関数が起動される頻度(秒)、最初の実行はStartTimeに開始されます。 |
OnStart | 一連の間隔の開始時に起動するカスタム関数です。 |
OnInterval | 指定した時間(StartTime〜EndTime)内の間隔ごとに起動するカスタム関数です。 |
OnEnd | 一連の間隔の終了時に起動するカスタム関数です。 |
SyncToAudio | オーディオ設定に間隔時間を同期させるかどうかを定義するテーブルです。 以下のキーを承認します。
|
Client Schema
Schema.OnRun = function()
print("OnRun (Client)")
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
スケジュール
シーンで花火大会を 2 回スケジュールするなど、同じイベントに対して特定の開始時間を複数定義できる点を除いて、間隔に似ています。
設定キー | 概要 |
---|---|
StartTimes | シーン持続時間に対する開始時間のテーブル(秒)です。 |
OnStart | StartTimesテーブル内の指定された時刻ごとに起動するカスタム関数です。 |
Skippable | 遅れて参加するユーザーがいる場合や、スケジュールされた開始時間より早くシークする場合に、スケジュールされたイベントをスキップできるかどうかを定義するブール値です。 falseに設定すると、参加/シーク時間前にスケジュールされたすべてのイベント開始時間は、その参加/シーク時間に発生します。 trueに設定すると、参加/シーク後にスケジュールされた開始時間のみ発生します。 デフォルトはfalseです。 |
SyncToAudio | オーディオ設定にスケジュールを同期させるかどうかを定義するテーブルです。 以下のキーを承認します。
|
Client Schema
Schema.OnRun = function()
print("OnRun (Client)")
Schema:schedule({
StartTimes = {5, 27.25},
OnStart = function(self)
-- Initialize temporary heartbeat connection
local tempConnection = RunService.Heartbeat:Connect(function()
end)
-- Inform framework of connection
Schema:inform(tempConnection)
end
})
end
通知
OnRunライフサイクルフックで作成されたモジュール、UI オブジェクト、接続などのフレームワークを通知し、シーク時に適切にクリーンアップされるようにします。 ユースケースには、以下が含まれます。
RunService.Heartbeatなどの一時的なアドホック接続のフレームワークを通知し、シーンの持続時間の早い時点にシークする際に接続がクリーンアップされるようにします。
Server SchemaSchema.OnRun = function()print("OnRun (Server)")Schema:schedule({StartTimes = {5},OnStart = function(self)-- Initialize temporary heartbeat connectionlocal tempConnection = RunService.Heartbeat:Connect(function()end)-- Inform framework of connectionSchema:inform(tempConnection)end})endOnRunライフサイクルフック中に、接続やその他の参照を初期化するカスタム「クリーンアップ」関数をModuleScriptで呼び出します。
Server Schemalocal 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 (Server)")Schema:schedule({StartTimes = {5},OnStart = function(self)-- Call "init" function in custom modulecustomModule.init()-- Call "clean" function in custom module on scene cleanupSchema:inform(customModule, customModule.clean)end,})endModuleScript - CustomModulelocal RunService = game:GetService("RunService")local CustomModule = {}CustomModule.init = function()-- Initialize heartbeat connectionCustomModule.connection = RunService.Heartbeat:Connect(function()end)endCustomModule.clean = function()-- Disconnect and clear heartbeat connectionif CustomModule.connection thenCustomModule.connection:Disconnect()CustomModule.connection = nilendendreturn CustomModule
関数
loadScene
loadSceneName(sceneName:string, startTime:number?)
sceneNameでシーンをプログラムによって読み込み、startTimeで最初から開始します。 シークが発生し、シーンの再生が開始する前に、サーバーからシーンを読み込むための 5 秒の「猶予時間」があります。 これは、午後 4 時 15 分 00 秒ちょうどにloadScene("[SceneName]", 20)を呼び出すと、フレームワークは要求された 20 秒に加えて 5 秒待ち、午後 4 時 15 分 25 秒にシーンを再生することを意味します。
Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- Figure out next scene to load when current scene finishes
EventSequencer.onOrchestrationFinished:Connect(function(endedSceneName)
if endedSceneName == "PreShow" then
-- "PreShow" ended; load the first scene in the concert
EventSequencer.loadScene("Track1")
elseif endedSceneName == "Track1" then
-- "Track1" ended; load the second scene in the concert
EventSequencer.loadScene("Track2")
else
-- Loop back to the pre-show scene
EventSequencer.loadScene("PreShow")
end
end)
createSchema
createSchema():table
シーンのロジックを作成するためのシーンスキーマのインスタンスを返します。
Client Schema
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
local Schema = EventSequencer.createSchema()
Schema.OnSetup = function(timePositionObject)
print("OnSetup (Client)")
end
seek
seek(time:number)
現在読み込まれているシーンの開始から、秒単位でtime値を探します。
Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))EventSequencer.seek(95.58)
setSceneWarningTime
setSceneWarningTime(endSceneTimeWindow:number)
全シーン終了後、警告が出るまでの時間を設定します。 警告は、クライアントサイドでは、onSceneEndingWarningForClientで、サーバーサイドではonSceneEndingWarningForServerで検出することができます。
Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- Load scene
EventSequencer.loadScene("BeautifulScene")
-- Set warning time to 5 seconds before the scene ends
EventSequencer.setSceneWarningTime(5)
-- Detect when scene is about to end
EventSequencer.onSceneEndingWarningForServer:Connect(function()
warn("Scene is about to end!")
end)
setSeekingPermissions
setSeekingPermissions(permissions:table)
イベントのPlaceIdや、特定のUserIdsおよび/またはグループとその中の役割に基づいて、権限を求めることを許可します。 詳細については、シーンの検索と切り替えをご覧ください。
getCurrentSceneEnvironment
getCurrentSceneEnvironment():Folder YIELDS
クライアントスキーマスクリプトまたはサーバースキーマスクリプトからそれぞれ呼び出されるかに応じて、現在のシーンのクライアントサイドまたはサーバーサイドの環境フォルダを返します。
Client Schema
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 (Client)")
-- Access scene environments; does not apply to Inline Mode
clientEnvironment = EventSequencer.getCurrentSceneEnvironment()
serverEnvironment = EventSequencer.getCurrentServerEnvironmentFromClient()
print("Current time is:", timePositionObject.Value)
end
Server Schema
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 (Server)")
serverEnvironment = EventSequencer.getCurrentSceneEnvironment()
partColorConnection = changePartColorEvent.OnServerEvent:Connect(function(player, changedPart, newColor)
serverEnvironment.changedPart.Color = newColor
end)
end
getCurrentServerEnvironmentFromClient
getCurrentServerEnvironmentFromClient():Folder YIELDS
現在のシーンのサーバー側環境フォルダを返します。 getCurrentSceneEnvironment とは異なり、クライアントスキーマスクリプトから呼び出すことができます。
Client Schema
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 (Client)")
-- Access scene environments; does not apply to Inline Mode
clientEnvironment = EventSequencer.getCurrentSceneEnvironment()
serverEnvironment = EventSequencer.getCurrentServerEnvironmentFromClient()
print("Current time is:", timePositionObject.Value)
end
isLoadingScene
isLoadingScene():boolean
シーンが現在読み込まれているかどうかを知るために、サーバーから呼び出されます。
Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))print(EventSequencer.isLoadingScene())while EventSequencer.isLoadingScene() dotask.wait()endprint("Scene loaded")
イベント
onSceneEndingWarningForClient
onSceneEndingWarningForClient(): RBXScriptSignal
シーンが終了する前に、クライアントで起動します。 デフォルトの時間は 3 秒ですが、setSceneWarningTimeで設定できます。 このイベントは、LocalScript内でのみ接続できます
LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- Detect when scene is about to end (client-side)
EventSequencer.onSceneEndingWarningForClient:Connect(function()
warn("Scene is about to end!")
end)
onSceneEndingWarningForServer
onSceneEndingWarningForServer(): RBXScriptSignal
シーンが終了する前に、サーバーで起動します。 デフォルトの時間は 3 秒ですが、setSceneWarningTimeで設定できます。 このイベントには、Script内でのみ接続できます。
Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- Detect when scene is about to end (server-side)
EventSequencer.onSceneEndingWarningForServer:Connect(function()
warn("Scene is about to end!")
end)
onSceneLoadedForClient
onSceneLoadedForClient(): RBXScriptSignal
シーンが開始されると、クライアントで起動します。 このイベントは、LocalScript内でのみ接続できます
LocalScript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- Detect when scene is starting (client-side)
EventSequencer.onSceneLoadedForClient:Connect(function()
warn("Scene is starting!")
end)
onOrchestrationFinished
onOrchestrationFinished(): RBXScriptSignal
シーンがその時間の長さに達し、実質的に終了したときにサーバー上で起動します。 このイベントは、終了したばかりのシーンのendedSceneName文字列名引数を受け取り、このイベントをチェーンオフすることで、別のシーンを条件付きで読み込むことができます。 Scriptでのみ接続できます。
Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local EventSequencer = require(ReplicatedStorage:WaitForChild("EventSequencer"))
-- Figure out next scene to load when current scene finishes
EventSequencer.onOrchestrationFinished:Connect(function(endedSceneName)
if endedSceneName == "PreShow" then
-- "PreShow" ended; load the first scene in the concert
EventSequencer.loadScene("Track1")
elseif endedSceneName == "Track1" then
-- "Track1" ended; load the second scene in the concert
EventSequencer.loadScene("Track2")
else
-- Loop back to the pre-show scene
EventSequencer.loadScene("PreShow")
end
end)