ゲームのビジュアルと雰囲気でカメラが重要な役割を果たします。第三者視点のカメラでは、プレイヤーは空間全体をよく把握でき、一方プレイヤー視点のカメラでは、ゲーム ワールドの細部をとらえることができます。ゲームプレイ中にカメラを切り替えると、異なった感覚を生み出し、複数カメラでトランジションすると、ゲーム体験に大きな多様性を加えることができます。たとえば、固定カメラを使用した、横スクロール セクションを作成して、面白いプラットフォームチャレンジを構築できます。
UEFN で Verse を使用してカメラの変更を処理することができます。イベントをリッスンする仕掛けを使用することにより、カメラをプレイヤーに追加して、そのイベントがトリガーされると、カメラ ビューを変更できます。この例では、軌道カメラ の仕掛けをシネマティックの最後にプレイヤーに追加します。プレイヤー視点をシミュレートするように軌道カメラの設定を変更でき、シネマティックの最後にカメラを追加することで、第三者視点からプレイヤー視点へ円滑にトランジションできます。ゲームプレイへの追加として、この例では、プレイヤーが武器をつかみ、それをドアにスイングすると、シネマティックをトリガーします。この例を想定する体験のニーズに合うように調整できます。たとえば、壊れた船の扉を直すためにレンチを使う、または岩を粉砕するためにハンマーをスイングして、秘密のエリアを見つけるなどがあります。これらの考え方を幅広く適用して、クールなゲームプレイのシーンを作成することもできます。たとえば、新しいゾーンに入るときは広角の視野からスタートし、プレイヤーが謎を解く必要があるときに、トップダウン ビューに切り替え、または不気味なホラー体験ではプレイヤー視点に切り替えます。
このチュートリアルに従って、Verse の仕掛けを作成する方法を習得します。この仕掛けでは、プレイヤーがドアを開けたときに、ムービーシーケンスを使用して第三者視点からプレイヤー視点にトランジションします。
この例では、次の言語機能を使用します。
-
クラス:この例では、プレイヤーがドアを開いたときに、シネマティックを起動する Verse クラスを作成します。
-
オプション:オプション変数にサブスクライブ可能イベントを保存でき、後からそれらのイベントへのサブスクリプションをキャンセルできます。
この例では、次の API を使用します。
- Subscribable:ドアに隣接したボリュームにプレイヤーが入った時点を把握できるイベントにサブスクライブし、プレイヤーがボタンにインタラクトしたときに、アイテムを付与します。
レベルを設定する
この例では、次の仕掛けを使用します。
-
1 x ボタンの仕掛け:プレイヤーがボタンとインタラクトすると、アイテムグランターの仕掛けから剣を受け取ります。
-
1 x アイテムグランターの仕掛け:アイテムグランターにより、ドアから入って先に進むために必要な剣がプレイヤーに付与されます。
-
1 x 条件付きボタンの仕掛け:必須の武器は、条件付きボタンの キーアイテム として設定し、プレイヤーが必須の剣を持っていないかぎり、ドアから入れないようにできます。
-
1 x 入力トリガーの仕掛け:射撃入力アクションをリッスンすることで、プレイヤーが攻撃するとドアが開きます。これが発生するのは、プレイヤーがボリュームの仕掛け内部にいるときで、プレイヤーが剣を持っていて、ドアがまだ開かれていない場合だけです。
-
1 x ボリュームの仕掛け:ドアを開けるために、剣での攻撃トリガーを使用しないので、ボリュームの仕掛けにより、ドアを開けるために必ずドアのすぐ前に来ることが必要になります。
-
1 x ムービー シーケンスの仕掛け:第三者視点からプレイヤー視点に滑らかにトランジションするには、開いたドアを表示するシネマティックをプレイし、プレイヤー視点に一致するようにカメラの位置を再設定します。
-
1 x 軌道カメラの仕掛け:プレイヤー視点のビューを作成するには、キャラクターの胸部に設置された軌道カメラを使用して、プレイヤー視点のビューポイントを再現します。このビューが生まれるのは、プレイヤーがドアを開いて、シネマティックがプレイされた後だけです。
-
1 x ロックの仕掛け:これにより、ドアのロック状態が維持され、プレイヤーが必須の武器を持つまで、ドアは開きません。
-
1 x マップ インジケータの仕掛け:これにより、プレイヤーが武器をピックアップすると、ミニマップにドアの位置が表示されます。
レベルを設定するには、次の手順を実行します。
アイテム グランターとボタン
ドアを開くために必要な武器をプレイヤーに付与するには、アイテム グランターとボタンの仕掛けを使用します。プレイヤーがボタンとインタラクトすると、アイテム グランターがプレイヤーに武器を付与します。これらの要素を追加するには、次の手順を実行します。
-
1 つの アイテム グランター の仕掛けをレベルに追加します。
-
[Outliner (アウトライナー)] でアイテム グランターを選択します。[Details (詳細)] パネルの [User Options (ユーザー オプション)] で次のように値を設定します。
オプション 値 説明 アイテム定義 剣 これはプレイヤーがドアを開くための武器です。 付与されたアイテムの装備 オン この例では、プレイヤーが武器をピックアップしたら、即座に装備します。 -
1 つの ボタン の仕掛けをレベルに追加します。
-
[Outliner (アウトライナー)] でボタンを選択します。[Details (詳細)] パネルの [User Options (ユーザー オプション)] で次のように値を設定します。
オプション 値 説明 インタラクトテキスト 「ピックアップ」 プレイヤーがボタンとやり取りするように促すテキストです。 起動可能回数 1 これ例では、プレイヤーは武器を 1 回だけピックアップできます。
入力トリガー
プレイヤーが武器をスイングしたタイミングを把握するために、特定のアクションをリッスンする入力トリガーを使用できます。プレイヤーが武器をスイングしたときに、入力トリガーが起動されます。入力トリガーを追加するには、次の手順を実行します。
-
1 つの 入力トリガー の仕掛けをレベルに追加します。
-
[Outliner (アウトライナー)] で入力 トリガーを選択します。[Details (詳細)] パネルの [User Options (ユーザー オプション)] で次のように値を設定します。
オプション 値 説明 入力タイプ 標準アクション 発射 は標準アクションであり、プレイヤーが武器をスイングしたタイミングを把握するために、入力トリガーでリッスンする必要がある対象です。 標準の入力 発射 発射は、プレイヤーが武器をスイングしたタイミングを把握するために、入力トリガーでリッスンする必要があるアクションです。 HUD に表示 オフ このアクションを HUD に表示する必要はありません。
ボリューム
プレイヤーがドアを開くためにドアのそばに必ず立つように、ボリュームの仕掛けをドアのそばで使用して、プレイヤーがその中にいるのかをチェックします。ボリュームの仕掛けを追加するには、次の手順を実行します。
-
ドアをレベルに追加します。これは武器を使用してプレイヤーが開くドアです。
-
ボリューム の仕掛けをレベルに追加します。このボリュームの仕掛けは、ドアの前の小さな領域、つまりプレイヤーに攻撃させる領域とオーバーラップする必要があります。
-
プレイヤーが攻撃するときに、必要な領域に合うように、トランスフォーム を変更することで、ボリュームの仕掛けのサイズを変更します。入力トリガーは、プレイヤーがこのボリュームの中にいる間の発射イベントだけをリッスンして、想定する体験のニーズを必ず満たすようにします。
ロック
武器を手に入れるまでプレイヤーがドアを開けられないようにするため、ロックの仕掛けを使用してドアをロックできます。ロックの仕掛けを追加するには、次の手順を実行します。
-
ロック の仕掛けを追加して、ドアにアタッチします。
-
[Outliner (アウトライナー)] でロックを選択します。[Details (詳細)] パネルの [User Options (ユーザー オプション)] で [Visible in Game (ゲーム中に表示)] を [false (オフ)] にします。
マップ インジケータ
プレイヤーが武器を取得した場所が目標から非常に離れているとき、マップ インジケータを使用して目標の場所をプレイヤーに示すことができます。これによりマップとミニマップにイメージが表示され、プレイヤーにドアの場所を示すために目標パルスを起動できます。マップ インジケータを追加するには、次の手順を実行します。
-
マップ インジケータ の仕掛けをレベルに追加し、ドアの下で非表示にします。
-
[Outliner (アウトライナー)] でマップ インジケータを選択します。[Details (詳細)] パネルの [User Options (ユーザー オプション)] で次のように設定します。
オプション 値 説明 ゲーム開始時に有効化 オフ マップ インジケータはプレイヤーが武器をピックアップした後にはじめて有効になります。 小アイコン アイコンを選択 ミニマップに表示するアイコンを選択します。 大アイコン アイコンを選択 マップに表示するアイコンを選択します。
条件付きアイテム ボタン
ドアを開くために必要な正しい武器をスイングしたことを把握するために、条件付きアイテム ボタンを使用して、スイングしたときに、持っている武器をチェックできます。条件付きアイテム ボタンを追加するには、次の手順を実行します。
-
条件付きアイテム ボタン の仕掛けをレベルに追加します。
-
[Outliner (アウトライナー)] で条件付きアイテム ボタンを選択します。[Details (詳細)] パネルの [User Options (ユーザー オプション)] で次のように値を設定します。
オプション 値 説明 キーアイテムを消費 オフ プレイヤーがドアを開いたときに、武器を消費しません。 キー アイテム 1 アイテムの定義 武器 ドアを開くためにプレイヤーに必要な武器です。
軌道カメラ
プレイヤー視点のビューをシミュレートするには、軌道カメラを使用して、プレイヤーのパースペクティブを変更できます。軌道カメラを追加するには、次の手順を実行します。
-
1 つの 軌道カメラ の仕掛けをレベルに追加します。
-
[Outliner (アウトライナー)] で軌道カメラ ボタンを選択します。[Details (詳細)] パネルの [User Options (ユーザー オプション)] で次のように値を設定します。
オプション 値 説明 距離 0.0 cm プレイヤー視点のビューに必要なパラメータ オフセット X 27.0 cm プレイヤー視点のビューに必要なパラメータ オフセット Y 0.0 cm プレイヤー視点のビューに必要なパラメータ オフセット Z 76.0 cm プレイヤー視点のビューに必要なパラメータ 水平スピード 0.0 cm/秒 プレイヤー視点のビューに必要なパラメータ -
[Details (詳細)] パネルの [Transition (トランジション)] で次のように値を設定します。
オプション 値 説明 トランジションインの時間 0.0 秒 プレイヤー視点のビューに必要なパラメータ トランジション アウト時間 0.1 秒 プレイヤー視点のビューに必要なパラメータ トランジションアウトのタイプ イーズアウト プレイヤー視点のビューに必要なパラメータ
ムービー シーケンス
ドアを開いたときにシネマティックをトリガーするために、それを再生するムービー シーケンスの仕掛けが必要です。ムービー シーケンスを追加するには、次の手順に従います。
-
ムービー シーケンス の仕掛けをレベルに追加します。
-
コンテンツ ブラウザ に、レベルで使用するムービー シーケンスを作成します。ムービー シーケンスでは、先ほど設定したオービット カメラが使用され、カメラが最初の角度から一人称視点に移行しながらドアが開く様子を表示します。独自のムービー シーケンスを作成するための詳細については、「シネマティックスとカットシーンを作成する」 を確認してください。
-
[Outliner (アウトライナー)] でムービー シーケンスを選択します。[Details (詳細)] パネルの [User Options (ユーザー オプション)] で [Sequence (シーケンス)] に使用するムービー シーケンスを割り当てます。
Verse を使用した開くドアのシネマティック
シネマティックを再生し、ドアを開くためのロジックを処理するには、Verse の仕掛け を使用します。ボリュームの仕掛け内でプレイヤーが武器をスイングするのをこの仕掛けでリッスンし、ムービー シーケンスを再生して、ドアを開き、プレイヤー視点にトランジションします。
フィールドを設定する
Verse の仕掛けを作成するには、以下を実行します。
-
Verse Explorer を使用して、新しい Verse の仕掛けを作成し、名前を
door_open_cinematic_manager
とします。 -
door_open_cinematic_manager
クラス定義の上で、この仕掛けに固有のメッセージを出力するためにログ チャンネルを追加します。その後に、ログ チャンネルで使用するロガーをクラス定義に追加します。door_open_channel := class(log_channel){} # レベルに配置できる、Verse で作成したクリエイティブの仕掛け door_open_cinematic_manager := class(creative_device): Logger:log = log{Channel := door_open_channel}
-
次のフィールドを
door_open_cinematic_manager
クラス定義に追加します。-
DoorVolume
という名前の編集可能なボリュームの仕掛け。ドアを開くためにプレイヤーが中に入る必要があるボリュームです。# ドアを開くためにプレイヤーが中に入る必要があるボリューム。 @editable DoorVolume:volume_device = volume_device{}
-
FireTrigger
という名前の編集可能な入力トリガーの仕掛け。プレイヤーがDoorVolume
の内部で武器を使用することをリッスンします。# プレイヤーが DoorVolume 内にいるときに武器のスイングを # リッスンする入力トリガー。 @editable FireTrigger:input_trigger_device = input_trigger_device{}
-
ConditionalButton
という名前の編集可能な条件付きボタンの仕掛け。ボリュームの仕掛け内部にいるときに、正しい武器をプレイヤーが装備していることをチェックします。# プレイヤーが正しい武器を持っていることをチェックする条件付きアイテム ボタン。 @editable ConditionalButton:conditional_button_device = conditional_button_device{}
-
DoorLock
という名前の編集可能なロックの仕掛け。プレイヤーが正しい武器を持っていない場合にドアをロックしたままにします。# ドアが開くのを防ぐロックの仕掛け。 @editable Door:lock_device = lock_device{}
-
CinematicSequence
という名前の編集可能なムービー シーケンスの仕掛け。ドアを開いたときに、カメラのトランジションにつながるシネマティックを再生します。# ドアが開いたときにシネマティックを再生するムービー シーケンスの仕掛け。 @editable CinematicSequence:cinematic_sequence_device = cinematic_sequence_device{}
-
ObjectiveMarker
という名前の編集可能なマップ インジケータの仕掛け。武器をピックアップした後にミニマップにドアの位置を表示します。# ドアの場所を表示するマップ インジケータの仕掛け。 @editable ObjectiveMarker:map_indicator_device = map_indicator_device{}
-
ItemGranter
という名前の編集可能なアイテム グランターの仕掛け。これにより、進行に必要な武器がプレイヤーに付与されます。# 進行に必要な武器をプレイヤーに付与するアイテム グランターの仕掛け。 @editable ItemGranter:item_granter_device = item_granter_device{}
-
ItemGrantButton
という名前の編集可能なボタンの仕掛け。これにより、ItemGranter
がアクティベートされ、必要な武器がプレイヤーに付与されます。# ItemGranter グランターをアクティベートするボタン。 @editable ItemGrantButton:button_device = button_device{}
-
FPSCamera
という名前の編集可能な軌道カメラの仕掛け。これにより、一人称視点がシミュレートされ、シネマティックの終了後にプレイヤーに追加されます。# 一人称視点をシミュレートする軌道カメラ。 @editable FPSCamera:gameplay_camera_orbit_device = gameplay_camera_orbit_device{}
-
IsDoorOpen
という名前のlogic
変数。このフィールドは、ドアがすでに開いているかどうかをトラッキングし、開いている場合はシーケンスを再生しません。# ドアがすでに開いているかどうかをトラッキングする変数。 var IsDoorOpen:logic = false
-
FireSubscription
という名前のoption
cancelable
変数。これにより、FireTrigger
PressedEvent
へのサブスクリプションを格納します。シネマティック シーケンスは、プレイヤーがドアの近くにいるときにのみトリガーされる必要があります。このキャンセル可能なサブスクリプションにより、プレイヤーが遠くなりすぎた場合に、FireTrigger
からのUnregister
を確実に実行します。# FireTrigger の仕掛けに対するキャンセル可能なサブスクリプション。 var FireSubscription:?cancelable = false
-
シネマティックを再生する
ドアが開くと、ドアが開くシネマティックが実行され、プレイヤーの視点が三人称視点から一人称視点に移行します。以下の手順に従って、プレイヤーがドアを開く際のシネマティックをアクティベートします。
-
新しい
PlayCinematic()
メソッドをdoor_open_cinematic_manager
クラス定義に追加します。新しいPlayCinematic()
メソッドをdoor_open_cinematic_manager
クラス定義に追加します。この関数は、ドアを開くプレイヤーを受け取ります。続いてシネマティックを再生し、ロックの仕掛けを使用してドアを開きます。# シネマティックを再生し、ドアのロックを解除します。 PlayCinematic(Agent:agent):void=
-
PlayCinematic()
で、まずCinematicSequence
のシネマティック シーケンスを再生してから、Unlock()
とOpen()
をそれぞれ使用してドアのロックを解除して開きます。# シネマティックを再生し、ドアのロックを解除します。 PlayCinematic(Agent:agent)<suspends>:void= Logger.Print("Player is holding item, playing cinematic...") CinematicSequence.Play() # ドアのロックを解除し、開きます。 Door.Unlock(Agent) Door.Open(Agent) set IsDoorOpen = true
-
最後に、
AddTo()
を使用してプレイヤーに軌道カメラを追加することで、プレイヤーの視点を三人称から一人称に移行してから、目標マーカーを無効にします。完成したPlayCinematic()
関数は次のようになります。# シネマティックを再生し、ドアのロックを解除します。 PlayCinematic(Agent:agent)<suspends>:void= Logger.Print("Player is holding item, playing cinematic...") CinematicSequence.Play() # ドアのロックを解除し、開きます。 Door.Unlock(Agent) Door.Open(Agent) set IsDoorOpen = true # 一人称視点のカメラをエージェントに追加します。シネマティックの再生が終了すると、 # エージェントは一人称視点に入ります。 FPSCamera.AddTo(Agent) Logger.Print("Camera changed") # 目標マーカーを無効にします ObjectiveMarker.Disable()
-
シネマティックは、プレイヤーが必要なアイテムを保持しているときにのみ再生され、ドアが開いた後に再度再生されないようにする必要があります。このロジックを処理するため、新しい
CheckCinematic()
メソッドをdoor_open_cinematic_manager
クラス定義に追加します。この関数はDoorVolume
内のプレイヤーを受け取り、必要なアイテムを持っているかチェックします。# プレイヤーが必要なアイテムを持っているか、およびドアがすでに開かれていないかをチェックします。 CheckCinematic(Agent:agent):void=
-
CheckCinematic()
でIsHoldingItem[]
を使用し、プレイヤーがConditionalButton
に登録されたアイテムを保持しているか、およびIsDoorOpen
が false かどうかをチェックしてドアがすでに開かれていないことを確認します。確認できた場合、spawn{}
でPlayCinematic()
関数を実行し、ドアを開くプレイヤーを渡します。完成したCheckCinematic()
関数は次のようになります。# プレイヤーが必要なアイテムを持っているか、およびドアがすでに開かれていないかをチェックします。 CheckCinematic(Agent:agent):void= if: ConditionalButton.IsHoldingItem[Agent] and not IsDoorOpen? then: spawn{PlayCinematic(Agent)}
プレイヤーをトラッキングし、アイテムを付与する
プレイヤーは DoorVolume
内で武器をスイングする必要があるため、入力トリガーの仕掛けでそのイベントをリッスンする必要があります。以下の手順に従って、入力トリガーでプレイヤーによる武器のスイングをリッスンします。
-
新しい
OnPlayerEntersVolume()
メソッドをdoor_open_cinematic_manager
クラス定義に追加します。この関数はエージェントを受け取り、プレイヤーがDoorVolume
内に入るとFireTrigger
を使用してプレイヤーを登録します。# プレイヤーが DoorVolume に入ると、FireTrigger を使用してエージェントを登録します。 OnPlayerEntersVolume(Agent:agent):void= Logger.Print("Agent entered DoorVolume")
-
OnPlayerEntersVolume()
で、Register()
を呼び出し、FireTrigger
を使用してエージェントを登録します。続いて、FireTrigger.PressedEvent
をPlayCinematic()
に対してサブスクライブした結果をFireSubscription
に設定します。完成したOnPlayerEntersVolume()
関数は次のようになります。# プレイヤーが DoorVolume に入ると、FireTrigger を使用してエージェントを登録します。 OnPlayerEntersVolume(Agent:agent):void= Logger.Print("Agent entered DoorVolume") FireTrigger.Register(Agent) # PressedEvent を PlayCinematic に対してサブスクライブし、そのサブスクリプションを FireSubscrition に格納します。 set FireSubscription = option{(FireTrigger.PressedEvent.Subscribe(PlayCinematic))}
-
プレイヤーがボリューム内にいない場合は、シネマティックのアクティベートのみを可能にする必要があるため、プレイヤーが
DoorVolume
から出たら、FireTrigger.PressedEvent
のサブスクリプションのトラッキングを停止する必要があります。これを処理するため、新しいOnPlayerExitsVolume()
メソッドをdoor_open_cinematic_manager
クラス定義に追加します。# プレイヤーが DoorVolume から出ると、FireTrigger を使用してエージェントの登録を解除します。 OnPlayerExitsVolume(Agent:agent):void=
-
OnPlayerExitsVolume()
で、まずFireTrigger
を使用してUnregister()
を実行します。続いて、FireSubscription
内のサブスクリプションを取得し、キャンセルします。完成したOnPlayerExitsVolume()
メソッドは次のようになります。# プレイヤーが DoorVolume から出ると、FireTrigger を使用してエージェントの登録を解除します。 OnPlayerExitsVolume(Agent:agent):void= Logger.Print("Agent exited DoorVolume") FireTrigger.Unregister(Agent) # FireSubscription へのサブスクリプションをキャンセルします。 if (SubscriptionToCancel := FireSubscription?): SubscriptionToCancel.Cancel()
-
プレイヤーが
ItemButton
とのインタラクションを行うと、進行に必要な武器が付与されます。また、目標マーカーがミニマップに表示され、ドアへの道がまだわからない場合は、その表示によって確認できます。これを処理するため、agent
を受け取る新しいGrantItem()
メソッドをdoor_open_cinematic_manager
クラス定義に追加します。GrantItem()
内で、渡されたエージェントでGrantItem
を呼び出し、目標マーカーを有効にします。完成したGrantItem()
メソッドは次のようになります。# エージェントが ItemGrantButton とインタラクションを行うと、エージェントにアイテムを付与し # ObjectiveMarker を有効にします。 GrantItem(Agent:agent):void= ItemGranter.GrantItem(Agent) ObjectiveMarker.Enable()
すべてをリンクする
これで、関連付けられた関数に対して各イベントをサブスクライブし、ゲーム内でコードをテストできるようになりました。
-
OnBegin()
内で、ItemGrantButton.InteractedWithEvent
をGrantItem()
関数に対してサブスクライブします。次に、DoorVolume.AgentEntersEvent
とDoorVolume.AgentExitsEvent
の両方を関連付けられた関数に対してサブスクライブします。OnBegin()
関数は次のようになります。# 実行中のゲームで仕掛けが開始されたときに実行します OnBegin<override>()<suspends>:void= # 関連付けられた関数に対して各イベントをサブスクライブします。 ItemGrantButton.InteractedWithEvent.Subscribe(GrantItem) DoorVolume.AgentEntersEvent.Subscribe(OnPlayerEntersVolume) DoorVolume.AgentExitsEvent.Subscribe(OnPlayerExitsVolume)
-
コードを保存してコンパイルします。
-
UEFN で、レベル内の DoorOpenCinematicManager の仕掛けを選択します。アウトライナー で、編集可能なそれぞれの参照をレベル内の仕掛けに割り当てます。
-
UEFN ツールバーの [Launch Session (セッションを起動)] をクリックし、レベルをプレイテストします。レベルのプレイテストの際には、アイテム ボタンへのインタラクションによって必要な武器がプレイヤーに付与され、プレイヤーのミニマップに目標マーカーが追加される必要があります。プレイヤーがドア ボリューム内で武器を使用すると、シネマティックが再生され、ドアが開き、プレイヤーが一人称視点に移行する必要があります。
完全なコード
using { /Fortnite.com/Devices}
using { /Verse.org/Simulation}
using { /UnrealEngine.com/Temporary/Diagnostics}
# Verse の仕掛けの作成方法については、https://dev.epicgames.com/documentation/ja-jp/uefn/create-your-own-device-in-verse を参照してください。
door_open_log := class(log_channel){}
door_open_cinematic_manager := class(creative_device):
Logger:log = log{Channel := door_open_log}
# プレイヤーが DoorVolume 内にいるときに武器のスイングを
# リッスンする入力トリガー。
@editable
FireTrigger:input_trigger_device = input_trigger_device{}
# ドアが開いたときにシネマティックを再生するムービー シーケンスの仕掛け。
@editable
CinematicSequence:cinematic_sequence_device = cinematic_sequence_device{}
# プレイヤーが正しい武器を持っていることをチェックする条件付きアイテムボタン。
@editable
ConditionalButton:conditional_button_device = conditional_button_device{}
# ドアが開くのを防ぐロックの仕掛け。
@editable
Door:lock_device = lock_device{}
# ドアを開くためにプレイヤーが中に入る必要があるボリューム。
@editable
DoorVolume:volume_device = volume_device{}
# 一人称視点をシミュレートする軌道カメラ。
@editable
FPSCamera:gameplay_camera_orbit_device = gameplay_camera_orbit_device{}
# 進行に必要な武器をプレイヤーに付与するアイテム グランターの仕掛け。
@editable
ItemGranter:item_granter_device = item_granter_device{}
# ItemGranter をアクティベートするボタン。
@editable
ItemGrantButton:button_device = button_device{}
# ドアの場所を表示するマップ インジケータの仕掛け。
@editable
ObjectiveMarker:map_indicator_device = map_indicator_device{}
# ドアがすでに開いているかどうかをトラッキングする変数。
var IsDoorOpen:logic = false
# FireTrigger の仕掛けに対するキャンセル可能なサブスクリプション。
var FireSubscription:?cancelable = false
# 実行中のゲームで仕掛けが開始されたときに実行します
OnBegin<override>()<suspends>:void=
# 関連付けられた関数に対して各イベントをサブスクライブします。
ItemGrantButton.InteractedWithEvent.Subscribe(GrantItem)
DoorVolume.AgentEntersEvent.Subscribe(OnPlayerEntersVolume)
DoorVolume.AgentExitsEvent.Subscribe(OnPlayerExitsVolume)
# プレイヤーが DoorVolume に入ると、FireTrigger を使用してエージェントを登録します。
OnPlayerEntersVolume(Agent:agent):void=
Logger.Print("Agent entered DoorVolume")
FireTrigger.Register(Agent)
# PressedEvent を PlayCinematic に対してサブスクライブし、そのサブスクリプションを FireSubscrition に格納します。
set FireSubscription = option{(FireTrigger.PressedEvent.Subscribe(CheckCinematic))}
# プレイヤーが DoorVolume から出ると、FireTrigger を使用してエージェントの登録を解除します。
OnPlayerExitsVolume(Agent:agent):void=
Logger.Print("Agent exited DoorVolume")
FireTrigger.Unregister(Agent)
# FireSubscription へのサブスクリプションをキャンセルします。
if (SubscriptionToCancel := FireSubscription?):
SubscriptionToCancel.Cancel()
# エージェントが ItemGrantButton とインタラクションを行うと、エージェントにアイテムを付与し
# ObjectiveMarker を有効にします。
GrantItem(Agent:agent):void=
ItemGranter.GrantItem(Agent)
ObjectiveMarker.Enable()
# プレイヤーが必要なアイテムを持っているか、およびドアがすでに開かれていないかをチェックします。
CheckCinematic(Agent:agent):void=
if:
ConditionalButton.IsHoldingItem[Agent] and not IsDoorOpen?
then:
spawn{PlayCinematic(Agent)}
# シネマティックを再生し、ドアのロックを解除します。
PlayCinematic(Agent:agent)<suspends>:void=
Logger.Print("Player is holding item, playing cinematic...")
CinematicSequence.Play()
# ドアのロックを解除し、開きます。
Door.Unlock(Agent)
Door.Open(Agent)
set IsDoorOpen = true
# 一人称視点のカメラをエージェントに追加します。シネマティックの再生が終了すると、
# エージェントは一人称視点に入ります。
FPSCamera.AddTo(Agent)
Logger.Print("Camera changed")
# 目標マーカーを無効にします
ObjectiveMarker.Disable()
応用編
このガイドを完了し、プレイヤーがドアを開いたときに Verse を使用してシネマティックを再生する方法と、三人称視点から一人称視点に移行する方法を学習しました。
ここで学習したことを活かして以下を試してみてください。
-
横スクロールのビューへの移行など、ほかのタイプのカメラの移行を行うことはできますか?
-
カメラの角度を変更する専用のボタンや、進行に複数のカメラの角度が必要なレベルの設計などはできますか?
-
プレイヤーがジャンプせずに通過する必要があるセクションに挑戦し、失敗するとシネマティックを再生するなど、マイナスのペナルティに入力トリガーを使用することはできますか?