【UEFN】Verse言語で「ビルボードにキル数を表示する仕組み」を実装する

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

目次

コードの全体

using {/Fortnite.com/Devices}
using {/Verse.org/Simulation}
using {/UnrealEngine.com/Temporary/Diagnostics }



GameManager :=class(creative_device): 
    @editable Team1ScoreBoard: billboard_device=billboard_device{}
    @editable Team2ScoreBoard:billboard_device= billboard_device{}
    @editable ScoreManagerDevice: score_manager_device= score_manager_device{}
    var Teams: []team = array{} 



    OnBegin<override>()<suspends>:void= 
        set Teams = GetPlayspace().GetTeamCollection().GetTeams()  
        spawn: 
            CheckTeamScores() 



    StringToMessage<localizes> (value:string) <computes> :message = "{value}" 



    CheckTeamScores()<suspends>:void= 
        loop: 
            Players:= GetPlayspace().GetPlayers() 

            var Team1Score:int = 0 
            var Team2Score:int = 0 

            for (Player :Players): 
                if(PlayerTeam:=GetPlayspace().GetTeamCollection().GetTeam[Player]):  
                    if (Agent:=agent[Player]): 
                        if(PlayerTeam=Teams[0]):  
                            set Team1Score += ScoreManagerDevice.GetCurrentScore(Agent)  
                        else if(PlayerTeam=Teams[1]):  
                            set Team2Score += ScoreManagerDevice.GetCurrentScore(Agent) 

            Team1ScoreBoard.SetText(StringToMessage("チーム1:(Team1Score) キル "))  
            Team2ScoreBoard.SetText(StringToMessage("チーム2:(Team2Score) キル ")) 

            Sleep(5.0) 

コードの解説

冒頭

この仕組みでは仕掛けのビルボードとスコアマネージャーを使うため8~10行目で定義します。 

11行目で、ゲーム内のteam情報が入るTeams変数を定義します。

関数宣言

22行目でStringToMessage関数を宣言しています。 
これは、string型からビルボードに表示できるmessage型へ変換するための関数です。 

26行目でCheckTeamScores関数を宣言しています。 
コードブロックの意味は以下のようになります。 

以下をループ 
1.ゲーム内にいる全てのプレイヤーのplayer情報を取得 
2.チームのスコアとなる変数定義 
3.各プレイヤーに対して以下を実施 
プレイヤーのteam情報を取得 
プレイヤーのagent情報を取得 
プレイヤーが得たスコアを自分のチームのスコアに加算する 
4.それぞれのチームのビルボードボードに現在のスコアを表示する。 
5.コードの実行を5秒間停止 

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

28行目でGetPlayspace関数とGetPlayers関数により、ゲーム内にいる全てのプレイヤーのplayer情報を取得しています。 

33行目でforを使うことで、Players配列の要素全て(全てのプレイヤー)に対してコードブロック内の式を実行できます。 

34行目ではまずGetTeamCollectionによりゲーム内に存在する全てのチームの情報を取得し、それに対してGetTeamを呼び出すことで、プレイヤーの属しているチームを取得します。
この式は失敗する可能性のある式であるため失敗コンテキストであるif文の括弧内に入れます。 

35行目でGetCurrentScore関数を呼び出す際に引数にagent情報が必要なため、player情報からagent情報を取得しています。これも失敗する可能性のある式です。 

36行目と38行目のif..else式でプレイヤーのチームを判別しています。 

16行目でセットしていたTeams配列の要素とプレイヤーのteam情報が等しいか否かによってチームを判別し、プレイヤーのスコアをチームのスコアに加算しています。 

37行目と39行目のGetCurrentScore関数によりはプレイヤーが得たスコアを取得できます。 
これをTeam1Score変数とTeam2Score変数にチームに応じて加算することで、チームスコアを計算しています。 

そして41,42行目でそれぞれのチームのビルボードにSetText関数によってチームスコアを表示します。 
これを5秒毎に行うことで、この仕組みを実現させています。 

OnBegin~

15行目以降がゲーム開始時から実行されるコードです。 
コードブロックの意味は以下のようになります 

ゲーム内に存在する全てのチームのteam情報を取得しTeams変数に入れる 
CheckTeamScores関数を呼び出す 

CheckTeamScores関数はasyncな関数であるため、spawnを使います。 

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

この記事を書いた人

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

コメント

コメントする

目次