今回はこのようなプレイヤーを追いかけるガードを作ります。
今回のコードは以下を参考にしています。
コードの全体
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
using { /Fortnite.com/AI }
using { /Fortnite.com/Playspaces }
using { /Fortnite.com/Characters }
ai_follower_test := class(creative_device):
@editable
GuardSpawner:guard_spawner_device := guard_spawner_device{}
var AIAgent:?agent = false
var Player:?agent = false
OnBegin<override>()<suspends>:void=
GuardSpawner.SpawnedEvent.Subscribe(AssignAgent)
SetPlayer()
Sleep(1.0)
if(ChasingAgent := AIAgent?):
ChasePlayer(ChasingAgent)
AssignAgent(SpawnedAgent:agent):void=
set AIAgent = option{SpawnedAgent}
SetPlayer():void=
Playspace : fort_playspace = GetPlayspace()
AllPlayers : []player = Playspace.GetPlayers()
set Player = option{AllPlayers[0]}
ChasePlayer(ChasingAgent:agent)<suspends>:void=
if(PlayerToChase := Player?, ChasingAIAgent := AIAgent?, ChasingAICharacter := ChasingAIAgent.GetFortCharacter[]):
NavigationTarget:navigation_target = MakeNavigationTarget(PlayerToChase)
if(ChasingNavigatable := ChasingAICharacter.GetNavigatable[]):
spawn{NavigateToTarget(ChasingNavigatable, NavigationTarget)}
NavigateToTarget(Navigatable:navigatable, NavigationTarget:navigation_target)<suspends>:void=
Radius:float = 400.0
loop:
Navigatable.NavigateTo(NavigationTarget, ?ReachRadius := Radius)
コードの解説
冒頭
この仕組みではガードスポナーを使うため11行目で定義しています。
後にガードとプレイヤーのagent情報が入る変数を12,13行目で定義します。
関数宣言
26行目からAssignAgent関数が定義されています。
コードブロックの意味は以下の通りです。
この関数は18行目のSpawnedEventによって呼び出されるためパラメータはagent型となります。
AIAgentはオプション型なので構文に従って式を書きます。
31行目からSetPlayer関数が定義されています。
コードブロックの意味は以下の通りです。
32,33行目でGetPlayspace関数とGetPlayers関数を使って、ゲーム内にいる全てのプレイヤーのplayer情報を配列として入手しています。
そして、34行目で配列の最初の値にアクセスしPlayer変数の値としています。
38行目からChasePlayer関数が定義されています。
コードブロックの意味は以下のようになります
39行目のオプションへのアクセスとガードのfort_character情報取得は失敗する可能性のある式であるため、失敗コンテキストであるif分の括弧内に入れます。
40行目は、後ほどガードのターゲットをnavigation_target型として指定しなければならないため、player型からnavigation_target型に変換する式です。
42行目でNavigateToTarget関数を呼び出していますが、その関数内でもChasingNavigatableと NavigationTargetの情報を使いたいため引数としています。
また、aysincな関数であるため、呼び出す際にSpawnを描きます
46行目からNavigateToTarget関数が定義されています。
コードブロックの意味は以下のようになります。
loopをつかっておりこの関数はaysincな(処理に時間がかかる)関数であるため、suspends指定子をつけます。
OnBegin~
17行目からがゲーム開始時から実行されるコードです。
コードブロックの意味は以下の通りです。
18行目は、ガードスポナーからガードがスポーンしたらAIAgent 変数にスポーンしたガードの情報を入れるためのAssignAgent関数を呼び出すという意味です。
19行目でガードから追われるプレイヤーの情報をPlayer変数に入れるためのSetPlayer関数を呼び出しています。
以下のように動けば完成です。
コメント