Когда к игре присоединяется новый игрок, его нужно назначить в подходящую команду исходя из требуемого ассиметричного распределения. Если будет выбрана команда захватчиков, игрок должен получить собственный экземпляр 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, чтобы выполнить игровой тест уровня. Во время игрового теста уровня игроки, присоединяющиеся во время игры, должны попасть в соответствующие команды. Если присоединившийся игрок окажется захватчиком, он должен быть невидимым в момент появления и мерцать при получении урона.
Что дальше
Дальше вы узнаете, как создать визуальный индикатор игрока, захватившего цель.