【UEFN】Verse言語でプレイヤーを追いかけるガードを作る

今回はこのようなプレイヤーを追いかけるガードを作ります。

今回のコードは以下を参考にしています。

目次

コードの全体

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関数が定義されています。 
コードブロックの意味は以下の通りです。 

AIAgent変数にスポーンしたガードのagent情報を入れる

この関数は18行目のSpawnedEventによって呼び出されるためパラメータはagent型となります。 
AIAgentはオプション型なので構文に従って式を書きます。 



31行目からSetPlayer関数が定義されています。 
コードブロックの意味は以下の通りです。 

fort_playspace情報を取得 
ゲームにいる全てのプレイヤーのplayer情報を取得 
Player変数に最初のプレイヤーのplayer情報を入れる 

32,33行目でGetPlayspace関数とGetPlayers関数を使って、ゲーム内にいる全てのプレイヤーのplayer情報を配列として入手しています。 
そして、34行目で配列の最初の値にアクセスしPlayer変数の値としています。 


38行目からChasePlayer関数が定義されています。 
コードブロックの意味は以下のようになります 

Player変数とAIagent変数にアクセス、ガードのfort_character情報取得 
MakeNavigationTargetを呼び出す 
GetNavigatableを呼び出す 
NavigateToTargetを呼び出す 

39行目のオプションへのアクセスとガードのfort_character情報取得は失敗する可能性のある式であるため、失敗コンテキストであるif分の括弧内に入れます。 

40行目は、後ほどガードのターゲットをnavigation_target型として指定しなければならないため、player型からnavigation_target型に変換する式です。 

42行目でNavigateToTarget関数を呼び出していますが、その関数内でもChasingNavigatableと NavigationTargetの情報を使いたいため引数としています。
また、aysincな関数であるため、呼び出す際にSpawnを描きます 

46行目からNavigateToTarget関数が定義されています。 
コードブロックの意味は以下のようになります。 

1.プレイヤーを追いかける範囲の半径を決定 
2.以下をループ 
NavigateToを呼び出して、プレイヤーを追いかける 

loopをつかっておりこの関数はaysincな(処理に時間がかかる)関数であるため、suspends指定子をつけます。 

OnBegin~

17行目からがゲーム開始時から実行されるコードです。 
コードブロックの意味は以下の通りです。 

GuardSpawnerでSpawnedEvent起きたらAssignAgent関数を呼び出す 
SetPlayer関数を呼び出す 
1秒間コードの実行を停止 
AIAgent?にアクセス  
ChasePlayer関数を呼び出す 

18行目は、ガードスポナーからガードがスポーンしたらAIAgent 変数にスポーンしたガードの情報を入れるためのAssignAgent関数を呼び出すという意味です。 

19行目でガードから追われるプレイヤーの情報をPlayer変数に入れるためのSetPlayer関数を呼び出しています。 




以下のように動けば完成です。

よかったらシェアしてね!

この記事を書いた人

メタバースに興味を持ち、UEFN、Verseを学びながらFortniteでゲーム制作しています。
初心者でも理解できるような記事を書くことを心がけております。
間違いがありましたら指摘よろしくお願いいたします。

コメント

コメントする

目次