このチュートリアルは Verse Stand-Up テンプレートの付属ドキュメントであり、コメディ劇場内でのソーシャルでシネマティックな体験を支える以下の仕掛けを使用する方法を示しています。
キャラクターの仕掛けで、詳細度の高い MetaHumans Animator アセットを使用する
入力トリガーの仕掛けで、プレイヤー入力バインディングに対してゲームプレイ イベントをトリガーする
イスの仕掛けで、体験を見る位置にプレイヤーを固定する
下記で解説している Verse コードの主なコンセプトにより、Verse の仕掛けによってショーが演じられます。
Verse Stand-Up テンプレートは、UEFN (Unreal Editor for Fortnite) の機能サンプル セクションにあります。
使用されている仕掛けは以下のとおりです。
イス x 1
入力トリガー x 4
キャラクター x 4
ムービー シーケンス x 6
このチュートリアルで使用されている Verse のコンセプトは以下のとおりです。
サブスクリプション
if 文
配列
ムービー シーケンス
イスの仕掛けの API
入力トリガーの仕掛けの API
仕掛けのインタラクションの設定変更のほとんどは Verse コードを使用して行われているため、ほとんどの仕掛けで変更されているユーザー オプションはスリム化されていることに注意してください。
島設定
Verse Stand-Up テンプレートでは以下の島設定が変更されています。
| オプション | 値 | 説明 |
|---|---|---|
Max Players (最大プレイヤー数) | 1 | これはシングル プレイヤー体験です。 |
Team Size (チーム サイズ) | 1 | 必要なのは 1 チームだけです。 |
Join In Progress (途中参加) | 観戦 | すでに始まっているゲームに参加するプレイヤーは観戦します。 |
After Last Spawn Go To (最後のスポーン後の行き先) | Team Index (チーム インデックス):1 | プレイヤーは自分のチームにリスポーンされます。 |
Voice Chat (ボイスチャット) | All (全員) | プレイヤー間のボイス チャットは有効になっています。 |
Start With Pickaxe (ツルハシを持って開始する) | False | 最初の武器にツルハシを持ってゲームを開始することはありません。 |
Allow Spectating Other Teams (他のチームの観戦を許可) | 不許可 | プレイヤーは他のチームを観戦できません。 |
Time Limit (制限時間) | 120 | 制限時間は 2 時間に設定されています。 |
Hide Back Bling (バック アクセサリーを非表示) | True (オン) | この島ではバック アクセサリーは表示されません。 |
Allow Mantling/Hurdling (よじ登り/乗り越えを許可) | False | プレイヤーはよじ登ることも乗り越えることもできません。 |
Sprinting Energy Cost Per Second (1 秒ごとに消費されるダッシュ エネルギー量) | 2.0 | ダッシュによって消費されるエネルギー量です。 |
Invincibility (無敵) | True (オン) | プレイヤーは無敵です。 |
Allow Building (建築を許可) | None (なし) | プレイヤーは建築できません。 |
Building Can Destroy Environment (建築物が環境オブジェクトを破壊できる) | False | 建築物は環境オブジェクトを破壊できません。 |
Environment Damage (環境ダメージ) | Off (オフ) | プレイヤーは環境にダメージを与えられません。 |
Infinite Building Materials (無限建築素材) | False | この体験では建築は無効化されています。 |
Time of Day (時間帯) | 午前12時 | 時間設定は夜です。 |
Light Brightness (光の明るさ) | 0 | この体験でのすべての光源はランプから生じています。 |
Fog Thickness (霧の濃さ) | 30% | 少し霧がかかっている環境です。 |
Fog Color (霧の色) | 青 | 霧の色です。 |
Custom Victory Callout (カスタム勝利コールアウト) | Thank you for coming to The Cheese Cannery (The Cheese Cannery へのご来場ありがとうございました) | ゲームの終了後にプレイヤーに提示されるメッセージです。 |
Show Elimination Feed (撃破フィードを表示する) | False | 撃破は表示されません。 |
Show Wood/Stone/Metal Resource Count (木材/石材/金属資源の数量を表示) | False | 資源は表示されません。 |
Show Party Eliminations (パーティーの撃破数を表示する) | False | パーティーの撃破数は表示されません。 |
Debug (デバッグ) | True (オン) | デバッグ機能が有効になっています。 |
Fast Iteration Mode (高速繰り返しモード) | True (オン) | 編集モードとプレイ モードの間での高速繰り返しが有効になっています。 |
イスの仕掛け
プレイヤーがコメディ劇場に足を踏み入れると、ライトアップされたステージの前にイスが見え、 プレイヤーはそのイスに座るように促されます。 イスに座るとプレイヤーの位置が固定され、プレイヤーがその後に体験する一連のイベントが開始されます。
イスの仕掛けでは以下のユーザー オプションが変更されています。
| オプション | 値 | 説明 |
|---|---|---|
Chair Model (イスのモデル) | カスタム | この体験では、イスは実際には見えなくなり、劇場の雰囲気にふさわしくなるようにフォートナイトのイスの小道具と置き換えられます。 |
Interaction Angle (インタラクト角度) | 180度 | イスとインタラクトするために必要な、イスの正面からのいずれかの方向の角度です。 |
Interaction Radius (インタラクト範囲) | 1.2 m | プレイヤーがイスに入れるようになる、イスからの距離を決定します。 |
入力トリガーの仕掛け
入力トリガーの仕掛けは、イスの仕掛けと密接に関連しています。 プレイヤー入力をさまざまな行動にバインドし、その行動が再割り当てされたボタンをプレイヤーが押すごとにトリガーされます。 入力トリガーは、パフォーマンスが行われているときにプレイヤーがカメラを切り替えることができるように設定されています。
この仕掛けには利用可能な 12 個の入力があり、その中から選択して使用します。 入力を選択すると、HUD の説明を追加して、新しい入力が何をするものかを明確にすることができます。
この仕掛けでは以下のユーザー オプションが変更されています。 それぞれの仕掛けは異なるムービー シーケンスの仕掛けにバインドされているため、バインディングと HUD の説明は仕掛けごとに異なります。
| オプション | 値 | 説明 |
|---|---|---|
Creative Input (クリエイティブ入力) | カスタム5(ダッシュ) | この仕掛けがリッスンしている入力を定義します。 |
HUD Description (HUDの説明) | 「Previous Camera (前のカメラ)」 | 新しい入力をプレイヤーに説明することができます。 |
Registered Player Behavior (登録されているプレイヤー動作) | Require Registration (登録が必要) |
|
キャラクターの仕掛け
キャラクターの仕掛けは、プレイヤーまたはシーン内の他のキャラクターと直接インタラクトする手段です。 このテンプレートでは、オンステージのルーチン中に切り替わる 4 つのキャラクターが使用されています。
キャラクターの仕掛けでは以下のユーザー オプションが変更されています。
| オプション | 値 | 説明 |
|---|---|---|
Character (キャラクター) | キャラクターを 1 つ選択します。 | どのキャラクターが表示されるかを指定します。 |
Custom Idle (カスタム アイドリング) | 座り中 | キャラクターのカスタム アイドリング位置を選択します。 |
Random Idle Start (ランダムなアイドリング開始) | True (オン) | アイドリングがランダムな位置から始まるかどうかを決定する。 |
メイン キャラクターは舞台裏の階段に座っていて、他のキャラクターは奥の小部屋で待機しています。
[Character (キャラクター)] ドロップダウン メニューにあるさまざまなキャラクター スキンを試し、ステージ上でどのように見えるかを確認します。
このテンプレートでは、インポート済みの MetaHuman アニメーションを使用しています。 これらのアニメーションがどのようにキャプチャーおよびインポートされたかの詳細については、「MetaHuman アニメーションをインポートする」ページを参照してください。
ムービー シーケンスの仕掛け
6 つのムービー シーケンスの仕掛けによって、プレイヤーはイスの仕掛けに座ったままでさまざまな角度からショーを見ることができます。
このページでは、ムービー シーケンスの作成の詳細については説明しません。 詳細については「シーケンサーおよびコントロール リグ」ページを参照し、さらに詳しくは「シーケンサーの基本」を参照してください。
この仕掛けで変更されているのは、ロード済みのムービー シーケンスだけです。
Verse でショーが演じられる仕組み
このテンプレートでは、Verse を使用して、プレイヤーがイスの仕掛けに座ったときにショーを開始し、カメラを TV モードというムービー ビューに変更します。 また、プレイヤーが複数のカメラを切り替えることができ、TV モードまたはフリールックに戻って異なる表示を体験できるようにしています。
プロジェクトで Verse Explorer を使用して show_template_device.verse という新しい Verse の仕掛けを作成し、その仕掛けをテンプレートにドラッグします。 Verse ファイルをダブルクリックすると、そのファイルが Visual Studio Code で開かれます。
スタンドアップ ショーを演じるのに役立つ仕掛けをテンプレートでセットアップしました。次にコードでそれらの仕掛けを参照します。
以下のフィールドを「show_template_device」ファイルに追加します。
まず、
show_template_deviceクラス定義の上にlog_show_template_deviceという名前のlog_channelを追加します。Verse# Create a custom log channel for the show_template_device. This helps with log filtering in complex games with lots of log sources. log_show_template_device := class(log_channel){} # A Verse-authored creative device that can be placed in a level show_template_device := class(creative_device):次に、
show_template_deviceクラス定義の先頭で、log_show_template_deviceチャンネルを使用するロガーを追加して、どのPrint()文がこの仕掛けからのものであるかを見分けることができるようにします。Verse# A Verse-authored creative device that can be placed in a level show_template_device := class(creative_device): # Logger that uses custom log channel. Logger:log = log{Channel := log_show_template_device}TheChairという名前の、編集可能なイスの仕掛け。 これは、プレイヤーが座るとスタンドアップ ショーが始まるイスです。Verse# The chair device the player should sit in. @editable TheChair:chair_device = chair_device{}MainSequenceとTVModeSequenceという名前の、2 つの編集可能なムービー シーケンスの仕掛け。MainSequenceは、スタンドアップ ショーを演じるムービー シーケンスであり、レベルにあるキャラクターの仕掛け上でアニメーションとオーディオを操作します。TVModeSequenceは、プレイヤーのカメラを、MainSquenceと連動して追従する表示モードに切り替え、複数の角度を切り替えます。Verse# The sequence that drives animation and audio on the character device in the level. @editable MainSequence:cinematic_sequence_device = cinematic_sequence_device{} # The sequence that drives the TV mode sequence for viewing in the level. @editable TVModeSequence:cinematic_sequence_device = cinematic_sequence_device{}CameraSwitchesという名前の、cinematic_sequence_deviceの編集可能な配列。 この配列には、ショーの上演中にプレイヤーが切り替えることができるそれぞれのカメラへの参照が保持されています。Verse# A list of alternative camera sequences that are provided to view from during the main sequence. @editable CameraSwitches:[]cinematic_sequence_device = array{}4 つの編集可能な
input_trigger_device。 これらのそれぞれの仕掛けは、プレイヤー入力を受け取って、異なるカメラ モードを切り替えます。ReturnToFreeLookトリガーは、プレイヤーをデフォルトのカメラに戻し、ReturnToTVModeはプレイヤーをTVModeSequenceに戻します。NextCameraとPreviousModeカメラは、プレイヤーをCameraSwitches配列内のさまざまなムービー シーケンスで切り替えます。Verse# An input trigger that will return us to free look while in the chair. @editable ReturnToFreeLook:input_trigger_device = input_trigger_device{} # An input trigger that will return us to TV mode when appropriate in the chair. @editable ReturnToTVMode:input_trigger_device = input_trigger_device{} # An input trigger that will choose the next camera while in the chair. @editableCurrentSequenceという名前の、オプションのムービー シーケンスの仕掛け変数。TVModeSequenceなどのムービー シーケンスが再生中であれば、そのシーケンスへの参照がこのオプションに格納されます。 キャラクターに対して同時に複数のムービー シーケンスを再生することは避けたいため、このオプションを使用して、新しいシーケンスに切り替わるときに現在のシーケンスをオフにすることができます。Verse# The alternative camera sequence that is playing if valid. var CurrentSequence:?cinematic_sequence_device = falseMainSequencePlayingとInTvModeという名前の、2 つのロジック変数。 これらの変数を使用して、MainSequenceまたはTVModeSequenceがそれぞれいつ再生されているかをトラックできます。Verse# Helps us track when the main sequence on the character device is playing. var MainSequencePlaying:logic = false # When we are in TV mode. var InTVMode:logic = falseCurrentCameraIndexという名前の int 変数。 これは、CameraSwitches配列にある現在再生中のムービー シーケンスのインデックスをトラックします。Verse# Keeps track of what camera we are viewing when using other cameras besides TV Mode. var CurrentCameraIndex:int = -1このテンプレートで参照されているすべてのイベントのサブスクリプションをトラックする 5 つのオプションの
cancelable変数。 プレイヤーがカメラを切り替えるとき、フリールックまたは TV モードに戻るとき、イスの仕掛けから離れるとき、それぞれで異なる関数を実行する必要があります。 このチュートリアルの後半で、関数をトリガーするイベントをその関数でサブスクライブし、必要なくなったときにキャンセルできるようにそれぞれのサブスクリプションへの参照を格納します。Verse# Subscriptions to all the events we listen for while running. var ReturnToFreeLookSubscription:?cancelable = false var NextCameraSubscription:?cancelable = false var PrevCameraSubscription:?cancelable = false var ReturnToTVModeSubscription:?cancelable = false var ChairExitSubscription:?cancelable = falseこのスクリプトを Visual Studio Code に保存してコンパイルし、レベル内の Verse で作成した仕掛けを更新します。
テンプレートで
show_template_deviceを選択します。 [Details (詳細)] パネルで、入力トリガーとムービー シーケンスも含めて、スクリプト内の各仕掛けへの参照を、レベル内の関連付けられている仕掛けに割り当てます。
シーケンスをトリガーする
ショーはプレイヤーがイスの仕掛けに座ると始まるため、プレイヤーが着席するとムービー シーケンスが開始されるようにします。 以下のステップに従って、プレイヤーがイスに座ったときにメイン シーケンスをトリガーし、プレイヤーが見ることができるように TV モードを開始します。
新しい関数
RunSequence()をshow_template_deviceクラスに追加します。 この関数は、ショーを開始したエージェントを受け取り、MainSequence とTVModeSequenceの両方を開始します。 非同期で実行されるように、RunSequence()に モディファイアを追加します。 他のコードをシーケンスと並列で実行でき、RunSequence()コードを中断することなくプレイヤーがカメラ ビューを切り替えることができるように、この関数は非同期である必要があります。Verse# Handles running the main sequence which runs the character and TV mode sequences for viewing and then calls a function to await finishing. RunSequence(Agent:agent)<suspends>:void =RunSequence()内でSleep()を 1 秒間呼び出して、プレイヤーがイスに座るアニメーションが終了してから、ショーが開始されるようにします。 その後に、MainSequenceのPlay()を呼び出して、MainSequencePlayingを true に設定します。Verse# Sleep for a second because we just entered the chair and the animation to sit takes a moment. Sleep(1.0) # Run the Main sequence on the character device and the TV mode viewing sequence. Logger.Print("Main Sequence Playing") set MainSequencePlaying = true MainSequence.Play()ショーを開始したエージェントを渡して
TVModeSequenceのPlay()を呼び出して、エージェントのカメラをムービー ビューに変更します。InTVModeを true に設定し、MainSequenceの終了を待機するAwaitMainSequenceEnding()という新しい関数を、エージェントを渡して呼び出します。 この関数は次のステップでセットアップします。 完成したRunSequence()のコードは次のようになっています。Verse# Handles running the main sequence which runs the character and TV mode sequences for viewing and then calls a function to await finishing. RunSequence(Agent:agent)<suspends>:void = # Sleep for a second because we just entered the chair and the animation to sit takes a moment. Sleep(1.0) # Run the Main sequence on the character device and the TV mode viewing sequence. Logger.Print("Main Sequence Playing") set MainSequencePlaying = true MainSequence.Play()RunSequence()からagentを受け取る新しい関数AwaitMainSequecingEnding()をshow_template_deviceクラスに追加します。 この関数はバックグラウンドで実行され、MainSequenceが終了したときにトリガーされるようにするため、<suspends>モディファイアも必要とします。Verse# When the main sequence finishes, we clear the flag so that if the player sits back down, it will play again. AwaitMainSequencingEnding(Agent:agent)<suspends>:void =AwaitMainSequencingEnding()内でMainSequence.StoppedEvent()のAwait()を呼び出します。MainSequenceが終了したら、MainSequencePlayingをfalseに設定し、イスのEject()関数を使用して、プレイヤーをイスから追い出します。 完成したAwaitMainSequencingEnding()関数は次のようになっています。Verse# When the main sequence finishes, we clear the flag so that if the player sits back down, it will play again. AwaitMainSequencingEnding(Agent:agent)<suspends>:void = MainSequence.StoppedEvent.Await() Logger.Print("Main Sequence Ended") set MainSequencePlaying = false # Kick the player out of the chair after the performance TheChair.Eject(Agent)2 つの新しい関数
DoReturnToTVMode()とDoReturnToFreeLook()をshow_template_deviceクラスに追加します。 これらの関数は、プレイヤーが TV モードまたはフリールックに戻った場合のロジックをそれぞれ処理しますが、今は空のままにしておき、この後のステップで記述します。Verse# Returns us to our TV viewing mode sequence by checking where the main sequence is and aligning our playback to that point. DoReturnToTVMode(Agent:agent):void = Logger.Print("Return to TV Mode") # Determine if we are in TV mode or another camera sequence and return control to the main player camera. DoReturnToFreeLook(Agent: agent):void = Logger.Print("Return to Free Look")TheChairに座ったエージェントを受け取る新しい関数OnSeated()をshow_template_deviceクラスに追加します。Verse# This function handles the player sitting down and starting up the performance if it isn't already running and setting up the input triggers. OnSeated(Agent:agent):void = Logger.Print("Player sat down")OnSeated()内で、MainSequenceがまだ再生されていなければ、イスの仕掛けに座ったエージェントを渡してRunSequence()関数をスポーンします。 再生されている場合は、同じエージェントを渡してDoReturnToTVMode()を呼び出します。Verse# This function handles the player sitting down and starting up the performance if it isn't already running and setting up the input triggers. OnSeated(Agent:agent):void = Logger.Print("Player sat down") # If the main sequence is not playing on the character device in the level, run it, otherwise if it is running then just return to the TV mode viewing experience. if (MainSequencePlaying = false): spawn{RunSequence(Agent)} else: DoReturnToTVMode(Agent)イスから離れたプレイヤーを受け取る新しい関数
OnChairExited()をshow_template_deviceクラスに追加します。 この関数のロジックは、後のステップで記述します。Verse# Handles the player leaving the chair and removing access to the input triggers that are available while in the chair. OnChairExited(Agent:agent):void = Logger.Print("Player got up")OnBegin()内で、TheChair.SeatedEventをOnSeated()関数にサブスクライブします。 これで、プレイヤーがTheChairに座るたびにショーが開始されるようになりました。Verse# Runs when the device is started in a running game. OnBegin<override>()<suspends>:void = Logger.Print("Standup Template device started") TheChair.SeatedEvent.Subscribe(OnSeated)
Visual Studio Code でスクリプトを保存してコンパイルし、UEFN ツールバーにある [Launch Session (セッションを起動)] をクリックして、テンプレートをプレイテストします。 ゲームを実行し、イスの仕掛けに座るとショーが始まり、プレイヤーのカメラをムービー モードに設定します。 ショーが終わると、プレイヤーはイスから追い出されます。
カメラを切り替える
ショーの上演中に、TheChair に座っているプレイヤーは、異なるムービー シーケンスで処理される複数の異なるカメラ ビューを切り替えることができます。 以下のステップに従って、異なるシーケンスを切り替えるロジックをセットアップします。
新しい関数
DoCameraSwitch()をshow_template_deviceクラスに追加します。 この関数は、切り替え先のカメラのエージェントと、CameraSwitches内での該当するムービー シーケンスのインデックスを表すintを受け取ります。Verse# Switches us between camera sequences that have been specified by stopping any current ones and moving to the next appropriate one on the list. DoCameraSwitch(Agent:agent, Value:int):void =DoCameraSwitch()内のif文で、CameraSwitches配列内の Value インデックスにあるムービー シーケンスを取得します。 そして、CurrentSequenceにムービー シーケンスが入っているかどうかをチェックし、シーケンスに対してStop()を呼び出すことで、再生中のすべてのシーケンスを停止します。Verse# Switches us between camera sequences that have been specified by stopping any current ones and moving to the next appropriate one on the list. DoCameraSwitch(Agent:agent, Value:int):void = if (CameraSwitch := CameraSwitches[Value]): Logger.Print("Switching Cameras to {Value}") # Stop any currently playing other camera sequence. if (PlayingSequence := CurrentSequence?): PlayingSequence.Stop(Agent)CameraSwitchのPlay()を呼び出すことで、新しいムービー シーケンスの再生を開始します。 そして、現在再生中のシーケンスを指すようにCurrentSequenceを設定します。 最後に、Register()を呼び出して、切り替え先のカメラのagentをReturnToTVModeとReturnToFreeLookの各入力トリガーに登録し、他のカメラを表示しているときにそれぞれのモードに戻ることができるようにします。 完成したDoCameraSwitch()関数は次のようになっています。Verse# Switches us between camera sequences that have been specified by stopping any current ones and moving to the next appropriate one on the list. DoCameraSwitch(Agent:agent, Value:int):void = if (CameraSwitch := CameraSwitches[Value]): Logger.Print("Switching Cameras to {Value}") # Stop any currently playing other camera sequence. if (PlayingSequence := CurrentSequence?): PlayingSequence.Stop(Agent) # Start up the new camera viewing sequence.次のカメラと前のカメラを切り替えるために、よく似ている 2 つの関数
DoNextCamera()とDoPreviousCamera()をセットアップします。 まず、次のカメラのロジックを記述するために、新しい関数DoNextCamera()をshow_template_deviceクラスに追加します。 この関数は、切り替え先のカメラのagentを受け取ります。Verse# Switches to the next camera on our list, or the first if we are in TV mode. DoNextCamera(Agent:agent):void = Logger.Print("Next Camera")DoNextCamera()関数内で、プレイヤーが現在 TV モードであるかどうかをチェックします。 TV モードであれば、Stop()を呼び出してTVModeSequenceを停止し、InTVModeを false に設定してCurrentCameraIndexを-1に設定します。CameraSwitches配列内の次のムービー シーケンスのインデックスがインデックス0になるようにするために、ここでは-1を使用しています。Verse# If we are currently viewing from TV Mode, end that sequence and clear associated values. if (InTVMode?): TVModeSequence.Stop(Agent) set InTVMode = false set CurrentCameraIndex = -1現在のカメラのインデックスに基づいて、切り替え先の次のカメラを割り出す必要があります。 そのために、新しい変数
NextCameraValueを、CurrentCameraIndex + 1とCameraSwitches.LengthのModに設定します。 これにより、NextCameraValueが0とCameraSwitchesの長さの間の値にクランプされるため、NextCameraValueがCameraSwitches配列の範囲外の値にならないようにできます。NextCameraValueを算出したら、CurrentCameraValueをNextCameraValueに設定し、agentとCurrentCameraIndexを渡して、DoCameraSwitch()を呼び出します。 完成したDoNextCamera()関数は次のようになっています。Verse# Switches to the next camera on our list, or the first if we are in TV mode. DoNextCamera(Agent:agent):void = Logger.Print("Next Camera") # If we are currently viewing from TV Mode, end that sequence and clear associated values. if (InTVMode?): TVModeSequence.Stop(Agent) set InTVMode = false set CurrentCameraIndex = -1前のカメラに切り替えるために、
DoPreviousCamera()という新しい関数をshow_template_deviceクラスに追加します。DoNextCamera()のコードをこの関数にコピーします。 プレイヤーが現在 TV モードであるかどうかをチェックする際に、CurrentCameraIndexを-1ではなく0に設定します。 また、NextCameraValueがCurrentCameraIndex - 1とCameraSwitches.LengthのModになるように変更します。完成したDoPreviousCamera()関数は次のようになっています。Verse# Switches us to the previous camera on the list or last camera if we are leaving TV mode. DoPreviousCamera(Agent:agent):void = Logger.Print("Prev Camera") # If we are currently viewing from TV Mode, end that sequence and clear associated values. if (InTVMode?): TVModeSequence.Stop(Agent) set InTVMode = false set CurrentCameraIndex = 0
プレイヤーが TheChair に座っていて、CameraSwitches にある別のカメラから見ている場合に、TV モードまたはフリールックに戻ることができます。 以前にセットアップした DoReturnToFreeLook() 関数と DoReturnToTVMode() 関数を、ここで記述します。
DoReturnToFreeLook()関数内で、プレイヤーが現在 TV モードであるかどうかをチェックします。 TV モードであれば、Stop()を呼び出してTVModeSequenceを停止し、InTVModeを false に設定します。CurrentSequenceでも同様に、CurrentSequenceにムービー シーケンスが入っているかどうかをチェックし、Stop()を呼び出して、入っている場合は false に設定します。Verse# If TV Mode is active, stop it. if (InTVMode?): TVModeSequence.Stop(Agent) set InTVMode = false # If we are playing another viewing experience, stop it. if (TempSeq := CurrentSequence?): TempSeq.Stop(Agent) set CurrentSequence = false次に、
Register()を呼び出してエージェントをReturnToTVMode入力トリガーに登録し、Unregister()を呼び出してエージェントをReturnToFreeLookトリガーから登録解除します。これは、プレイヤーがすでにフリールック モードであればフリールック モードに戻らないようにするためです。 完成したDoReturnToFreeLook()関数は次のようになっています。Verse# Determine if we are in TV mode or another camera sequence and return control to the main player camera. DoReturnToFreeLook(Agent: agent):void = Logger.Print("Return to Free Look") # If TV Mode is active, stop it. if (InTVMode?): TVModeSequence.Stop(Agent) set InTVMode = false # If we are playing another viewing experience, stop it.DoReturnToTVMode()関数では、TV モードに戻るときに、MainSequenceの現在の経過時間でTVModeSequenceを開始する必要があるため、より多くのロジックが必要です。 まず、この関数が呼び出されたときに、プレイヤーがすでに TV モードであるかどうかをチェックします。 TV モードであれば、何もする必要がないため、returnするだけです。 次に、CurrentSequenceにムービー シーケンスが入っているかどうかをチェックし、Stop()を呼び出して、入っている場合はfalseに設定します。Verse# If we are already in TV mode no need to return to it. if (InTVMode?): return # If we have another camera sequence playing, stop it and clear associated values. if (TempSeq := CurrentSequence?): TempSeq.Stop(Agent) set CurrentSequence = false次に、
MainSequenceのどこが再生されているかを割り出し、それと同じ時間からTVModeSequenceを開始します。GetPlayBackTime()を呼び出してMainSequenceの再生経過時間を取得し、それを変数CurrentSeekTimeに格納します。SetPlaybackTime()を使用してTVModeSequenceの再生経過時間をCurrentSeekTimeに設定し、エージェントを渡してPlay()を呼び出してシーケンスを再生します。 その後、InTVModeをtrueに設定します。Verse# Figure out where the main sequence is in its playback and start up the TV mode sequence at the same spot to provide the proper viewing experience. CurrentSeekTime := MainSequence.GetPlaybackTime() TVModeSequence.SetPlaybackTime(CurrentSeekTime) TVModeSequence.Play(Agent) set InTVMode = true最後に、
Unregister()を呼び出してReturnToTVMode入力トリガーからエージェントを登録解除し、Register()を呼び出してそのエージェントをReturnToFreeLookトリガーに登録します。 完成したDoReturnToTVMode()関数は次のようになっています。Verse# Returns us to our TV viewing mode sequence by checking where the main sequence is and aligning our playback to that point. DoReturnToTVMode(Agent:agent):void = Logger.Print("Return to TV Mode") # If we are already in TV mode no need to return to it. if (InTVMode?): return # If we have another camera sequence playing, stop it and clear associated values. if (TempSeq := CurrentSequence?):
すべてを一つに結合する
このチュートリアルのここまでの部分で多くの関数をセットアップしました。それらすべてを、それらを呼び出すさまざまな入力トリガーに結合します。
OnSeated()内で、Register()を呼び出して、エージェントをReturnToFreeLook、NextCamera、およびPreviousCameraの各入力トリガーに登録します。これらは、プレイヤーが初めてイスに座ったときに最初からアクセスできるトリガーであるためです。 そして、それぞれの入力トリガーを関連付けられている関数にサブスクライブすることで、ReturnToFreeLookSubscription、NextCameraSubscription、およびPreviousCameraSubscriptionを設定します。 同じように、ReturnToTVModeSubscriptionとChairExitSubscriptionを設定します。Verse# Register for the input trigger for free look and subscribe to the pressed event when sitting. ReturnToFreeLook.Register(Agent) set ReturnToFreeLookSubscription = option{ReturnToFreeLook.PressedEvent.Subscribe(DoReturnToFreeLook)} # Register for the input trigger for the next camera and subscribe to the pressed event when sitting. NextCamera.Register(Agent) set NextCameraSubscription = option{NextCamera.PressedEvent.Subscribe(DoNextCamera)} # Register for the input trigger for the previous camera and subscribe to the pressed event when sitting. PreviousCamera.Register(Agent)オプションのキャンセル可能値を受け取る新しい関数
CancelSubscription()をshow_template_deviceクラスに追加します。CancelSubscription()内で、Subscriptionに値が入っているかどうかをチェックします。 値が入っている場合は、Cancel()を呼び出してそれをキャンセルします。 完成したCancelSubscription()は次のようになっています。Verse# Cancel a subscription if it is valid. CancelSubscription(Subscription:?cancelable):void = if (SubscriptionToCancel := Subscription?): SubscriptionToCancel.Cancel()プレイヤーがイスを離れるときに、そのプレイヤーで現在再生されているすべてのシーケンスを停止し、そのプレイヤーに登録されている入力トリガーのすべてのサブスクリプションをキャンセルする必要があります。
OnChairExited()関数内で、DoReturnToFreeLook()内と同様に、プレイヤーが現在 TV モードであるかどうか、およびCurrentSequenceにムービー シーケンスが入っているかどうかをチェックします。 ムービー シーケンスが入っている場合は各シーケンスのStop()を呼び出し、プレイヤーが TV モードであればInTVModeをfalseに設定します。 その後、CurrentSequenceをfalseに設定します。Verse# Stop the TV camera view when we leave the chair if it is active. if (InTVMode = true): TVModeSequence.Stop(Agent) set InTVMode = false # Stop the camera sequence we were using if it is active when we leave the chair. if (TempSeq := CurrentSequence?): TempSeq.Stop(Agent) # Clear whatever the current sequence was when we leave the chair.次に、各サブスクリプションを
CancelSubscription()関数に渡すことで、プレイヤーのすべてのサブスクリプションをキャンセルします。 また、イスを離れるときにプレイヤーがボタンにアクセスできないようにするために、Unregister()を呼び出して各入力トリガーからプレイヤーを登録解除します。 完成したOnChairExited()関数は次のようになっています。Verse# Handles the player leaving the chair and removing access to the input triggers that are available while in the chair. OnChairExited(Agent:agent):void = Logger.Print("Player got up") # Stop the TV camera view when we leave the chair if it is active. if (InTVMode = true): TVModeSequence.Stop(Agent) set InTVMode = false # Stop the camera sequence we were using if it is active when we leave the chair.
Visual Studio Code でスクリプトを保存してコンパイルし、UEFN ツールバーにある [Launch Session (セッションを起動)] をクリックして、テンプレートをプレイテストします。 プレイテスト時に、イスの仕掛けに座ると、ショーが開始されるはずです。 ショーの上演中に、TV モード、フリールック、他の複数のカメラ角度の間を切り替えることができるはずです。 TV モードに戻ると、TV モードのシーケンスがメイン シーケンスと揃っているはずです。 ショーが終了すると、フリールックに戻っていて、イスを離れることができるはずです。