새 플레이어가 게임에 합류하면 적절한 팀에 비대칭으로 밸런싱해야 합니다. 해당 팀이 침투자인 경우에는 관련된 OnInfiltratorDamaged() 의 인스턴스도 갖춰야 합니다.
진행 중인 게임에 참가 시 플레이어를 올바른 팀에 밸런싱하는 방법을 살펴보려면 다음 단계를 따릅니다.
플레이어 합류 함수 구성하기
- 새 함수
OnInfiltratorJoined()를invisibility_manager클래스 정의에 추가합니다. 이 함수는 에이전트를 취하고, 지정된 에이전트와 함께OnInfiltratorDamaged()의 인스턴스를 스폰합니다. 이 함수는triad_infiltration_game에서 호출할 것이므로 `` 지정자를 추가합니다. # 새 침투자가 게임에 합류하면 OnInfiltratorDamaged 함수를 스폰합니다. OnInfiltratorJoined<public>(InAgent:agent):void= spawn{OnInfiltratorDamaged(InAgent)} - 새 함수
OnPlayerAdded()를triad_infiltration_game클래스 정의에 추가합니다. 이 함수는 플레이어를 취해 올바른 팀에 밸런싱한 후 새 플레이어가 침투자인 경우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배열에서 각 팀을 반복작업하여 밸런싱한 뒤 플레이어 팀의 인덱스를 찾습니다. 이때GetTeam[]을 필터로 사용하여PlayerTeam과 일치하는지 확인합니다.# 게임에 합류한 새 플레이어를 처리합니다. 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옵션과 비교하여 침투자가 맞는지 확인합니다. 침투자가 맞다면 새 플레이어의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") # 플레이어가 침투자였다면, InvisibilityManager에서 # OnInfiltratorJoined를 호출합니다. if(PlayerTeam = MaybeInfiltrators?): InvisibilityManager.OnInfiltratorJoined(InPlayer) - 스크립트를 저장하고 빌드한 후 UEFN 툴바에서 세션 시작(Launch Session) 을 클릭하여 레벨을 플레이테스트합니다. 레벨을 플레이테스트할 때는 플레이어가 이미 진행 중인 게임에 참가하는 경우 올바른 팀에 밸런싱되어야 합니다. 플레이어가 침투자인 경우 투명 상태로 생성되고 피해를 입으면 깜빡여야 합니다.
다음 단계
이 튜토리얼의 다음 단계에서는 플레이어가 목표물을 회수했을 때 시각적 표시를 생성하는 방법을 살펴봅니다.