ゲームのビジュアルと雰囲気でカメラが重要な役割を果たします。 第三者視点のカメラでは、プレイヤーは空間全体をよく把握でき、一方プレイヤー視点のカメラでは、ゲーム ワールドの細部をとらえることができます。 ゲームプレイ中にカメラを切り替えると、異なった感覚を生み出し、複数カメラでトランジションすると、ゲーム体験に大きな多様性を加えることができます。 たとえば、固定カメラを使用した、横スクロール セクションを作成して、面白いプラットフォームチャレンジを構築できます。
UEFN で Verse を使用してカメラの変更を処理することができます。 イベントをリッスンする仕掛けを使用することにより、カメラをプレイヤーに追加して、そのイベントがトリガーされると、カメラ ビューを変更できます。 この例では、シネマティックの最後にプレイヤーにオービット カメラの仕掛けを追加します。 プレイヤー視点をシミュレートするように軌道カメラの設定を変更でき、シネマティックの最後にカメラを追加することで、第三者視点からプレイヤー視点へ円滑にトランジションできます。 ゲームプレイへの追加として、この例では、プレイヤーが武器をつかみ、それをドアにスイングすると、シネマティックをトリガーします。 この例を想定する体験のニーズに合うように調整できます。たとえば、壊れた船の扉を直すためにレンチを使う、または岩を粉砕するためにハンマーをスイングして、秘密のエリアを見つけるなどがあります。 これらの考え方を幅広く適用して、クールなゲームプレイのシーンを作成することもできます。たとえば、新しいゾーンに入るときは広角の視野からスタートし、プレイヤーが謎を解く必要があるときに、トップダウン ビューに切り替え、または不気味なホラー体験ではプレイヤー視点に切り替えます。
このチュートリアルに従って、Verse の仕掛けを作成する方法を習得します。この仕掛けでは、プレイヤーがドアを開けたときに、ムービーシーケンスを使用して第三者視点からプレイヤー視点にトランジションします。
この例では、次の言語機能を使用します。
クラス:この例では、プレイヤーがドアを開いたときに、シネマティックを起動する Verse クラスを作成します。
オプション:オプション変数にサブスクライブ可能イベントを保存でき、後からそれらのイベントへのサブスクリプションをキャンセルできます。
この例では、次の API を使用します。
Subscribable:ドアに隣接したボリュームにプレイヤーが入った時点を把握できるイベントにサブスクライブし、プレイヤーがボタンにインタラクトしたときに、アイテムを付与します。
レベルを設定する
この例では、次の仕掛けを使用します。
ボタンの仕掛け x 1:プレイヤーがボタンとインタラクトすると、アイテム グランターの仕掛けから剣を受け取ります。
アイテム グランターの仕掛け x 1:アイテム グランターにより、ドアから入って先に進むために必要な剣がプレイヤーに付与されます。
条件付きボタンの仕掛け x 1:必須の武器は、条件付きボタンのキー アイテムとして設定し、プレイヤーが必須の剣を持っていないかぎり、ドアから入れないようにできます。
入力トリガーの仕掛け x 1:射撃入力アクションをリッスンすることで、プレイヤーが攻撃するとドアが開きます。 これが発生するのは、プレイヤーがボリュームの仕掛け内部にいるときで、プレイヤーが剣を持っていて、ドアがまだ開かれていない場合だけです。
ボリュームの仕掛け x 1:ドアを開けるために、剣での攻撃トリガーを使用しないので、ボリュームの仕掛けにより、ドアを開けるために必ずドアのすぐ前に来ることが必要になります。
1 x ムービー シーケンスの仕掛け:第三者視点からプレイヤー視点に滑らかにトランジションするには、開いたドアを表示するシネマティックをプレイし、プレイヤー視点に一致するようにカメラの位置を再設定します。
オービット カメラの仕掛け x 1:プレイヤー視点のビューを作成するには、キャラクターの胸部に設置された軌道カメラを使用して、プレイヤー視点のビューポートを再現します。 このビューが生まれるのは、プレイヤーがドアを開いて、シネマティックがプレイされた後だけです。
ロックの仕掛け x 1:これにより、ドアのロック状態が維持され、プレイヤーが必須の武器を持つまで、ドアは開きません。
マップ インジケータの仕掛け x 1:これにより、プレイヤーが武器をピックアップすると、ミニマップにドアの位置が表示されます。
レベルを設定するには、次の手順を実行します。
アイテム グランターとボタン
ドアを開くために必要な武器をプレイヤーに付与するには、アイテム グランターとボタンの仕掛けを使用します。 プレイヤーがボタンとインタラクトすると、アイテム グランターがプレイヤーに武器を付与します。 これらの要素を追加するには、次の手順を実行します。
1 つの アイテム グランター の仕掛けをレベルに追加します。
[Outliner (アウトライナー)] でアイテム グランターを選択します。 [Details (詳細)] パネルの [User Options (ユーザー オプション)] で次のように値を設定します。
オプション 値 説明 Item Definition (アイテムの定義)
剣
これはプレイヤーがドアを開くための武器です。
付与されたアイテムの装備
オン
この例では、プレイヤーが武器をピックアップしたら、即座に装備します。
1 つの ボタン の仕掛けをレベルに追加します。
[Outliner (アウトライナー)] でボタンを選択します。 [Details (詳細)] パネルの [User Options (ユーザー オプション)] で次のように値を設定します。
オプション 値 説明 インタラクトテキスト
「Pick Up (ピックアップ)」
プレイヤーがボタンとやり取りするように促すテキストです。
起動可能回数
1個
この例では、プレイヤーは武器を 1 回だけピックアップできます。
入力トリガー
プレイヤーが武器をスイングしたタイミングを把握するために、特定のアクションをリッスンする入力トリガーを使用できます。 プレイヤーが武器をスイングしたときに、入力トリガーが起動されます。 入力トリガーを追加するには、次の手順を実行します。
1 つの 入力トリガー の仕掛けをレベルに追加します。
[Outliner (アウトライナー)]で入力 トリガーを選択します。 [Details (詳細)] パネルの [User Options (ユーザー オプション)] で次のように値を設定します。
オプション 値 説明 入力のタイプ
標準アクション
発射 は標準アクションであり、プレイヤーが武器をスイングしたタイミングを把握するために、入力トリガーでリッスンする必要がある対象です。
標準の入力
発射
発射は、プレイヤーが武器をスイングしたタイミングを把握するために、入力トリガーでリッスンする必要があるアクションです。
HUDに表示
オフ
このアクションを HUD に表示する必要はありません。
ボリューム
プレイヤーがドアを開くためにドアのそばに必ず立つように、ボリュームの仕掛けをドアのそばで使用して、プレイヤーがその中にいるのかをチェックします。 ボリュームの仕掛けを追加するには、次の手順を実行します。
ドアをレベルに追加します。 これは武器を使用してプレイヤーが開くドアです。
ボリューム の仕掛けをレベルに追加します。 このボリュームの仕掛けは、ドアの前の小さな領域、つまりプレイヤーに攻撃させる領域とオーバーラップする必要があります。
プレイヤーが攻撃するときに、必要な領域に合うように、transform gizmo (トランスフォーム ギズモ)を変更することで、ボリュームの仕掛けのサイズを変更します。 入力トリガーは、プレイヤーがこのボリュームの中にいる間の発射イベントだけをリッスンして、想定する体験のニーズを必ず満たすようにします。
ロック
武器を手に入れるまでプレイヤーがドアを開けられないようにするため、ロックの仕掛けを使用してドアをロックできます。 ロックの仕掛けを追加するには、次の手順を実行します。
ロック の仕掛けを追加して、ドアにアタッチします。
[Outliner (アウトライナー)] でロックを選択します。 [Details (詳細)] パネルの [User Options (ユーザー オプション)] で [Visible in Game (ゲーム中に表示)] を [false (オフ)] にします。
マップインジケーター
プレイヤーが武器を取得した場所が目標から非常に離れているとき、マップ インジケータを使用して目標の場所をプレイヤーに示すことができます。 これによりマップとミニマップにイメージが表示され、プレイヤーにドアの場所を示すために目標パルスを起動できます。 マップ インジケータを追加するには、次の手順を実行します。
マップインジケータ の仕掛けをレベルに追加し、ドアの下で非表示にします。
[Outliner (アウトライナー)] でマップ インジケータを選択します。 [Details] パネルの [User Options (ユーザー オプション)] で次のように設定します。
オプション 値 説明 ゲーム開始時に有効化
false
マップ インジケータはプレイヤーが武器をピックアップした後にはじめて有効になります。
Small Icon (小アイコン)
アイコンを選択
ミニマップに表示するアイコンを選択します。
Large Icon (大アイコン)
アイコンを選択
マップに表示するアイコンを選択します。
条件付きアイテム ボタン
ドアを開くために必要な正しい武器をスイングしたことを把握するために、条件付きアイテム ボタンを使用して、スイングしたときに、持っている武器をチェックできます。 条件付きアイテム ボタンを追加するには、次の手順を実行します。
条件付きアイテム ボタン の仕掛けをレベルに追加します。
[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/s (0.0 cm/秒)
プレイヤー視点のビューに必要なパラメータ
[Details (詳細)] パネルの [Transition (トランジション)] で次のように値を設定します。
オプション 値 説明 トランジションインの時間
0.0 s (0.0 秒)
プレイヤー視点のビューに必要なパラメータ
トランジションアウトの時間
0.1 s (0.1 秒)
プレイヤー視点のビューに必要なパラメータ
トランジションアウトのタイプ
イーズアウト
プレイヤー視点のビューに必要なパラメータ
ムービーシーケンス
ドアを開いたときにシネマティックをトリガーするために、それを再生するムービー シーケンスの仕掛けが必要です。 ムービー シーケンスを追加するには、次の手順に従います。
ムービー シーケンス の仕掛けをレベルに追加します。
コンテンツブラウザ に、レベルで使用するムービー シーケンスを作成します。 ムービー シーケンスでは、先ほど設定したオービット カメラが使用され、カメラが最初の角度から一人称視点に移行しながらドアが開く様子を表示します。 独自のムービー シーケンスを作成するための詳細については、「シネマティックスとカットシーンを作成する」を確認してください。
[Outliner (アウトライナー)] でムービー シーケンスを選択します。 [Details (詳細)] パネルの [User Options (ユーザー オプション)] で [Sequence (シーケンス)] に使用するムービー シーケンスを割り当てます。
画像をクリックすると拡大します。
Verse を使用した開くドアのシネマティック
シネマティックを再生し、ドアを開くためのロジックを処理するには、Verse の仕掛けを使用します。 ボリュームの仕掛け内でプレイヤーが武器をスイングするのをこの仕掛けでリッスンし、ムービー シーケンスを再生して、ドアを開き、プレイヤー視点にトランジションします。
フィールドを設定する
Verse の仕掛けを作成するには、以下を実行します。
Verse Explorer を使用して、新しい Verse の仕掛けを作成し、名前を
door_open_cinematic_managerとします。door_open_cinematic_managerクラス定義の上で、この仕掛けに固有のメッセージを出力するためにログ チャンネルを追加します。 その後に、ログ チャンネルで使用するロガーをクラス定義に追加します。Versedoor_open_channel := class(log_channel){} # A Verse-authored creative device that can be placed in a level door_open_cinematic_manager := class(creative_device): Logger:log = log{Channel := door_open_channel}以下のフィールドを
door_open_cinematic_managerのクラス定義に追加します。DoorVolumeという名前の編集可能なボリュームの仕掛け。 ドアを開くためにプレイヤーが中に入る必要があるボリュームです。Verse# The volume the player needs to be inside of to open the door. @editable DoorVolume:volume_device = volume_device{}FireTriggerという名前の編集可能な入力トリガーの仕掛け。 プレイヤーがDoorVolumeの内部で武器を使用することをリッスンします。Verse# The input trigger that listens for the player swinging their weapon # when inside the DoorVolume. @editable FireTrigger:input_trigger_device = input_trigger_device{}ConditionalButtonという名前の編集可能な条件付きボタンの仕掛け。 ボリュームの仕掛け内部にいるときに、正しい武器をプレイヤーが装備していることをチェックします。Verse# The Conditional Item Button that checks that the player has the correct weapon. @editable ConditionalButton:conditional_button_device = conditional_button_device{}DoorLockという名前の編集可能なロックの仕掛け。 プレイヤーが正しい武器を持っていない場合にドアをロックしたままにします。Verse# The lock device that prevents the door from being opened. @editable Door:lock_device = lock_device{}CinematicSequenceという名前の編集可能なムービー シーケンスの仕掛け。 ドアを開いたときに、カメラのトランジションにつながるシネマティックを再生します。Verse# The cinematic sequence device that plays the cinematic when opening the door. @editable CinematicSequence:cinematic_sequence_device = cinematic_sequence_device{}ObjectiveMarkerという名前の編集可能なマップ インジケータの仕掛け。 武器をピックアップした後にミニマップにドアの位置を表示します。Verse# The map indicator device that shows the location of the door. @editable ObjectiveMarker:map_indicator_device = map_indicator_device{}ItemGranterという名前の編集可能なアイテム グランターの仕掛け。 これにより、進行に必要な武器がプレイヤーに付与されます。Verse# The item granter device that grants the player the weapon they need. @editable ItemGranter:item_granter_device = item_granter_device{}ItemGrantButtonという名前の編集可能なボタンの仕掛け。 これにより、ItemGranterがアクティベートされ、必要な武器がプレイヤーに付与されます。Verse# The button that activates the ItemGranter granter. @editable ItemGrantButton:button_device = button_device{}FPSCameraという名前の編集可能なオービット カメラの仕掛け。 これにより、一人称視点がシミュレートされ、シネマティックの終了後にプレイヤーに追加されます。Verse# The orbit camera that simulates a first-person view. @editable FPSCamera:gameplay_camera_orbit_device = gameplay_camera_orbit_device{}IsDoorOpenという名前のlogic変数。 このフィールドは、ドアがすでに開いているかどうかをトラッキングし、開いている場合はシーケンスを再生しません。Verse# A variable that tracks whether the door is already open. var IsDoorOpen:logic = falseFireSubscriptionというオプションのcancelable変数。 これにより、FireTriggerPressedEventへのサブスクリプションを格納します。 シネマティック シーケンスは、プレイヤーがドアの近くにいるときにのみトリガーされる必要があります。 このキャンセル可能なサブスクリプションにより、プレイヤーが遠くなりすぎた場合に、FireTriggerからのUnregisterを確実に実行します。Verse# A cancelable subscription to the FireTrigger device. var FireSubscription:?cancelable = false
シネマティックを再生する
ドアが開くと、ドアが開くシネマティックが実行され、プレイヤーの視点が三人称視点から一人称視点に移行します。 以下の手順に従って、プレイヤーがドアを開く際のシネマティックをアクティベートします。
新しい
PlayCinematic()メソッドをdoor_open_cinematic_managerクラス定義に追加します。 新しいPlayCinematic()メソッドをdoor_open_cinematic_managerクラス定義に追加します。 この関数は、ドアを開くプレイヤーを受け取ります。 続いてシネマティックを再生し、ロックの仕掛けを使用してドアを開きます。Verse# Plays a cinematic and unlocks the door. PlayCinematic(Agent:agent):void=PlayCinematic()で、まずCinematicSequenceのムービー シーケンスを再生してから、Unlock()とOpen()をそれぞれ使用してドアのロックを解除して開きます。Verse# Plays a cinematic and unlocks the door. PlayCinematic(Agent:agent)<suspends>:void= Logger.Print("Player is holding item, playing cinematic...") CinematicSequence.Play() # Unlock the door, then open it. Door.Unlock(Agent) Door.Open(Agent)最後に、
AddTo()を使用してプレイヤーに軌道カメラを追加することで、プレイヤーの視点を三人称から一人称に移行してから、目標マーカーを無効にします。 完成したPlayCinematic()関数は次のようになります。Verse# Plays a cinematic and unlocks the door. PlayCinematic(Agent:agent)<suspends>:void= Logger.Print("Player is holding item, playing cinematic...") CinematicSequence.Play() # Unlock the door, then open it. Door.Unlock(Agent) Door.Open(Agent) set IsDoorOpen = trueシネマティックは、プレイヤーが必要なアイテムを保持しているときにのみ再生され、ドアが開いた後に再度再生されないようにする必要があります。 このロジックを処理するため、新しい
CheckCinematic()メソッドをdoor_open_cinematic_managerクラス定義に追加します。 この関数はDoorVolume内のプレイヤーを受け取り、必要なアイテムを持っているかチェックします。Verse# Check if the player has the required item and the door isn't already open. CheckCinematic(Agent:agent):void=CheckCinematic()でIsHoldingItem[]を使用し、プレイヤーがConditionalButtonに登録されたアイテムを保持しているか、およびIsDoorOpenが false かどうかをチェックしてドアがすでに開かれていないことを確認します。 確認できた場合、spawn{}でPlayCinematic()関数を実行し、ドアを開くプレイヤーを渡します。 完成したCheckCinematic()関数は次のようになります。Verse# Check if the player has the required item and the door isn't already open. CheckCinematic(Agent:agent):void= if: ConditionalButton.IsHoldingItem[Agent] and not IsDoorOpen? then: spawn{PlayCinematic(Agent)}
プレイヤーをトラッキングし、アイテムを付与する
プレイヤーは DoorVolume 内で武器をスイングする必要があるため、入力トリガーの仕掛けでそのイベントをリッスンする必要があります。 以下の手順に従って、入力トリガーでプレイヤーによる武器のスイングをリッスンします。
新しい
OnPlayerEntersVolume()メソッドをdoor_open_cinematic_managerクラス定義に追加します。 この関数はエージェントを受け取り、プレイヤーがDoorVolume内に入るとFireTriggerを使用してプレイヤーを登録します。Verse# Registers the Agent with the FireTrigger when they enter the DoorVolume. OnPlayerEntersVolume(Agent:agent):void= Logger.Print("Agent entered DoorVolume")OnPlayerEntersVolume()で、Register()を呼び出し、FireTriggerを使用してエージェントを登録します。 続いて、FireSubscriptionをFireTrigger.PressedEventに対してサブスクライブした結果をPlayCinematic()に設定します。 完成したOnPlayerEntersVolume()関数は次のようになります。Verse# Registers the Agent with the FireTrigger when they enter the DoorVolume. OnPlayerEntersVolume(Agent:agent):void= Logger.Print("Agent entered DoorVolume") FireTrigger.Register(Agent) # Subscribe the PressedEvent to PlayCinematic, and store that subscription in FireSubscrition. set FireSubscription = option{(FireTrigger.PressedEvent.Subscribe(PlayCinematic))}プレイヤーがボリューム内にいない場合は、シネマティックのアクティベートのみを可能にする必要があるため、プレイヤーが
DoorVolumeから出たら、FireTrigger.PressedEventのサブスクリプションのトラッキングを停止する必要があります。 このロジックを処理するため、新しいOnPlayerExitsVolume()メソッドをdoor_open_cinematic_managerクラス定義に追加します。Verse# Unregister the Agent with the FireTrigger when they leave the DoorVolume. OnPlayerExitsVolume(Agent:agent):void=OnPlayerExitsVolume()では、まずFireTriggerを使用してエージェントに対してUnregister()を実行します。 続いて、FireSubscription内のサブスクリプションを取得し、キャンセルします。 完全なOnPlayerExitsVolume()メソッドは次のようになります。Verse# Unregister the Agent with the FireTrigger when they leave the DoorVolume. OnPlayerExitsVolume(Agent:agent):void= Logger.Print("Agent exited DoorVolume") FireTrigger.Unregister(Agent) # Cancel the subscription to the FireSubscription. if (SubscriptionToCancel := FireSubscription?): SubscriptionToCancel.Cancel()プレイヤーが
ItemButtonとのインタラクションを行うと、進行に必要な武器が付与されます。 また、目標マーカーがミニマップに表示され、ドアへの道がまだわからない場合は、その表示によって確認できます。 このロジックを処理するため、エージェントを受け取る新しいGrantItem()メソッドをdoor_open_cinematic_managerクラス定義に追加します。GrantItem()内で、渡されたエージェントでGrantItemを呼び出し、目標マーカーを有効にします。 完全なGrantItem()メソッドは次のようになります。Verse# Grants the Agent an item when they interact with the ItemGrantButton # and enables the ObjectiveMarker. GrantItem(Agent:agent):void= ItemGranter.GrantItem(Agent) ObjectiveMarker.Enable()
すべてをリンクする
これで、関連付けられた関数に対して各イベントをサブスクライブし、ゲーム内でコードをテストできるようになりました。
OnBegin()で、ItemGrantButton.InteractedWithEventをGrantItem()関数にサブスクライブします。 次に、DoorVolume.AgentEntersEventとDoorVolume.AgentExitsEventの両方を関連付けられた関数に対してサブスクライブします。OnBegin()関数は次のようになるはずです。Verse# Runs when the device is started in a running game OnBegin<override>()<suspends>:void= # Subscribe each event to its associated function. 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 }
# See https://dev.epicgames.com/documentation/en-us/uefn/create-your-own-device-in-verse for how to create a verse device.
door_open_log := class(log_channel){}
door_open_cinematic_manager := class(creative_device):
Logger:log = log{Channel := door_open_log}
応用編
このガイドを完了し、プレイヤーがドアを開いたときに Verse を使用してシネマティックを再生する方法と、三人称視点から一人称視点に移行する方法を学習しました。
ここで学習したことを活かして以下を試してみてください。
横スクロールのビューへの移行など、ほかのタイプのカメラの移行を行うことはできますか?
カメラの角度を変更する専用のボタンや、進行に複数のカメラの角度が必要なレベルの設計などはできますか?
プレイヤーがジャンプせずに通過する必要があるセクションに挑戦し、失敗するとシネマティックを再生するなど、マイナスのペナルティに入力トリガーを使用することはできますか?