В этой игре с тремя командами команда захватчиков играет уникальную роль. Захватчики действуют скрытно и начинают игру невидимыми. Они появляются с винтовкой со скользящим затвором, наносящей большой урон, и могут устранять соперников из укрытия, пробираясь к базе защитников. Захватчики не всегда невидимы: если по ним нанести удар, режим невидимки временно деактивируется и они начинают мерцать.
В этом уроке вы также узнаете, как активировать мерцание одного или всех захватчиков в команде, если одному из них нанесён урон. Мерцание всей команды создаёт для захватчиков серьёзные проблемы, однако это стимул для того, чтобы играть осторожней.
Ниже приведён порядок настройки режима невидимости для захватчиков при появлении.
Создание диспетчера невидимости
Создайте новое устройство Verse с именем invisibility_manager с помощью Проводника Verse и перетащите его на уровень.
В начале файла
invisibility_managerдобавьте строкуusing { /Fortnite.com/Characters }, чтобы получитьfort_character, соответствующий игроку.using { /Fortnite.com/Devices } using { /Fortnite.com/Characters } using { /Verse.org/Simulation } using { /UnrealEngine.com/Temporary/Diagnostics }В определении класса
invisibility_managerдобавьте следующие поля:Редактируемый массив точек появления игроков
PlayerSpawners. Он позволит отслеживать точки появления игроков для захватчиков и будет использоваться для того, чтобы делать захватчиков невидимыми при появлении.invisibility_manager := class(creative_device): Logger:log = log{Channel := triad_invisibility_log_channel} # Массив точек появления игроков для команды захватчиков @editable PlayersSpawners:[]player_spawner_device = array{}Редактируемая логическая переменная
IsVisibilityShared. Определяет, должны ли при нанесении урона одному из захватчиков мерцать все захватчики или же должен мерцать только захватчик, получивший урон.# Массив точек появления игроков для команды захватчиков @editable PlayersSpawners:[]player_spawner_device = array{} # Распространяется ли видимость захватчика на других участников команды. @editable IsVisibilityShared:logic = trueРедактируемые числа с плавающей запятой
VulnerableSecondsиFlickerRateSeconds. Первое определяет продолжительность мерцания захватчиков после получения урона, а второе — периодичность воспроизведения анимации мерцания.# Распространяется ли видимость захватчика на других участников команды. @editable IsVisibilityShared:logic = true # Как долго захватчики остаются видимыми после получения урона. @editable VulnerableSeconds:float = 3.0 # Как часто захватчики мерцают при получении урона. @editable FlickerRateSeconds:float = 0.4Массив переменных типа team с именем
Teams. Он пригодится, чтобы проверить, является ли игрок захватчиком.# Как часто захватчики мерцают при получении урона. @editable FlickerRateSeconds:float = 0.4 # Массив всех команд в игре. var Teams:[]team = array{}Ассоциативный массив переменных
PlayerVisibilitySeconds, связывающийagentсо значением типаfloat. Сопоставляет отдельные агенты с оставшимся временем мерцания в секундах после получения урона игроком.var Teams:[]team = array{} # Массив всех команд в игре. var Teams:[]team = array{} # Ассоциативный массив, содержащий оставшееся время мерцания в секундах для каждого игрока. var PlayerVisibilitySeconds:[agent]float = map{}
Добавьте в
OnBegin()оператор записи в журнал, чтобы проверить, что устройство запустилось. Нужно обеспечить запускinvisibility_managerпосле распределения игроков по командам с помощью сценарияtriad_infiltration_game, чтобы не сделать невидимыми игроков из неподходящих команд. Для этого нужно запускатьinvisibility_managerизtriad_infiltration_game, а не включать этот код вOnBegin().OnBegin<override>()<suspends>:void= # Ждать, пока состав команд выровняется, чтобы подписаться на события, которые делают игроков невидимыми. Logger.Print("Ожидаем завершения выравнивания состава команд…")Добавьте новый метод
OnPlayerSpawn()в определении классаinvisibility_manager. Необходимо, чтобы захватчики становились невидимыми всякий раз, когда они появляются, поэтому сначала нужно вызвать эту функцию.Verse# Handles a player spawning from an infiltrator spawn pad OnPlayerSpawn(SpawnedAgent:agent):void= Logger.Print("A player just spawned from an infiltrator spawn pad!")В функции
OnPlayerSpawn()получитеfort_character, связанный с появившимся агентом, с помощьюGetFortCharacter[]и сохраните его в переменнойFortCharacter. Также нужно получить команду появившегося агента с помощьюGetTeam[]и сохранить её в переменнойCurrentTeam.Verse# Handles a player spawning from an infiltrator spawn pad OnPlayerSpawn(SpawnedAgent:agent):void= Logger.Print("A player just spawned from an infiltrator spawn pad!") if: FortCharacter:fort_character = SpawnedAgent.GetFortCharacter[] CurrentTeam := GetPlayspace().GetTeamCollection().GetTeam[SpawnedAgent]Проверьте, совпадает ли
CurrentTeamс первой командой в массивеTeams(командой захватчиков). Если да, то этот агент является захватчиком и вы можете вызватьHide()дляFortCharacterэтого агента. Это позволит сделать агент невидимым при появлении. Ваша функцияOnPlayerSpawn()должна выглядеть следующим образом:Verse# Handles a player spawning from an infiltrator spawn pad OnPlayerSpawn(SpawnedAgent:agent):void= Logger.Print("A player just spawned from an infiltrator spawn pad!") if: FortCharacter:fort_character = SpawnedAgent.GetFortCharacter[] CurrentTeam := GetPlayspace().GetTeamCollection().GetTeam[SpawnedAgent] Teams[0] = CurrentTeam Logger.Print("Player spawned as an infiltrator, making them invisible") then: FortCharacter.Hide()
Добавьте новый метод
StartInvisibilityManager()в определении классаinvisibility_manager. Эта функция принимает массив командAllTeamsтипа team, массив игроковAllPlayersтипа player и ссылку на команду захватчиков типаteam. Вы будете вызывать её из сценарияtriad_infiltration_game, чтобы запустить логикуinvisibility_manager, поэтому эта функция должна иметь спецификатор<public>, чтобыtriad_infiltration_gameмог к ней обращаться.# Запускает логику диспетчера невидимости. Вызывается из класса triad_infiltration после завершения выравнивания состава команд StartInvisibilityManager<public>(AllTeams:[]team, AllPlayers:[]player, Infiltrators:team):void= Logger.Print("Сценарий установки невидимости запущен!")В
StartInvisibilityManager():Присвойте массиву
Teamsзначение массиваAllTeams.# Запускает логику диспетчера невидимости. Вызывается из класса triad_infiltration после завершения выравнивания состава команд StartInvisibilityManager<public>(AllTeams:[]team, Players:[]player, Infiltrators:team):void= Logger.Print("Сценарий установки невидимости запущен!") set Teams = AllTeamsВ цикле
forподпишите каждую точку появления игрока вPlayerSpawnersна функциюOnPlayerSpawn().for(PlayerSpawner:PlayersSpawners): PlayerSpawner.SpawnedEvent.Subscribe(OnPlayerSpawn)В момент запуска сценария нужно найти всех захватчиков и сделать их невидимыми. Также нужно создать для них запись в ассоциативном массиве
PlayerVisibilitySeconds. Она пригодится позже для отслеживания продолжительности мерцания каждого захватчика, получившего урон. Точно так же, как в случае сOnPlayerSpawn(), получитеfort_characterиteamдля каждого игрока.Versefor(PlayerSpawner:PlayersSpawners): PlayerSpawner.SpawnedEvent.Subscribe(OnPlayerSpawn) # For each player, if they spawned on the infiltrator team, spawn an OnInfiltratorDamaged function for that # player. Then make their character invisible. for(TeamPlayer:AllPlayers): if: FortCharacter:fort_character = TeamPlayer.GetFortCharacter[] CurrentTeam := GetPlayspace().GetTeamCollection().GetTeam[TeamPlayer]Проверьте, совпадает ли
CurrentTeamс командойInfiltrators, которую вы передали в эту функцию. Если да, задайте для ключа игрока вPlayerVisibilitySecondsзначение0.0.Versefor(TeamPlayer:AllPlayers): if: FortCharacter:fort_character = TeamPlayer.GetFortCharacter[] CurrentTeam := GetPlayspace().GetTeamCollection().GetTeam[TeamPlayer] Logger.Print("Got this player's current team") Infiltrators = CurrentTeam set PlayerVisibilitySeconds[TeamPlayer] = 0.0 Logger.Print("Added player to PlayerVisibilitySeconds")Наконец, сделайте игрока невидимым, вызвав
Hide()дляFortCharacterигрока.StartInvisibilityManagerдолжен выглядеть следующим образом:Verse# Starts the invisibility manager logic. Called from triad_infiltration class after team balancing finishes StartInvisibilityManager<public>(AllTeams:[]team, Players:[]player, Infiltrators:team):void= Logger.Print("Invisibility script started!") set Teams = AllTeams for(PlayerSpawner:PlayersSpawners): PlayerSpawner.SpawnedEvent.Subscribe(OnPlayerSpawn) # For each player, if they spawned on the infiltrator team, spawn an OnInfiltratorDamaged function for that # player. Then make their character invisible. for(TeamPlayer:AllPlayers):
Вызов диспетчера невидимости в игре «Меж двух огней»
Вернитесь в
triad_infiltration_gameи добавьте редактируемое полеinvisibility_managerв определении класса. Так вы создадите устройство на уровне, которое будет вызывать устройствоtriad_infiltration_game.# Ссылка на сценарий invisibility_manager, управляющий невидимостью захватчиков. @editable InvisibilityManager:invisibility_manager = invisibility_manager{}В функции
OnBegin()после вызоваBalanceTeams()вызовитеStartInvisibilityManager(), передавTeams,AllPlayersиInfiltrators. Ваша функцияOnBegin()должна выглядеть следующим образом:VerseOnBegin<override>()<suspends>:void = # Get all the Teams set Teams = GetPlayspace().GetTeamCollection().GetTeams() # Save the teams to later reference them set MaybeInfiltrators = option{Teams[0]} set MaybeAttackers = option{Teams[1]} set MaybeDefenders = option{Teams[2]} if: Infiltrators := MaybeInfiltrators?Сохраните файлы и скомпилируйте их. Выберите устройство на панели Структура и включите все точки появления захватчиков в массив PlayerSpawners.
Выберите устройство triad_infiltration_game на панели Структура и выберите устройство invisibility_manager в свойстве InvisibilityManager.
Нажмите Запустить сеанс на панели инструментов UEFN, чтобы выполнить игровой тест уровня.
Во время игрового теста уровня каждый игрок должен попасть в команду с наибольшей разницей и появиться с оружием, соответствующим его команде. Каждый захватчик должен быть невидимым как в начале игры, так и в момент возрождения.
Следующий шаг
В следующем шаге этого руководства вы узнаете, как сделать так, чтобы персонаж захватчика мерцал при получении урона.