Когда к игре присоединяется новый игрок, его нужно назначить в подходящую команду исходя из требуемого ассиметричного распределения. Если будет выбрана команда захватчиков, игрок должен получить собственный экземпляр OnInfiltratorDamaged().
Следуйте инструкциям ниже, чтобы узнать, как распределять присоединяющихся к игре игроков по командам.
Настройка функций присоединения игрока
- Добавьте новую функцию
OnInfiltratorJoined()в определении классаinvisibility_manager. Эта функция принимает агент и создаёт экземплярOnInfiltratorDamaged()для указанного агента. Добавьте к ней спецификатор<public>, поскольку вы будете вызывать её изtriad_infiltration_game.# Создаёт экземпляр функции OnInfiltratorDamaged, когда к игре присоединяется новый захватчик OnInfiltratorJoined<public>(InAgent:agent):void= spawn{OnInfiltratorDamaged(InAgent)} - В определении класса
triad_infiltration_gameдобавьте новую функциюOnPlayerAdded(). Эта функция принимает игрока, определяет его в нужную команду и вызываетOnInfiltratorJoined(), если новый игрок — захватчик.# Обрабатывает запрос на присоединение нового игрока. OnPlayerAdded(InPlayer:player):void= - Получите набор команд
fort_team_collectionв текущем игровом пространстве и сохраните его в переменнойFortTeamCollection.# Обрабатывает запрос на присоединение нового игрока. OnPlayerAdded(InPlayer:player):void= Logger.Print("Присоединился новый игрок. Распределяем его в команду") FortTeamCollection := GetPlayspace().GetTeamCollection()Реструктуризация состава команд
- Вам нужно включить нового игрока в соответствующую команду, однако если вы вызовете функцию
BalanceTeams(), получится так, что вы перераспределите по новым командам всех игроков. Вместо того чтобы переписывать код поиска самой маленькой команды для нового игрока и включения его в эту команду, выполните реструктуризацию.- В определении класса
triad_infiltration_gameдобавьте новый методBalancePlayer(). Этот метод принимает игрока и ассиметрично распределяет его в нужную команду.# Для каждого игрока пройтись по списку команд и назначить игроков в # самую маленькую команду или оставить их в первоначальных командах, если у команд равный состав. BalancePlayer(InPlayer:player):void= Logger.Print("Начинаем распределять игроков") - Скопируйте код из цикла
forв функцииBalanceTeams()и поместите его вBalancePlayer(), переименовавTeamPlayerвInPlayer. Ваш кодBalancePlayer()должен выглядеть следующим образом:# Для каждого игрока пройтись по списку команд и назначить игроков в # самую маленькую команду или оставить их в первоначальных командах, если у команд равный состав. BalancePlayer(InPlayer:player):void= Logger.Print("Начинаем распределять игроков") var TeamToAssign:?team = false set TeamToAssign = FindTeamWithLargestDifference() if (AssignedTeam := TeamToAssign?, GetPlayspace().GetTeamCollection().AddToTeam[InPlayer, AssignedTeam]): Logger.Print("Пытаемся распределить нового игрока в новую команду") else: Logger.Print("Этот игрок уже был в самой маленькой команде") - Затем в
BalanceTeams()добавьте вызовBalancePlayer()внутри циклаfor. Это позволит сохранить функциональностьBalanceTeams()и распределить нового игрока, не затрагивая других игроков. Ваш кодBalanceTeams()должен выглядеть следующим образом:# Распределить всех игроков по всем командам в игре BalanceTeams():void= Logger.Print("Начинаем выравнивать состав команд") var AllPlayers:[]player := GetPlayspace().GetPlayers() set AllPlayers = Shuffle(AllPlayers) Logger.Print("Длина AllPlayers составляет {AllPlayers.Length}") for (TeamPlayer:AllPlayers): BalancePlayer(TeamPlayer)
- В определении класса
- Вернитесь в
OnPlayerAdded()и добавьте вызовBalancePlayer(), передав вновь присоединившегося игрока.# Обрабатывает запрос на присоединение нового игрока. OnPlayerAdded(InPlayer:player):void= Logger.Print("Присоединился новый игрок. Распределяем его в команду") FortTeamCollection := GetPlayspace().GetTeamCollection() set AllPlayers = GetPlayspace().GetPlayers() # Распределить нового игрока в команду с наименьшим количеством игроков BalancePlayer(InPlayer) - Найдите индекс команды игрока после распределения, перебрав все команды в массиве
Teamsи используяGetTeam[]в качестве фильтра, чтобы проверить, что команда соответствуетPlayerTeam.# Обрабатывает запрос на присоединение нового игрока. OnPlayerAdded(InPlayer:player):void= Logger.Print("Присоединился новый игрок. Распределяем его в команду") 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("Появившийся игрок телепортирован в начальную точку") - Наконец, проверьте, не является ли присоединившийся игрок захватчиком, сравнив его команду с переменной
Infiltratorsтипа option, определённой ранее. Если он захватчик, вызовитеOnInfiltratorJoined()из классаinvisibility_managerдля нового игрока, чтобы он начал мерцать. Ваш кодOnPlayerAdded()должен выглядеть следующим образом:# Обрабатывает запрос на присоединение нового игрока. OnPlayerAdded(InPlayer:player):void= Logger.Print("Присоединился новый игрок. Распределяем его в команду") 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("Появившийся игрок телепортирован в начальную точку") # Если игрок был захватчиком, вызвать OnInfiltratorJoined в # InvisibilityManager. if(PlayerTeam = MaybeInfiltrators?): InvisibilityManager.OnInfiltratorJoined(InPlayer) - Сохраните сценарий, скомпилируйте его и нажмите Запуск сеанса на панели инструментов UEFN, чтобы выполнить игровой тест уровня. Во время игрового теста уровня игроки, присоединяющиеся во время игры, должны попасть в соответствующие команды. Если присоединившийся игрок окажется захватчиком, он должен быть невидимым в момент появления и мерцать при получении урона.
Что дальше
Дальше вы узнаете, как создать визуальный индикатор игрока, захватившего цель.