この例のキャラクターは、カスタム タイプのキャラクター定義を使用しています。これは動き回るだけでよく、ガード API または野生生物 API にアクセスする必要がないためです。 キャラクターの動作は、verse_commander_character という名前のカスタムの Verse 動作によって決まります。
ガードは、指定されたパスに沿って移動し、敵プレイヤーを攻撃するために敵対的になることができるプレイ不可のキャラクター (NPC) です。 野生動物は鶏やイノシシなどの動物で、指定されたパスに沿って移動し、敵プレイヤーを攻撃することができます。
カスタム NPC の作成を開始するには、Verse Explorer を使用して vese_commander_character という名前の新しい NPC 動作を作成します。 独自のカスタム NPC 動作を作成する方法については、「カスタムの NPC 動作を作成する」を参照してください。
キャラクターは、次のプロパティを認識および管理する必要があります。
CommandWaitTime:各コマンド間での待機時間。
FocusTime:ターゲットでフォーカスを強制する時間。 キャラクターを左または右に向けるには、キャラクターの
focus_interfaceを使用して特定のポイントを左または右に向けるように強制することで処理します。 ターゲットへのフォーカスは中断しない限り完了しないため、非常に低い数値、つまりキャラクターがある方向を向くのに十分な時間に設定します。ReachRadius:これは、キャラクターがナビゲーション ターゲットに「到達した」と見なすのに必要な距離です。
VerseCommanderMinigame:レベルでの VerseCommanderMinigame への参照で、これによってキャラクターはそこから発行されるコマンドをリッスンすることができます。
VFX and Arrow References:これらは VFX へのテレポートまたは VFX からのテレポート、およびキャラクターの向きを確認しやすくする前方向の矢印の小道具を参照します。
Verse# A Verse-authored NPC Behavior that can be used within an NPC Definition or a Character Spawner device's Behavior Script Override. verse_commander_character<public> := class(npc_behavior): # The VFX that play when the NPC teleports out. @editable CharacterTeleportOutVFX:vfx_spawner_device = vfx_spawner_device{} # The VFX that play when the NPC teleports in. @editable CharacterTeleportInVFX:vfx_spawner_device = vfx_spawner_device{}キャラクターのプロパティを定義したので、動作やこれらを定義する関数を定義しましょう。
キャラクター移動
このゲームのキャラクターには次の動作があります。
Move Forward (前進):前進コマンドは、キャラクターをゲームボード上で 1 タイル前進させます。
Turn Right (右に向く) または Turn Left (左に向く):Turn Right コマンドと Turn Left コマンドでは、キャラクターを 90 度それぞれ右または左に向かせることができます。 キャラクターが立っているタイルからキャラクターを移動させることなく行う必要があります。
Reset (リセット):Reset コマンドを発行すると、キャラクターはゲームボード上の開始位置にテレポートして戻ります。
Await Commands (待機コマンド):キャラクターの動きを直接制御できないため、レベル内で VerseCommanderMinigame の仕掛けから発行されるコマンドをリッスンする必要があります。 このコマンドのすべてを実行した後、キャラクターは立ち止まり次のコマンドを待機します。
このテンプレートの NPC には移動オプションがいくつかあり、向いている方向に 1 タイル分前進したり、右に向いたり、左に向いたりすることができます。 これらのオプションは、それぞれ GetNavTarget() 関数で実行され、キャラクターが使用する新しいナビゲーション ターゲットを 1 TileDistance 離して作成します。 このターゲットは、指定されたコマンドが前方か右か左かに応じて、キャラクターのローカルの前方向、右方向または左方向のいずれかを向きます。
# Gets a new navigation target for the NPC based on the current transform and the given command.
GetNavTarget(CurrentTransform:transform, Command:command, TileDistance:vector3):transform=
# Based on the command, get the character's local forward, right, or left (negative right).
Direction :=
if (Command = Commands.Forward):
CurrentTransform.Rotation.GetLocalForward()
else if (Command = Commands.TurnRight):
CurrentTransform.Rotation.GetLocalRight()
else if (Command = Commands.TurnLeft):
-CurrentTransform.Rotation.GetLocalRight()
NPC が実行シグナルを受信すると、受信したコマンドのリストを反復処理し、それぞれを ExecuteCommand() 関数に渡します。 最初に、キャラクターの focus_interface と navigatable インターフェースを取得してから、コマンドに基づいて異なるアクションを実行します。 前方向、右、左ごとに、GetNavTarget() を呼び出して、NPC が使用する新しいトランスフォームを見つけます。 その後、navigatable インターフェースから NavigateTo() を使用して前方の新しいトランスフォームにナビゲートするか、focus_interface を使用して右または左のターゲットにフォーカスします。
# Executes the given command, either moving the NPC forward one tile or turning them left
# or right.
ExecuteCommand(Command:command, TileSize:vector3)<suspends>:void=
if:
# Get the Agent (the NPC).
Agent := GetAgent[]
# Gets the Fortnite Character interface, which gets you access to its gameplay data
# including its AI module for navigation and focus.
Character := Agent.GetFortCharacter[]
キャラクター VFX
キャラクターはゲームボードを動き回り、矢印の小道具はその位置と向きを示してトップダウン カメラからキャラクターを簡単に視覚化します。 この矢印は、キャラクターに追随し、キャラクターが向きを変えたり動いたりすると更新する必要があります。 MoveArrow() 関数は、キャラクターの位置と合うように矢印の位置を更新し、その位置と向きをコピーします。 CreateArrow() 関数は矢印の小道具をスポーンし、キャラクターの最初の位置を確認できるように、MoveArrow() への初期呼び出しを実行します。
# Creates an arrow prop at the NPC's position that visually shows the orientation of the NPC.
CreateArrow(Agent:agent):void=
if :
Character := Agent.GetFortCharacter[]
then:
var Transform:transform = Character.GetTransform()
# Spawn the arrow prop, then set the mesh and material for the prop.
SpawnPropResult := SpawnProp(ForwardArrowAsset, Transform)
if:
SpawnedProp := SpawnPropResult(0)?
キャラクターがボードにスポーンしたり、新しいボードに移動したり、リセット コマンドでボードの開始にリセットすると、テレポートするアニメーションがテレポートして入る場合とテレポートして退去する場合の両方で再生されます。 テレポートする効果を作成するには、最初にキャラクターと矢印で Hide() を呼び出してから、キャラクターの位置へ VFX スポナーを移動して有効にすることで、TeleportOutVFX を再生します。 VFX からテレポートして退去すると、キャラクターを新しい位置にテレポートしてその場所で TeleportInVFX を再生する必要があります。 すべて完了すると、キャラクターと矢印の小道具で Show() を呼び出し、新しい位置でキャラクターを表示します。
# Hides the NPC and the arrow prop, then teleports both to a new position,
# playing VFX for teleporting in and teleporting out.
PlayVFXAndMoveCharacter(StartPosition:transform)<suspends>:void=
if:
Agent := GetAgent[]
FortCharacter := Agent.GetFortCharacter[]
then:
# Hide the NPC and the arrow.
FortCharacter.Hide()
ForwardArrow.Hide()
キャラクターのテレポートはヘルパー関数 MoveToTile() で実行し、トランスフォームを使用して、キャラクタを移動したり、そこにトランスポートしたりします。 キャラクターが床にのめり込まないように、小さいオフセットがトランスフォームの Z 値に追加されます。
# Teleports the NPC to the given transform.
MoveToTile(Transform:transform)<transacts><decides>:void=
# Get the Agent (the NPC).
Agent := GetAgent[]
# Gets the Fortnite Character interface, which gets you access to its gameplay data
# including its AI module for navigation and focus.
Character := Agent.GetFortCharacter[]
var NewTransform:transform = Transform
コマンドを処理する
キャラクターがボード上でアイドルの場合、次に何を実行すればよいかを認識するために、動かずに実行シグナルをリッスンする必要があります。 これは AwaitCommands() 関数で実行されます。 この関数には suspends 指定子があるため、キャラクターは ExecuteCommandsEvent に対して Await() を実行する必要があるので、非同期で実行できます。 コマンドはコマンドの配列、およびこれらのコマンドに使用される TileSize が含まれるタプルとして発生するので、ExecuteCommand() を呼び出して for ループでそれぞれ処理する必要があります。 各コマンドを実行すると、前方向の矢印を非表示にし、コマンドが実行を完了したときのみ再度表示します。 すべてのコマンドが実行を完了すると、Verse コマンダー ミニゲームに、コマンドが完了し次の処理の準備ができているというシグナルを送ります。
# Waits for commands to be sent from the verse_commander_minigame, then
# executes each command.
AwaitCommands()<suspends>:void=
if:
Agent := GetAgent[]
then:
# Wait for commands to be sent from the verse commander minigame.
ExecuteResult := VerseCommanderMinigame.ExecuteCommandsEvent.Await()
# For each execute result tuple, execute the command and pass the tile size from the tuple.
新しいコマンドを処理するのではなく、[Reset (リセット)] ボタンでキャラクターを現在のゲームボードの開始にリセットすることもできます。 リセットはすぐに行われ、コマンド キューを使用しないので、キャラクターは実行シグナルから別々にコマンドをリッスンする必要があります。 これは AwaitReset() 関数で行われ、BoardResetEvent が Verse コマンダー ミニゲームからシグナルを送るのを待機します。 実行すると、PlayVFXAndMoveCharacter() を呼び出してキャラクターをボードの開始位置に戻します。
# Waits for the current board to be reset, then moves the
# NPC back to the starting position of the board along with VFX.
AwaitReset()<suspends>:void=
# Wait for the current board to be reset.
# The event payload is the starting position for the board.
StartPosition := VerseCommanderMinigame.BoardResetEvent.Await()
spawn{PlayVFXAndMoveCharacter(StartPosition)}キャラクター ゲーム ループを実行する
コマンドを処理するさまざまな関数が設定されたので、キャラクターのコア ゲーム ループを作成できます。 キャラクターは継続的に実行シグナルをリッスンしてコマンド リストを処理するか、リセット シグナルをリッスンしてボードの開始にリセットする必要があります。 実行シグナルとリセット シグナルを待機すると非同期に実行する必要があり、ボードごとに複数回発生する場合があるため、両方でループを処理する別々のヘルパー関数が必要になります。 これは CharacterCommandLoop() 関数で処理され、キャラクターのメインのゲーム ループを実行します。 race 式で AwaitReset() 関数と継続的に AwaitCommands() を呼び出すループ間でレースを行い、キャラクターが常にコマンドをリッスンするようにします。
# Race between resetting the character to start of the board and awaiting commands for that character.
CharacterCommandLoop()<suspends>:void=
race:
AwaitReset()
loop:
AwaitCommands()ゲームが開始すると、キャラクターは NPC スポナーからスポーンするまでレベル内に存在しません。 これは、スポーンすると、参照がないため Verse コマンダー ミニゲームをレベル内で見つける必要があるということです。 これを実行するには、GetCreativeObjectsWithTag() を使用してゲームプレイ タグ verse_commander_minigame_tag でオブジェクトを見つけ、VerseCommanderMinigame として設定します。 独自のミニゲーム体験を作成する場合、通信する必要があるオブジェクトをレベル内のキャラクターが見つけられるように、タグを適切に設定します。
Verse コマンダー ミニゲームを見つけると、キャラクターは CreateArrow() を使用して追随する前方向の矢印をスポーンする必要があります。 ゲーム ループを実行するには、継続的に CharacterCommandLoop() 関数をループして、リセット シグナルが発生した場合に再起動する必要があります。 これは、Verse コマンダー ミニゲームから GameEndedEvent に対して race 式で行う必要があります。ゲームが終了した場合、キャラクターはすぐに実行中のものを停止する必要があるためです。
# This function runs when the NPC is spawned in the world and ready to follow a behavior.
OnBegin<override>()<suspends>:void=
# Get the Verse Commander Minigame Device.
# Assumption is that there is only one device in the level.
CreativeObjects := GetCreativeObjectsWithTag(verse_commander_minigame_tag{})
if:
CreativeObject := CreativeObjects[0]
MinigameManager := verse_commander_minigame[CreativeObject]
then:
次のステップ
Verse の仕掛けからコマンド データを取得し、これを使用してゲームボード上を動き回るカスタム NPC を定義しました。 カスタム キャラクターを作成するためのコードの完全なリストについては、最終ステップ「7. 最終結果」を参照してください。
次のステップでは、キャラクターが動き回ることができるボードを作成し、パズルを解く方法について学習します。