여기서는 맵을 사용해서 플레이어가 달성한 처치 수를 트래킹할 것입니다. 맵은 편리한 키-값 쌍을 제공합니다. 이 튜토리얼에서는 플레이어를 키로 사용하고 플레이어의 관련 무기 등급(int로 나타냄)을 값으로 사용할 것입니다. 이렇게 하면 플레이어 레퍼런스만 가지고 플레이어의 현재 등급을 얻을 수 있습니다. 아래는 플레이어와 무기 등급이 어떻게 연결되는지를 표현한 예시 맵입니다.
| 키 | 플레이어 1 | 플레이어 2 | 플레이어 3 |
| 값 | 1 | 2 | 2 |
| 인게임 무기 | 전투용 권총 L1 | 화승 권총 L1 | 화승 권총 L1 |
다음 단계에 따라 플레이어 맵을 설정하고 채웁니다.
-
team_elimination_game클래스에[player]int맵PlayerMap을 추가합니다. 각 플레이어의 레퍼런스와 무기 등급을 저장하는 맵입니다.team_elimination_game := class(creative_device): var PlayerMap : [player]int = map{} -
team_elimination_game클래스에 새 메서드PopulateTeamsAndPlayers()를 추가합니다.PlayerMap을 채우는 메서드이며,OnBegin()에서 호출됩니다.PopulateTeamsAndPlayers() : void= Print("Beginning to populate players") -
team_elimination_game클래스에 새 메서드OnPlayerEliminated를 추가합니다. 이 메서드는 플레이어가 처치될 때마다 호출되며 실행인자로 전달된elimination_result구조체에 액세스해 어떤 플레이어가 처치했는지 판단합니다.OnPlayerEliminated(Result : elimination_result) : void= Print("A Player was eliminated!") -
게임이 시작되면 플레이어 목록을 순회해 모든 플레이어에게 첫 번째 무기 등급을 설정하는 반복작업을 해야 합니다.
PopulateTeamsAndPlayers에서GetPlaySpace().GetPlayers()를 사용해 모든 플레이어를 가져와 배열AllPlayers에 저장합니다. 각 플레이어의FortCharacter를 얻어서 변수FortCharacter에 저장합니다.WeaponGranters배열의 첫 번째 무기를 나타내기 위해PlayerMap에서 플레이어의 점수를 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에 저장하고,WeaponTier와 플레이어 레퍼런스를 전달하며GrantWeapon을 호출합니다.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 은 팀을 구분하지 못한다는 점에서 문제가 발생할 것을 예상할 수 있습니다.
이 문제를 해결하기 위해 맵을 하나 더 사용하겠습니다. 이를 위해 이전에 구성한 PlayerMap 을 중첩 맵 시스템에 적용합니다. 맵의 키-값 쌍은 어느 타입의 쌍이든 될 수 있으므로, 팀을 키로 사용하고 다른 맵을 값으로 사용할 수 있습니다. 첫 번째 맵은 팀(키)과 해당 팀의 플레이어들이 저장된 다른 맵(값)을 연결합니다. 내부 맵은 플레이어(키)와 해당 플레이어의 점수(값)를 연결합니다.
이제 플레이어가 주어지면 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으로 대체합니다.# 팀과 맵을 연결하는 맵으로, 키는 팀이고 값은 # 플레이어->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에 저장합니다.WeaponGranters배열의 첫 번째 무기를 나타내기 위해PlayerMap에서 플레이어의 점수를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 배열의 첫 번째 무기를 가지고 생성되어야 합니다. 로그를 통해 이 행동을 확인합니다.
다음 단계
이 튜토리얼의 다음 단계에서는 플레이어가 처치를 달성했을 때 무기를 지급하는 방법을 학습할 것입니다.