マップ を使用して、プレイヤーが達成した撃破の数を追跡します。マップでは キー/値のペア の便利な関連付けが提供されます。このチュートリアルでは、プレイヤーをキーとし、プレイヤーと関連付けられている武器のティア (int として表される) を値として使用します。この方法により、プレイヤーを参照するだけで現在のティアを取得することができます。 プレイヤーと武器のティアの関連付けを表したマップの例は次のとおりです。
| キー | player 1 | player 2 | player 3 |
| 値 | 1 | 2 | 2 |
| ゲーム内の武器 | Combat Pistol L1 (コンバット ピストル L1) | Flint-Knock Pistol L1 (フリントノック ピストル L1) | Flint-Knock Pistol L1 (フリントノック ピストル L1) |
次の手順に従って、プレイヤーのマップを設定して取り込みます。
-
PlayerMapという名前の[player]intマップをteam_elimination_gameクラスに追加します。このマップに、各プレイヤーとその武器のティアへの参照を格納します。team_elimination_game := class(creative_device): var PlayerMap : [player]int = map{} -
新しいメソッド
PopulateTeamsAndPlayers()をteam_elimination_gameクラスに追加します。このメソッドは、PlayerMapにデータを取り込み、OnBegin()から呼び出されます。PopulateTeamsAndPlayers() : void= Print("Beginning to populate players") -
新しいメソッド
OnPlayerEliminatedをteam_elimination_gameクラスに追加します。このメソッドはプレイヤーが撃破されるたびに呼び出され、引数 として渡されるelimination_result構造体にアクセスすることによって、どのプレイヤーが撃破したかを判断します。OnPlayerEliminated(Result : elimination_result) : void= Print("A Player was eliminated!") -
ゲームの開始時に、プレイヤーのリストでイテレートし、すべてのプレイヤーを最初の武器のティアに設定する必要があります。
PopulateTeamsAndPlayers内で、GetPlaySpace().GetPlayers()を使用してすべてのプレイヤーを取得し、それらを配列AllPlayersに格納します。プレイヤーごとにFortCharacterを取得し、変数FortCharacterに格納します。PlayerMap内のプレイヤーのスコアを、WeaponGranters配列内の最初の武器を表す「0」に設定します。そして、FortCharacter.EliminatedEvent()にOnPlayerEliminatedにサブスクライブします。AllPlayers := GetPlayspace().GetPlayers() for (Agent : AllPlayers, TeamPlayer := player[Agent], FortCharacter := TeamPlayer.GetFortCharacter[]): if(set PlayerMap[TeamPlayer] = 0, WeaponTier := PlayerMap[TeamPlayer]): Print("Assigned Player to PlayerMap with Tier {WeaponTier}") FortCharacter.EliminatedEvent().Subscribe(OnPlayerEliminated) -
PlayerMapセットにあるプレイヤーのスコアへの参照を使用して、プレイヤーに最初の武器を付与することができます。OnPlayerSpawnを変更して、プレイヤーに最初の武器を付与します。プレイヤーがスポーンされるときに、PlayerMapから武器のティアを取得して変数WeaponTierに格納し、次にGrantWeaponにWeaponTierとプレイヤーへの参照を渡して呼び出します。OnPlayerSpawn(InPlayer : agent) : void = Print("A player just spawned!") if(WeaponTier := PlayerMap[InPlayer]): GrantWeapon(option{InPlayer}, WeaponTier) Print("Spawned Player was granted a gun of tier {WeaponTier}") -
Visual Studio Code でスクリプトを保存してコンパイルし、UEFN ツールバーの [Launch Session] をクリックしてレベルをプレイテストします。レベルをプレイテストするときは、
WeaponGranters配列内の最初の武器をスポーンする必要があります。この動作をログで確認してください。
プレイヤーのチームをマッピングする
プレイヤーのマップを設定したら、プレイヤーのスコアを確認する方法について検討することが役立ちます。このスクリプトでは、チームで最も撃破数の少ないプレイヤーが自動的に昇格するため、敵チームのプレイヤーの武器のティアを確認することは役立ちません。PlayerMap ではチームの違いが区別されていないため、すでに問題が発生している場面を目にしているかもしれません。
この問題を回避するために、マップをもう 1 つ使用します。これを行うには、以前に設定した PlayerMap をネスティングされたマップ システムに適応させます。マップ内の キー/値のペア には任意の型のペアを使用できるため、チームをキーとし、もう 1 つのマップを値として使用すると合理的です。1 つ目のマップでは、チーム (キー) を、そのチームのプレイヤーのもう 1 つのマップ (値) に関連付けます。内側のマップでは、プレイヤー (キー) をそのスコア (値) に関連付けます。
次に、プレイヤーごとに GetTeam() を使用して、どのチームに所属しているかを確認できます。そこからチームメイトのリストを取得して、それを撃破数と比較することができます。
ネスティングされたマップ [team][player]int の構文が不明瞭かもしれません。それを理解しやすくするために、型エイリアシング を利用して、マップを参照するための、よりシンプルな名前を作成します。このチュートリアルでは、[player]int に player_map というエイリアスを指定します。そうすることで、[player]int が必要なときはいつでも player_map という名前を使用することができ、ネスティングされたマップを [team]player_map とすることや、チームをプレイヤーのマップに関連付けるマップとして書き直すこともできます。
次の手順に従い、マップをネスティングされたマップ システムに適合させます。
-
team_elimination_gameのクラス定義の上に、[player]intのエイリアスをplayer_mapという名前で追加します。player_map := [player]int # これは型エイリアスです。 team_elimination_game := class(creative_device): -
前に
team_elimination_game内で設定したPlayerMap変数を、型が[team]player_mapである新しい変数TeamMapで置き換えます。# チーム マップのマップ。キーはチームであり、値は # player->int のキー/値のペアのマップです。 var TeamMap : [team]player_map = map{} -
TeamMapの値はplayer_map型であるため、チームごとにプレイヤーのマップを初期化し、値を投入し、各プレイヤーのスコアを0に設定してから、プレイヤーのマップをTeamMapに割り当てる必要があります。更新されたコードを使用してPopulateTeamsAndPlayers()を変更します。- チームごとに、そのチームに所属しているプレイヤーを取得し、変数
TeamPlayersに格納します。型がplayer_mapである新しい変数PlayerMapを初期化して、プレイヤーとそのスコアをマッピングします。
PopulateTeamsAndPlayers() : void= Print("Beginning to populate players") for (Team : Teams, TeamPlayers := GetPlayspace().GetTeamCollection().GetAgents[Team]): var PlayerMap : player_map = map {}TeamPlayers内のプレイヤーごとに、FortCharacterを取得し、変数FortCharacterに格納します。PlayerMap内のプレイヤーのスコアを、WeaponGranters配列内の最初の武器を表す0に設定し、FortCharacter.EliminatedEvent()をOnPlayerEliminatedにサブスクライブします。
PopulateTeamsAndPlayers() : void = Print("Beginning to populate players") for (Team : Teams, TeamPlayers := GetPlayspace().GetTeamCollection().GetAgents[Team]): var PlayerMap : player_map = map {} for (Agent : TeamPlayers, TeamPlayer := player[Agent], FortCharacter := Agent.GetFortCharacter[]): if(set PlayerMap[TeamPlayer] = 0, WeaponTier := PlayerMap[TeamPlayer]): Print("Assigned Player to PlayerMap with Tier {WeaponTier}") FortCharacter.EliminatedEvent().Subscribe(OnPlayerEliminated)- 最後に、
PlayerMapを、TeamMapにある現在のTeamキーの値として設定します。PopulateTeamsAndPlayersコードは次のようになっているはずです。
PopulateTeamsAndPlayers() : void = Print("Beginning to populate players") for (Team : Teams, TeamPlayers := GetPlayspace().GetTeamCollection().GetAgents[Team]): var PlayerMap : player_map = map {} for (Agent : TeamPlayers, TeamPlayer := player[Agent], FortCharacter := Agent.GetFortCharacter[]): if(set PlayerMap[TeamPlayer] = 0, WeaponTier := PlayerMap[TeamPlayer]): Print("Assigned Player to PlayerMap with Tier {WeaponTier}") FortCharacter.EliminatedEvent().Subscribe(OnPlayerEliminated) if(set TeamMap[Team] = PlayerMap): Print("Successfully set this team in the TeamMap") - チームごとに、そのチームに所属しているプレイヤーを取得し、変数
-
TeamMapを設定したら、OnPlayerSpawnを更新し、GetTeam[]を使ってプレイヤーのチームにアクセスしてローカル変数PlayerTeamに格納します。PlayerTeamとプレイヤーへの参照の両方を使用してプレイヤーの現在のスコアをTeamMapから取得することにより、WeaponTierを設定します。更新後のOnPlayerSpawn()のコードは次のようになっているはずです。OnPlayerSpawn(InPlayer : agent) : void = Print("A player just spawned!") if: PlayerTeam := GetPlayspace().GetTeamCollection().GetTeam[InPlayer] WeaponTier:int := TeamMap[PlayerTeam][InPlayer] then: GrantWeapon(option{InPlayer}, WeaponTier) Print("Spawned Player was granted a gun of tier {WeaponTier}")
Visual Studio Code でスクリプトを保存してコンパイルし、UEFN ツールバーの [Launch Session (セッションを起動)] をクリックしてレベルをプレイテストします。レベルをプレイテストするときは、WeaponGranters 配列の最初の武器をもう一度スポーンする必要があります。この動作をログで確認してください。
次のステップ
このチュートリアルの 次のステップ では、プレイヤーが撃破を達成したときに武器を付与する方法について学びます。