맵을 구성했으니 다음 단계는 플레이어가 처치를 달성했을 때 무기를 지급하는 것입니다.
플레이어가 처치를 기록했을 때, 다음 두 규칙을 적용하고자 합니다.
-
해당 플레이어가 팀 내에서 무기 등급이 가장 높지 않거나, 모든 플레이어의 무기 등급이 같으면 해당 플레이어를 다음 무기 등급으로 승급합니다.
-
그렇지 않고 팀에 무기 등급이 더 낮은 플레이어가 있다면, 해당 플레이어를 대신 승급합니다.
이렇게 하면 플레이어들이 한 팀으로서 무기를 업그레이드하게 되고, 어느 플레이어도 다른 팀원들과 비교해 두 단계 이상 앞서거나 뒤처지지 않습니다.
이를 위해 플레이어가 처치를 달성한 시점을 파악하고, 그런 다음 플레이어의 무기 등급을 팀의 다른 모든 플레이어와 비교하여 위의 두 규칙에 따라 플레이어를 승급해야 합니다.
다음 단계에 따라 플레이어가 처치를 달성했을 때 무기를 지급합니다.
-
team_elimination_game클래스에 새 메서드GiveNextWeapon을 추가합니다. 위 2개의 규칙에 따라 자신 또는 팀 내 다른 플레이어가 처치를 달성했을 때 플레이어에게 무기를 제공하는 메서드입니다.GiveNextWeapon(EliminatingPlayer : agent) : void = Print("Finding a player to promote") -
OnPlayerEliminated를 업데이트해 플레이어가 처치를 달성했음을 트래킹합니다.OnPlayerEliminated가elimination_result를 받으므로 처치한 캐릭터와 처치된 캐릭터 모두의 레퍼런스를 가져올 수 있습니다. 플레이어는 추락 대미지, 보초, 자해 대미지 등 다양한 요인에 의해 처치될 수 있으므로,EliminatingCharacter가 실제 플레이어의FortCharacter인지 알아내는 과정이 필요합니다.Result.EliminatingCharacter의 레퍼런스를 가져와 로컬 옵션 변수Eliminator에 저장합니다.Eliminator가 유효한FortCharacter인지 확인하고, 맞으면 해당 캐릭터의 에이전트를 변수EliminatorAgent에 저장합니다. 마지막으로GiveNextWeapon에EliminatorAgent를 전달합니다.
OnPlayerEliminated(Result : elimination_result) : void = Print("A Player was eliminated!") Eliminator := Result.EliminatingCharacter if (FortCharacter := Eliminator?, EliminatorAgent := FortCharacter.GetAgent[]): GiveNextWeapon(EliminatorAgent) -
GiveNextWeapon은 올바른 플레이어에게 새 무기를 제공하기 위해 여러 변수를 트래킹해야 합니다.GiveNextWeapon에 다음 선언을 추가합니다.-
int 변수
WeaponTier.무기를 제공할 플레이어의 무기 등급을 트래킹합니다. -
무기를 제공할 플레이어를 나타내는 옵션 에이전트 변수
MaybePlayerToGrant.기본적으로GiveNextWeapon에 전달된 플레이어입니다. -
무기를 제공할 플레이어의 팀을 나타내는 옵션 팀 변수
MaybePlayerTeam.기본적으로GiveNextWeapon에 전달된 플레이어의 팀입니다.
GiveNextWeapon(EliminatingPlayer : agent) : void = Print("Finding a player to promote") var WeaponTier : int = 0 var MaybePlayerToGrant : ?agent = option{EliminatingPlayer} # 무기를 지급할 플레이어 var MaybePlayerTeam : ?team = option{GetPlayspace().GetTeamCollection().GetTeam[EliminatingPlayer]} # 이 플레이어가 속한 팀 -
-
MaybePlayerTeam의 값을 로컬 변수PlayerTeam으로 추출한 다음WeaponTier를TeamMap의 플레이어 점수 값으로 설정합니다.var MaybePlayerTeam : ?team = option{GetPlayspace().GetTeamCollection().GetTeam[EliminatingPlayer]} # 이 플레이어가 속한 팀 if(PlayerTeam := MaybePlayerTeam?, set WeaponTier = TeamMap[PlayerTeam][EliminatingPlayer]): -
팀의 모든 플레이어를 순회하며 반복작업으로 무기 등급을 비교합니다. 등급이 낮은 플레이어를 발견하면
MaybePlayerToGrant를 해당 플레이어로 설정하고WeaponTier를 해당 플레이어의 점수로 설정합니다.TeamMap은 맵이므로Teammate -> TeammateTier구문을 사용해 키(플레이어)와 값(무기 등급)을 모두 추출할 수 있습니다.if(PlayerTeam := MaybePlayerTeam?, set WeaponTier = TeamMap[PlayerTeam][EliminatingPlayer]): for(Teammate -> TeammateTier : TeamMap[PlayerTeam], TeammateTier < WeaponTier): Print("Found a Teammate with a lower Tier at Tier {TeammateTier}") if(set WeaponTier = TeamMap[PlayerTeam][Teammate]): set MaybePlayerToGrant = option{Teammate} -
무기 등급이 가장 낮거나 이와 동급인 플레이어를 찾으면
WeaponTier를 한 단계 올린 다음TeamMap에서 해당 플레이어의 무기 등급을WeaponTier로 설정합니다.if(PlayerTeam := MaybePlayerTeam?, set WeaponTier = TeamMap[PlayerTeam][EliminatingPlayer]): for(Teammate -> TeammateTier : TeamMap[PlayerTeam], TeammateTier < WeaponTier): Print("Found a Teammate with a lower Tier at Tier {TeammateTier}") if(set WeaponTier = TeamMap[PlayerTeam][Teammate]): set MaybePlayerToGrant = option{Teammate} set WeaponTier = WeaponTier + 1 if(PlayerTeam := MaybePlayerTeam?, PlayerToGrant := player[MaybePlayerToGrant?], set TeamMap[PlayerTeam][PlayerToGrant] = WeaponTier): Print("Eliminating Player Tier is now {WeaponTier}") -
무기 등급을 1 높이면 게임 종료에 필요한 처치 수를 넘어갈 수 있으므로, 여기서 플레이어가 게임 승리를 달성했는지 확인하는 것이 좋습니다.
team_elimination_game클래스에 새 메서드EndGame을 추가합니다. 플레이어가 마지막 무기 등급에 도달하면EndGameDevice를 활성화하는 메서드입니다. 완성된 메서드는 다음과 같아야 합니다.
EndGame(InPlayer : agent) : void = Print("Player reached final Weapon Tier, activating EndGameDevice") EndGameDevice.Activate(InPlayer)GiveNextWeapon으로 돌아와 플레이어의 무기 등급을 올린 후,if WeaponTier >= EliminationsToEndGame인지 확인합니다. 만족한다면 플레이어를 전달하며EndGame을 호출합니다.
if(PlayerTeam := MaybePlayerTeam?, PlayerToGrant := player[MaybePlayerToGrant?], set TeamMap[PlayerTeam][PlayerToGrant] = WeaponTier): Print("Eliminating Player Tier is now {WeaponTier}") if(WeaponTier >= EliminationsToEndGame): EndGame(EliminatingPlayer) -
만족하지 않는다면
GrantedPlayer에서GrantWeapon을 호출합니다.if(WeaponTier >= EliminationsToEndGame): EndGame(EliminatingPlayer) GrantWeapon(MaybePlayerToGrant, WeaponTier) -
완성된
GiveNextWeapon메서드는 다음과 같아야 합니다.GiveNextWeapon(EliminatingPlayer : agent) : void = Print("Finding a player to promote") var WeaponTier : int = 0 var MaybePlayerToGrant : ?agent = option{EliminatingPlayer} # 무기를 지급할 플레이어 var MaybePlayerTeam : ?team = option{GetPlayspace().GetTeamCollection().GetTeam[EliminatingPlayer]} # 이 플레이어가 속한 팀 if(PlayerTeam := MaybePlayerTeam?, set WeaponTier = TeamMap[PlayerTeam][EliminatingPlayer]): for(Teammate -> TeammateTier : TeamMap[PlayerTeam], TeammateTier < WeaponTier): Print("Found a Teammate with a lower Tier at Tier {TeammateTier}") if(set WeaponTier = TeamMap[PlayerTeam][Teammate]): set MaybePlayerToGrant = option{Teammate} set WeaponTier = WeaponTier + 1 if(PlayerTeam := MaybePlayerTeam?, PlayerToGrant := player[MaybePlayerToGrant?], set TeamMap[PlayerTeam][PlayerToGrant] = WeaponTier): Print("Eliminating Player Tier is now {WeaponTier}") if(WeaponTier >= EliminationsToEndGame): EndGame(EliminatingPlayer) GrantWeapon(MaybePlayerToGrant, WeaponTier)
Visual Studio Code로 스크립트를 저장하고, 컴파일하고, UEFN 툴바에서 세션 시작(Launch Session) 을 클릭해 레벨을 플레이테스트합니다. 레벨을 플레이테스트하면 이번에도 WeaponGranters 배열의 첫 번째 무기를 가지고 생성되어야 합니다. 로그를 통해 이 행동을 확인합니다. 적 플레이어의 처치를 달성하면 다음 무기로 승급해야 합니다. 승급 방식은 위에서 설명한 2개의 규칙을 따라야 합니다. 마지막 등급 무기 다음으로 승급하는 경우 처치를 달성한 플레이어가 승리하며 게임이 종료되어야 합니다.

다음 단계
이 튜토리얼의 다음 단계에서는 플레이어가 진행 중인 게임에 참가했을 때 맵에 플레이어를 추가하고 무기를 할당하는 방법을 알아보겠습니다.