前提条件のトピック:トリプル侵入ゲーム06Verseでダメージを受けた際にプレイヤーをちらつかせて表示する
新しいプレイヤーがゲームに参加した際は、プレイヤー数のバランスを非対称に調整して、適切なチームに割り当てる必要があります。割り当て先のチームが Infiltrator である場合は、それらのプレイヤーに OnInfiltratorDamaged() のインスタンスを関連付ける必要があります。
以下の手順では、進行中のゲームに途中参加したプレイヤーを適切なチームに割り当てるために、バランスを調整する方法を示します。
プレイヤー参加の関数を設定する
- 新しい
OnInfiltratorJoined()関数をinvisibility_managerクラス定義に追加します。この関数はエージェントを受け取り、この特定のエージェントとともにOnInfiltratorDamaged()のインスタンスをスポーンします。この関数はtriad_infiltration_gameから呼び出すことになるため、これに `` 指定子を追加します。 # 新しい Infiltrator がゲームに参加すると、OnInfiltratorDamaged 関数をスポーンします OnInfiltratorJoined<public>(InAgent:agent):void= spawn{OnInfiltratorDamaged(InAgent)} - 新しい
OnPlayerAdded()関数をtriad_infiltration_gameクラス定義に追加します。この関数はプレイヤーを受け取り、プレイヤーのバランスを調整して適切なチームに割り当てて、新しいプレイヤーが Infiltrator である場合はOnInfiltratorJoined()を呼び出します。# ゲームに参加した新しいプレイヤーを処理します。 OnPlayerAdded(InPlayer:player):void= - 現在のプレイ空間の
fort_team_collectionを取得して、それをFortTeamCollection変数に保存します。# ゲームに参加した新しいプレイヤーを処理します。 OnPlayerAdded(InPlayer:player):void= Logger.Print("A new Player joined, assigning them to a team") FortTeamCollection := GetPlayspace().GetTeamCollection()チームのバランスをリファクタリングする
- バランスの調整を通じて新しいプレイヤーを適切なチームに割り当てる必要がありますが、
BalanceTeams()を呼び出すと、新しいチームのすべてのプレイヤーを再度アレンジすることになります。新しいプレイヤーのために最小のチームを特定し、バランスの調整を通じてそのチームに割り当てるようにコードを書き換える代わりに、これをリファクタリングのためのちょうどよい機会と捉えましょう。- 新しい
BalancePlayer()メソッドをtriad_infiltration_gameクラス定義に追加します。このメソッドはプレイヤーを受け取り、バランスを非対称に調整して、プレイヤーを適切なチームに割り当てます。# 各プレイヤーに対し、チームのリストをイテレートし、 # それをプレイヤーの数が最も少ないチームに割り当てます。また、同点の場合は開始チームに割り当てます。 BalancePlayer(InPlayer:player):void= Logger.Print("Beginning to balance player") BalanceTeams()でforループ内のコードを抽出してそれをBalancePlayer()内に配置し、TeamPlayerの名前をInPlayerに変更します。BalancePlayer()コードは次のようになるはずです。# 各プレイヤーに対し、チームのリストをイテレートし、 # それをプレイヤーの数が最も少ないチームに割り当てます。また、同点の場合は開始チームに割り当てます。 BalancePlayer(InPlayer:player):void= Logger.Print("Beginning to balance player") var TeamToAssign:?team = false set TeamToAssign = FindTeamWithLargestDifference() if (AssignedTeam := TeamToAssign?, GetPlayspace().GetTeamCollection().AddToTeam[InPlayer, AssignedTeam]): Logger.Print("Attempting to assign newly joined to a new team") else: Logger.Print("This player was already on the smallest team")- 次に、
BalanceTeams()のforループ内にBalancePlayer()への呼び出しを追加します。これにより、BalanceTeams()の機能を維持しながらも、プレイヤーのバランスを個別に調整できるようになります。BalanceTeams()コードは次のようになるはずです。# ゲーム内のすべてのチームのすべてのプレイヤーのバランスを調整します BalanceTeams():void= Logger.Print("Beginning to balance teams") var AllPlayers:[]player := GetPlayspace().GetPlayers() set AllPlayers = Shuffle(AllPlayers) Logger.Print("AllPlayers Length is {AllPlayers.Length}") for (TeamPlayer : AllPlayers): BalancePlayer(TeamPlayer)
- 新しい
OnPlayerAdded()に戻り、BalancePlayer()への呼び出しを追加して、途中参加したプレイヤーを渡します。# ゲームに参加した新しいプレイヤーを処理します。 OnPlayerAdded(InPlayer:player):void= Logger.Print("A new Player joined, assigning them to a team") FortTeamCollection := GetPlayspace().GetTeamCollection() set AllPlayers = GetPlayspace().GetPlayers() # 新しいプレイヤーを最小のチームに割り当てます BalancePlayer(InPlayer)Teams配列内の各チームをイテレートすることでバランス調整した後で、PlayerTeamに等しいかどうかをチェックするためのフィルタとしてGetTeam[]を使用し、プレイヤーのチームのインデックスを見つけます。# ゲームに参加した新しいプレイヤーを処理します。 OnPlayerAdded(InPlayer:player):void= Logger.Print("A new Player joined, assigning them to a team") FortTeamCollection := GetPlayspace().GetTeamCollection() # 新しいプレイヤーを最小のチームに非対称に割り当てます。 BalancePlayer(InPlayer) for: TeamIndex -> PlayerTeam:Teams PlayerTeam = FortTeamCollection.GetTeam[InPlayer]TeamIndexを使用してTeleporters配列にインデックスを付け、変数TeamTeleporterに格納することで、そのチームに紐づいているテレポーターを取得します。そのテレポーターのトランスフォームを変数Transformに格納します。次に、新しいプレイヤーを、そのチームの開始時のテレポーターにリスポーンします。for: TeamIndex -> PlayerTeam:Teams PlayerTeam = FortTeamCollection.GetTeam[InPlayer] TeamTeleporter := Teleporters[TeamIndex] Transform := TeamTeleporter.GetTransform() do: InPlayer.Respawn(Transform.Translation, Transform.Rotation) Logger.Print("Teleported the spawned player to their start location")- 最後に、途中参加したプレイヤーのチームを、以前に設定した
Infiltratorsオプションを使って比較することで、途中参加したプレイヤーが Infiltrator であるかどうかをチェックします。Infiltrator である場合は、その新しいプレイヤーのinvisibility_managerクラスからOnInfiltratorJoined()を呼び出して、プレイヤーのちらつきを開始します。OnPlayerAdded()コードは次のようになるはずです。# ゲームに参加した新しいプレイヤーを処理します。 OnPlayerAdded(InPlayer:player):void= Logger.Print("A new Player joined, assigning them to a team") FortTeamCollection := GetPlayspace().GetTeamCollection() # 新しいプレイヤーを最小のチームに非対称に割り当てます。 BalancePlayer(InPlayer) for: TeamIndex -> PlayerTeam:Teams PlayerTeam = FortTeamCollection.GetTeam[InPlayer] TeamTeleporter := Teleporters[TeamIndex] Transform := TeamTeleporter.GetTransform() do: InPlayer.Respawn(Transform.Translation, Transform.Rotation) Logger.Print("Teleported the spawned player to their start location") # プレイヤーが Infiltrator だった場合、InvisibilityManager で OnInfiltratorJoined を # 呼び出します。 if(PlayerTeam = MaybeInfiltrators?): InvisibilityManager.OnInfiltratorJoined(InPlayer) - スクリプトを保存してビルドし、UEFN ツールバーの [Launch Session (セッションを起動)] をクリックしてレベルをプレイテストします。レベルをプレイテストすると、進行中のゲームに途中参加したプレイヤーが適切なチームに割り当てられるはずです。そのプレイヤーが Infiltrator である場合は、スポーン時に不可視になり、ダメージを受けた際にはちらついて表示されます。
次のステップ
このチュートリアルの 次のステップ では、プレイヤーが目標のアイテムをキャプチャーした際のビジュアル インジケーターを作成する方法について説明します。