前提条件のトピック:トリプル侵入ゲーム03Verseでチームのバランスを非対称に調整する
プレイヤーを各チームに振り分けたので、次は割り当てられた先のチームに基づいて、それぞれのプレイヤーに適切な武器を付与します。 以下の手順では、プレイヤーのスポーン時に適切な武器をプレイヤーに付与する方法を示します。
チームに基づいて武器を付与する
triad_infiltration_gameクラス定義にGrantTeamWeapon()という名前の新しい関数を追加します。この関数では、プレイヤーが属するチームに基づいてプレイヤーに武器を付与します。GrantTeamWeapon(InPlayer:player):void=GrantTeamWeapon()で特定のプレイヤーのチームを取得します。次にforループで、Teams配列に含まれるそれぞれのチームをイテレートして、そのチームのインデックスを取得し、それをTeamIndex変数に格納します。forループで、特定のプレイヤーのチームがこのチームと一致するかどうかをフィルタ条件としてチェックします。GrantTeamWeapon(InPlayer:player):void= if(CurrentTeam := GetPlayspace().GetTeamCollection().GetTeam[InPlayer]): for(TeamIndex -> PlayerTeam:Teams, PlayerTeam = CurrentTeam):- フィルタ条件によって
forループ内のコードが適切なチームで実行されることが確実になるため、そのチームのTeamIndexを使ってWeaponGrantersにインデックスを付けることで、そのチームに適切なアイテム グランターを取得します。最後に、特定のプレイヤーを使ってGrantItem()を呼び出します。GrantTeamWeapon()コードは次のようになるはずです。# WeaponGranters 配列にインデックスを付けることにより、 # Teams 配列内のチームのインデックスに基づいてプレイヤーに武器を付与します。 GrantTeamWeapon(InPlayer:player):void= if(CurrentTeam := GetPlayspace().GetTeamCollection().GetTeam[InPlayer]): for(TeamIndex -> PlayerTeam:Teams, PlayerTeam = CurrentTeam): if(WeaponGranter := WeaponGranters[TeamIndex]): WeaponGranter.GrantItem(InPlayer) Logger.Print("Granted a Player on team {TeamIndex + 1} a weapon")Teamsのチームの順序が、WeaponGrantersのアイテム グランターの順序と一致することを確認してください。たとえば、Infiltrators チームが Team 1 であれば、WeaponGrantersの最初のグランターも Infiltrators である必要があります。これらの値が正しいことをエディタ内で再確認してください。
プレイヤーのスポーン時に武器を付与する
triad_infiltration_gameクラス定義にOnPlayerSpawn()という新しい関数を追加します。この関数はagentを受け取り、それを使ってGrantTeamWeapon()を呼び出して、プレイヤーに適切な武器を付与します。OnPlayerSpawn(SpawnedAgent:agent):void=OnPlayerSpawn()で、SpawnedAgentをplayerにキャストします。次にGrantTeamWeapon()を呼び出してプレイヤーを渡します。OnPlayerSpawn()関数は次のようになるはずです。# プレイヤーがスポーン パッドからスポーンすると実行されます。 # 提供された SpawnedAgent を使用して GrantTeamWeapon を呼び出します。 OnPlayerSpawn(SpawnedAgent:agent):void= if(SpawnedPlayer := player[SpawnedAgent]): Logger.Print("Attempting to grant spawned player a weapon") GrantTeamWeapon(SpawnedPlayer)OnBegin()で、BalanceTeams()への呼び出しの前に、forループを使って、各プレイヤー スポナーのSpawnedEventを先ほど定義したOnPlayerSpawn()関数にサブスクライブします。OnBegin<override>()<suspends>:void = # すべてのチームを取得します。 set Teams = GetPlayspace().GetTeamCollection().GetTeams() # Save the teams to later reference them set InfiltratorsOpt = option{Teams[0]} set AttackersOpt = option{Teams[1]} set DefendersOpt = option{Teams[2]} if: Infiltrators := InfiltratorsOpt? Attackers := AttackersOpt? Defenders := DefendersOpt? Logger.Print("Found all three teams") set TeamsAndTotals[Infiltrators] = MaximumInfiltrators set TeamsAndTotals[Attackers] = MaximumAttackers set TeamsAndTotals[Defenders] = MaximumDefenders Logger.Print("Set all three teams in TeamsAndTotals") then: #新しいプレイヤーがゲームに参加したときにチームのバランスを再調整できるようにするため、PlayerAddedEvent をサブスクライブします for(PlayerSpawner:PlayersSpawners): PlayerSpawner.SpawnedEvent.Subscribe(OnPlayerSpawn) BalanceTeams() TeleportPlayersToStartLocations() else: Logger.Print("Couldn't find all teams, make sure to assign the correct teams in your island settings.")-
スクリプトを保存してビルドし、UEFN ツールバーの [Launch Session (セッションを起動)] をクリックしてレベルをプレイテストします。レベルをプレイテストすると、それぞれのプレイヤーが差分が最も大きいチームに割り当てられて、所属するチームに適切な武器とともにスポーンされるはずです。ログを使ってこの動作を確認してください。
次のステップ
このチュートリアルの 次のステップ では、ゲームの開始時と Infiltrators のスポーン時に、Infiltrators を不可視にする方法について説明します。