このセクションでは、ゲームプレイにカスタムのハートビート VFX (視覚効果) を追加して、動いていない小道具の位置を知らせる方法について説明します。
小道具チームのプレイヤーが長時間アイドル状態になると、そのプレイヤー上でハートビートのビジュアル エフェクト (視覚効果) が再生され、ハンター チームに通知されます。 このビジュアル エフェクトは、小道具チームの各プレイヤーがゲームにスポーンされるときに、プレイヤーごとに登録されます。
ハートビート機能を実装するには、VFX スポナーの仕掛けを Verse で使用します。 これには以下が含まれます。
-
ビジュアル エフェクトをアクティブ化する。
-
VFX スポナーをプレイヤーにテレポートする。
-
小道具チームのメンバーに、ハートビートを発するまでの残り時間を表示する UI を作成する。
このチュートリアルには、このゲームに必要なゲームプレイ メカニクスの実行方法を示す Verse のスニペットが含まれています。以下の手順を実行してから、このチュートリアルの ステップ 6 にある完全なスクリプトをコピーしてください。
開始する前に
アセットや仕掛けを見つけやすいように、フォルダで整理しておくことをお勧めします。 目的別、場所別、タイプ別など希望に応じて、仕掛けをグループ分けできます。
配置したアセットは、作成したフォルダやアクタに移動できます。
この gif では、整理するために、VFX スポナーの仕掛けを小道具チームの「HeartBeatVFX」フォルダにドラッグしています。右クリックして、[Move To (移動先)] を選択し、アセットを移動させたいフォルダを選択することもできます。
使用されている仕掛けは以下のとおりです。
- VFX スポナー × ~ 16
VFX スポナーの仕掛け
各プレイヤーの VFX スポナーを作成します。 プレイヤーに VFX が必要になると、プレイヤーの場所にテレポートされます。 不要になると、再び必要になるまで非表示になります。
このテンプレートの VFX スポナー は、Niagara VFX を使用して、ゲームプレイ中に表示されるカスタム アセットを作成します。このチュートリアルで使用する VFX アセットは、小道具チームの動かないプレイヤーを明らかにするために、ハートビートを表示するように設定されています。この VFX は、15 秒以上静止している小道具で表示されます。
ハートビート VFX の作成方法に関する多くのチュートリアルについては、ドキュメントの「ビジュアル エフェクト」セクションを参照してください。 その後、VFX スポナーで作成したカスタム ハートビートを使用することができます。
VFX スポナーを配置するときにこれを試すことができます。[Details (詳細)] パネルで、[Custom Visual Effect (カスタムビジュアル エフェクト)] ドロップダウン メニューからカスタム エフェクトを選択します。選択した VFX がビューポートに表示されるように、[Custom Visual Effect Override (カスタム ビジュアル エフェクトのオーバーライド)] を必ず有効にしてください。
[Details] パネルで、色を追加したり、VFX を再生するタイミングや、どのプレイヤーに見せるかを決定したりすることで、さらにエフェクトをカスタマイズできます。
この仕掛けをプレイヤーから見えない場所に配置して、[User Options (ユーザー オプション)] を以下の表のように設定します。次に、ゲームプレイで許可するプレイヤーの数に合わせて、この仕掛けをコピー & ペーストします。
| オプション | Value | 説明 |
|---|---|---|
| Custom Visual Effect (カスタムビジュアルエフェクト) | HeartBeatVFX | プリセット リスト内のパーティクルの代わりに使用するカスタムのパーティクルを定義します。 |
| Custom Visual Effect Override (カスタムビジュアルエフェクトのオーバーライド) | オン | 開発者用 FX を使用するかどうかを決定します。 |
| Enabled on Phase (フェーズ時に有効化) | Gameplay Only (ゲームプレイのみ) | 仕掛けが有効になるゲーム フェーズを決定します。有効になった VFX スポナーは、定義されたパーティクル エフェクトを再生します。 |
Play Heartbeat Effects at a Location (ハートビート エフェクトを特定の場所で再生する)
以下の手順を実行すると、Verse に VFX スポナーの仕掛けを移動して、小道具チームのプレイヤーでハートビート エフェクトを再生および停止させることができます。
-
heartbeat.verse というプロジェクトで 新しい Verse ファイルを作成します。これは Verse の仕掛けではないため、空の Verse ファイルとして作成できます。
-
まず、作成した Verse ファイルをダブルクリックして、以下の インポートする Verse パス を追加します。
using { /Fortnite.com/Characters} using { /Fortnite.com/Devices} using { /Fortnite.com/UI} using { /UnrealEngine.com/Temporary/SpatialMath} using { /UnrealEngine.com/Temporary/Diagnostics} using { /UnrealEngine.com/Temporary/UI} using { /Verse.org/Colors} using { /Verse.org/Simulation} -
このコードで、heartbeat.verse に
heartbeat_vfxというクラスが作成されます。heartbeat_vfxクラスには、プレイヤーごとのvfx_spawner_deviceオブジェクトを追跡するためのデータの構造体と、VFX を特定の位置に設定したり、リセットしたりする関数が含まれています。log_heart_beat := class(log_channel){} # これらのメッセージは、ハートビートが表示されないように移動する必要があるときに、メッセージで小道具エージェントに通知する (またはメッセージを非表示にする) ために使用されます。 HeartBeatWarningMessage<localizes>(Time:int):message = "Heart Beat in {Time} Seconds. Move!" HeartBeatWarningClear<localizes>:message = "" # このクラスは prop_hunt Verse の仕掛けにハートビートの編集可能なプロパティを公開します。 heart_beat := class<concrete>(): Logger:log = log{Channel:=log_heart_beat} @editable # 小道具エージェントがハートビートによって自分の位置が明らかになる前に移動しなければならない秒数です。 MoveTime:float = 15.0 @editable # ハートビート警告が表示されるまでの残り秒数です。HeartBeatTimer を超えることはできません。 WarningTime:float = 5.0 @editable # ハートビート VFX の仕掛けの配列です。プレイヤー 1 人につき 1 つの仕掛けがあります。 AgentVFX:[]heartbeat_vfx = array{} @editable # ハートビート サウンド エフェクト (SFX) を再生するために使用するラジオ プレーヤーの仕掛けです。 SFXPlayer:radio_device = radio_device{} # このマップは、ハートビート警告を表示する UI を各小道具エージェントに関連付けます。 var WarningUI:[agent]heartbeat_warning_ui = map{} #SFX の仕掛けを管理できるように、ハートビートがアクティブになっているプレイヤー数を追跡します。 var NumberOfHeartBeats:int = 0 # エージェントにハートビート UI を設定します。 SetUpUI(PropAgent:agent):void = if: not WarningUI[PropAgent] AsPlayer := player[PropAgent] PlayerUI := GetPlayerUI[AsPlayer] then: UIData:heartbeat_warning_ui = heartbeat_warning_ui{} UIData.CreateCanvas() PlayerUI.AddWidget(UIData.Canvas, player_ui_slot{ZOrder := 1}) if (set WarningUI[PropAgent] = UIData) {} #指定されたプレイヤーのハートビート VFX および SFX をアクティブ化します。 Enable(PropAgent:agent, HeartBeatVFXData:heartbeat_vfx):void = if: # キャラクターを取得します。これは、シーン内で小道具エージェントの位置を見つけるために使用されます。 Character := PropAgent.GetFortCharacter[] then: #ハートビート VFX の位置を小道具エージェントの位置に設定します。 HeartBeatVFXData.Activate(Character.GetTransform()) # ハートビートのカウントを増やし、最初のハートビートの再生である場合は、オーディオを再生してハートビートを開始する必要があります。 set NumberOfHeartBeats += 1 if (NumberOfHeartBeats = 1) then SFXPlayer.Play() # 小道具エージェントをオーディオ プレーヤーの仕掛けに登録し、ハートビートのオーディオがその位置から再生されるようにします。 SFXPlayer.Register(PropAgent) else: Logger.Print("Character, Index, or HeartBeatVFXData not found.Cannot start the heartbeat") #指定した小道具エージェントのハートビート VFX および SFX をクリアします。 Disable(PropAgent:agent, HeartBeatVFXData:heartbeat_vfx):void = Logger.Print("Disabling heart beat.") #VFX ビジュアルを無効にします。 HeartBeatVFXData.Deactivate() # オーディオ プレーヤーの仕掛けから小道具エージェントの登録を解除し、ハートビート オーディオを停止させます。 SFXPlayer.Unregister(PropAgent) # ハートビートのカウンターを減らします。このカウンターが 0 を下回ることはありません。 set NumberOfHeartBeats -= 1 if (NumberOfHeartBeats < 0) then set NumberOfHeartBeats = 0 #すべての小道具エージェントのすべてのハートビート VFX および SFX をクリアします。 DisableAll():void = Logger.Print("Disabling all heart beats.") #すべての VFX をイテレートし、0,0,0 に移動させます。 for (HeartBeatVFXDevice : AgentVFX): HeartBeatVFXDevice.Deactivate() # ハートビート オーディオから全プレイヤーを登録解除します。 SFXPlayer.UnregisterAll() #ハートビート カウンターを 0 に再初期化します。 set NumberOfHeartBeats = 0 # heartbeat_warning_ui クラスには、プレイヤーごとの UI キャンバスおよび text_block を追跡するデータの構造体と、新しいハートビートの警告 UI キャンバスを作成する関数が含まれています。 heartbeat_warning_ui := class: var Canvas:canvas = canvas{} var Text:text_block = text_block{} # 警告メッセージの UI キャンバスを作成します。 CreateCanvas():void = set Text = text_block{DefaultTextColor := NamedColors.White, DefaultShadowColor := NamedColors.Black} set Canvas = canvas: Slots := array: canvas_slot: Anchors := anchors{Minimum := vector2{X := 0.5, Y := 0.75}, Maximum := vector2{X := 0.5, Y := 0.75}} Offsets := margin{Top := 0.0, Left := 0.0, Right := 0.0, Bottom := 0.0} Alignment := vector2{X := 0.5, Y := 1.0} SizeToContent := true Widget := Text -
このコードは、transform 引数を取り、VFX スポナーの仕掛けをその
transformに移動させるActivate()メソッドをheartbeat_vfxクラスに作成します。#heartbeat_vfx クラスには、プレイヤーごとの VFX のルート オブジェクトおよび vfx_spawner_device オブジェクトを追跡するためのデータの構造体と、VFX を特定の位置に設定したり、リセットしたりする関数が含まれています。 heartbeat_vfx := class<concrete>: @editable # 各ハートビートの VFX の仕掛けです。 VFXDevice:vfx_spawner_device = vfx_spawner_device{} # このオフセットは、ハートビートを小道具エージェントの頭上に配置するために使用されます。 HeartBeatVFXOffset:vector3 = vector3{X := 0.0, Y := 0.0, Z := 110.0} #ハートビート VFX の位置を設定し、VFX を有効にします。 Activate(Transform:transform):void = VFXPosition := Transform.Translation + HeartBeatVFXOffset if (VFXDevice.TeleportTo[VFXPosition, Transform.Rotation]): VFXDevice.Enable() -
このコードは、VFX スポナーの仕掛けを無効にする
Deactivate()メソッドをheartbeat_vfxクラスに作成します。そのため、ハートビートのビジュアルが非表示になります。#heartbeat_vfx クラスには、プレイヤーごとの VFX のルート オブジェクトおよび vfx_spawner_device オブジェクトを追跡するためのデータの構造体と、VFX を特定の位置に設定したり、リセットしたりする関数が含まれています。 heartbeat_vfx := class<concrete>: @editable # 各ハートビートの VFX の仕掛けです。 VFXDevice:vfx_spawner_device = vfx_spawner_device{} # このオフセットは、ハートビートを小道具エージェントの頭上に配置するために使用されます。 HeartBeatVFXOffset:vector3 = vector3{X := 0.0, Y := 0.0, Z := 110.0} #ハートビート VFX の位置を設定し、VFX を有効にします。 Activate(Transform:transform):void = VFXPosition := Transform.Translation + HeartBeatVFXOffset if (VFXDevice.TeleportTo[VFXPosition, Transform.Rotation]): VFXDevice.Enable() #VFX を無効にし、ハートビートのビジュアルを非表示にします。 Deactivate():void = VFXDevice.Disable()
プレイヤーにハートビートの警告を表示する
以下の手順を実行して、ハートビートの警告メッセージを表示するテキスト ブロックを使用してカスタム UI を設定します。カスタム UI およびその他の Verse UI コンポーネントの作成方法の詳細については、「インゲーム ユーザー インターフェース (UI)」を参照してください。
-
以下の 2 つの定数は、ゲーム中の異なるタイミングで小道具チームのプレイヤーに表示されるテキストを制御します。
-
定数
HeartBeatWarningMessageは、intを取り、型messageを返す関数です。この型はローカライズできるため、UI 要素で使用されます。これは、ハートビート エフェクトによって自分の位置が明らかになるのを避けるために、プレイヤーが移動する必要があるときに表示されるテキストです。 -
定数
HeartBeatWarningClearは、プレイヤーに警告メッセージが表示されないように表示される空のmessageです。
# これらのメッセージは、ハートビートが表示されないように移動する必要があるときに、メッセージで小道具エージェントに通知する (またはメッセージを非表示にする) ために使用されます。 HeartBeatWarningMessage<localizes>(Time:int):message = "Heart Beat in {Time} Seconds. Move!" HeartBeatWarningClear<localizes>:message = "" -
-
heartbeat.verse に
heartbeat_warning_uiという新しいクラスを作成します。heartbeat_warning_ui クラスには、プレイヤーごとの UI キャンバスおよび text_block を追跡するデータの構造体と、新しいハートビートの警告 UI キャンバスを作成する関数が含まれています。# heartbeat_warning_ui クラスには、プレイヤーごとの UI キャンバスおよび text_block を追跡するデータの構造体と、新しいハートビートの警告 UI キャンバスを作成する関数が含まれています。 heartbeat_warning_ui := class: var Canvas:canvas = canvas{} var Text:text_block = text_block{} # 警告メッセージの UI キャンバスを作成します。 CreateCanvas():void = set Text = text_block{DefaultTextColor := NamedColors.White, DefaultShadowColor := NamedColors.Black} set Canvas = canvas: Slots := array: canvas_slot: Anchors := anchors{Minimum := vector2{X := 0.5, Y := 0.75}, Maximum := vector2{X := 0.5, Y := 0.75}} Offsets := margin{Top := 0.0, Left := 0.0, Right := 0.0, Bottom := 0.0} Alignment := vector2{X := 0.5, Y := 1.0} SizeToContent := true Widget := Text
ハートビート エフェクトを管理する
以下の手順を実行して、ハートビート マネージャーを作成します。
-
以下のコードで、heartbeat.verse に
heart_beatというクラスが作成されます。このクラスは prop_hunt の仕掛けにハートビートの編集可能なプロパティを公開し、ハートビート エフェクトを管理します。log_heart_beat := class(log_channel){} # このクラスは prop_hunt の仕掛けにハートビートの編集可能なプロパティを公開します。 heart_beat := class<concrete>(): Logger:log = log{Channel:=log_heart_beat} @editable MoveTime:float = 15.0 - このコードで、以下の編集可能なプロパティが
heart_beatクラスに追加されます。-
このコードは、小道具エージェントが移動しなければならない、ハートビート エフェクトによって自分の位置が明らかにされるまでの秒数を制御します。
@editable MoveTime:float = 15.0-
このコードは、小道具チームのメンバーに警告し、ハートビートが開始する前に移動するように指示するメッセージを画面に表示するまでの残り秒数を制御します。
@editable WarningTime:float = 5.0 -
このコードは、ハートビート VFX の仕掛けの配列です。 プレイヤー 1 人につき 1 つの仕掛けがあります。
@editable AgentVFX:[]heartbeat_vfx = array{} -
このコードでは、ラジオ プレーヤーの仕掛けを使用してハートビート サウンド エフェクト (SFX) を再生します。
@editable SFXPlayer:radio_device = radio_device{}
-
-
-
このコードは、ハートビート警告を表示する UI を各小道具エージェントに関連付けます。
# このマップは、ハートビート警告を表示する UI を各小道具エージェントに関連付けます。 var WarningUI:[agent]heartbeat_warning_ui = map{} -
このコードは、SFX の仕掛けを管理できるように、ハートビートがアクティブになっているプレイヤー数を追跡します。
#SFX の仕掛けを管理できるように、ハートビートがアクティブになっているプレイヤー数を追跡します。 var NumberOfHeartBeats:int = 0 -
このコードは、プレイヤーの警告 UI を表示します。
# エージェントにハートビート UI を設定します。 SetUpUI(PropAgent:agent):void = if: not WarningUI[PropAgent] AsPlayer := player[PropAgent] PlayerUI := GetPlayerUI[AsPlayer] then: UIData:heartbeat_warning_ui = heartbeat_warning_ui{} UIData.CreateCanvas() PlayerUI.AddWidget(UIData.Canvas, player_ui_slot{ZOrder := 1}) if (set WarningUI[PropAgent] = UIData) {} -
このコードは、指定したプレイヤーのビジュアル エフェクト (VFX) とサウンド エフェクト (SFX) を有効化します。
#指定されたプレイヤーのハートビート VFX および SFX をアクティブ化します。 Enable(PropAgent:agent, HeartBeatVFXData:heartbeat_vfx):void = if: # キャラクターを取得します。これは、シーン内で小道具エージェントの位置を見つけるために使用されます。 Character := PropAgent.GetFortCharacter[] then: #ハートビート VFX の位置を小道具エージェントの位置に設定します。 HeartBeatVFXData.Activate(Character.GetTransform()) # ハートビートのカウントを増やし、最初のハートビートの再生である場合は、オーディオを再生してハートビートを開始する必要があります。 set NumberOfHeartBeats += 1 if (NumberOfHeartBeats = 1) then SFXPlayer.Play() # 小道具エージェントをオーディオ プレーヤーの仕掛けに登録し、ハートビートのオーディオがその位置から再生されるようにします。 SFXPlayer.Register(PropAgent) else: Logger.Print("Character, Index, or HeartBeatVFXData not found.Cannot start the heartbeat") -
このコードでは、1 人のプレイヤーの VFX と SFX を無効にするメソッドと、すべてのプレイヤーの VFX と SFX を無効にするもう 1 つのメソッドを作成します。
#指定した小道具エージェントのハートビート VFX および SFX をクリアします。 Disable(PropAgent:agent, HeartBeatVFXData:heartbeat_vfx):void = Logger.Print("Disabling heart beat.") #VFX ビジュアルを無効にします。 HeartBeatVFXData.Deactivate() # オーディオ プレーヤーの仕掛けから小道具エージェントの登録を解除し、ハートビート オーディオを停止させます。 SFXPlayer.Unregister(PropAgent) # ハートビートのカウンターを減らします。このカウンターが 0 を下回ることはありません。 set NumberOfHeartBeats -= 1 if (NumberOfHeartBeats < 0) then set NumberOfHeartBeats = 0 #すべての小道具エージェントのすべてのハートビート VFX および SFX をクリアします。 DisableAll():void = Logger.Print("Disabling all heart beats.") #すべての VFX をイテレートし、0,0,0 に移動させます。 for (HeartBeatVFXDevice : AgentVFX): HeartBeatVFXDevice.Deactivate() # ハートビート オーディオから全プレイヤーを登録解除します。 SFXPlayer.UnregisterAll() #ハートビート カウンターを 0 に再初期化します。 set NumberOfHeartBeats = 0