Камеры играют ключевую роль во внешнем виде и атмосфере игры. Камеры от третьего лица могут дать игрокам более реальное ощущение пространства, а камеры от первого лица позволяют ближе рассмотреть игровой мир. Переключение камер во время игры может вызывать различные чувства, а переход между разными камерами может разнообразить игровой процесс. Например, вы можете создать забавное платформенное испытание, используя фиксированную камеру для создания секции с боковой прокруткой.
В UEFN вы можете использовать Verse для программирования изменений камеры. Используя устройства для прослушивания событий, вы можете добавить камеру к игроку, чтобы изменить его вид при активации события. В этом примере в конце внутриигрового видео мы добавим к игроку устройство «Вращающаяся камера». Вы можете изменить настройки камеры кругового вращения, чтобы имитировать вид от первого лица, а добавив камеру в конце внутриигрового видео, вы можете создать плавный переход от третьего лица к первому. Чтобы разнообразить игровой процесс, в этом примере игрок берёт оружие и размахивает им у двери, запуская внутриигровое видео. Вы можете адаптировать этот пример к вашим потребностям: например, игрок может вращать гаечный ключ, чтобы починить неисправную дверь корабля, или размахивать молотком, чтобы разбить валун и открыть секретную область. Вы также можете более широко применять эти концепции для создания интересных игровых моментов, таких как широкий план при входе в новую зону, переключение на вид сверху вниз, когда игроку нужно решить головоломку, или вид от первого лица для создания пугающей атмосферы.
Следуйте рекомендации этого руководства, чтобы узнать, как создать устройство Verse, которое переводит игрока от третьего лица к первому с помощью внутриигрового видео при открытии двери.
В данном примере используются следующие возможности языка:
Класс: в этом примере создаётся класс Verse, активирующий внутриигровое видео, когда игрок открывает дверь.
Option: вы можете хранить события, на которые можно подписаться, в переменных типа option, и отменять подписку на эти события в дальнейшем.
В данном примере используются следующие API:
С возможностью подписаться: подписка на события выполняется, чтобы узнавать, когда игрок входит в область рядом с дверью, а также чтобы предоставлять игрокам предмет при взаимодействии с кнопкой.
Подготовка уровня
В данном примере используются следующие устройства:
1 устройство «Кнопка»: при взаимодействии с кнопкой игрок будет получать меч от устройства выдачи предметов.
1 «Устройство выдачи предметов»: устройство выдачи предметов выдаёт игроку меч, необходимый для прохождения через дверь.
1 устройство «Кнопка с условием»: требуемое оружие устанавливается как предмет-ключ для кнопки с условием, в связи с чем игрок не сможет пройти через дверь, если у него не окажется необходимого меча.
1 устройство «Активация при нажатии»: открывает дверь, когда игрок атакует, прослушивая действие ввода атаки. Это происходит только тогда, когда игрок находится внутри устройства области, если у игрока есть меч, а дверь ещё не открыта.
1 устройство «Область»: поскольку дверь не должна открываться при любом триггере атаки мечом, устройство области перед открытием двери будет проверять, что игрок находится непосредственно рядом с дверью.
1 устройство «Последовательность внутриигрового видео»: чтобы обеспечить плавный переход от третьего лица к первому, будет воспроизводиться внутриигровое видео открывающейся двери, при этом положение камеры будет меняться таким образом, чтобы оно совпадало с точкой зрения игрока при виде от первого лица.
1 устройство «Вращающаяся камера»: для создания вида от первого лица будет использоваться вращающаяся камера, расположенная в груди персонажа, что позволит имитировать вид от первого лица. Это изменение вида происходит только после видео, когда игрок открывает дверь.
1 устройство «Замок»: удерживает дверь в запертом состоянии, чтобы игрок не смог открыть её без необходимого оружия.
1 устройство «Указатель на карте»: отображает расположение двери на мини-карте, когда игрок берёт в руки оружие.
Выполните следующие действия, чтобы настроить уровень:
Кнопка и устройство выдачи предметов
Чтобы предоставить игроку оружие, необходимое для открытия двери, вы воспользуетесь устройством выдачи предметов и устройством кнопка. Когда игрок взаимодействует с кнопкой, устройство выдачи предметов предоставляет ему оружие. Чтобы добавить эти элементы, выполните следующие действия:
Добавьте одно устройство выдачи предметов на уровень.
Выберите устройство выдачи предметов в окне Структура. На панели Сведения устройства в разделе Пользовательские настройки задайте следующие значения:
Настройка Значение Пояснение Определение предмета
Меч
Это оружие, которым игрок открывает дверь.
Использовать полученный предмет
Истина
В этом примере игрок берёт оружие и сразу же вооружается им.
Добавьте одно устройство Кнопка на уровень.
Выберите кнопку на панели Структура. На панели Сведения устройства в разделе Пользовательские настройки задайте следующие значения:
Настройка Значение Пояснение Текст при взаимодействии
«Взять»
Этот текст предлагает игроку взаимодействовать с кнопкой.
Количество срабатываний
1-й
В этом примере игрок может взять оружие только один раз.
Активация при нажатии
Чтобы узнать, когда игрок взмахивает оружием, вы можете использовать активацию при нажатии, которая прослушивает определённое действие. Когда игрок взмахивает оружием, происходит активация при нажатии. Выполните следующие шаги, чтобы добавить активацию при нажатии.
Добавьте одно устройство активации при нажатии на уровень.
Выберите активацию при нажатии на панели Структура. На панели Сведения устройства в разделе Пользовательские настройки задайте следующие значения:
Настройка Значение Пояснение Способ ввода
Стандартное действие
Срабатывание — это стандартное действие, которое должна прослушивать активация при нажатии, чтобы узнать, когда игрок взмахивает оружием.
Стандартный ввод
выстрел;
Срабатывание — это действие, которое должна прослушивать активация при нажатии, чтобы узнать, когда игрок взмахивает оружием.
Показывать в интерфейсе
Ложь
Это действие не нужно показывать в интерфейсе.
Область
Чтобы убедиться, что игрок находится рядом с дверью при открытии, вы можете использовать устройство области рядом с дверью, которое проверяет, находится ли игрок внутри неё. Чтобы добавить устройство области, выполните следующие действия.
Добавьте дверь где-нибудь на вашем уровне. Эту дверь игрок будет открывать с помощью оружия.
Добавьте одно устройство Область на уровень. Это устройство области должно перекрывать небольшую область перед дверью или область, которую игрок должен атаковать.
Измените размер устройства «Область», изменив его Графический ориентир преобразования, чтобы он соответствовал области, в которой игрок должен находиться при атаке. Активация при нажатии будет прослушивать событие срабатывания только тогда, когда игрок находится внутри этой области. Поэтому убедитесь, что она соответствует вашим требованиям.
Запереть
Чтобы убедиться, что игрок не сможет открыть дверь до того, как получит оружие, вы можете запереть дверь с помощью устройства замка. Чтобы добавить устройство замка, выполните следующие действия.
Добавьте устройство Замок и закрепите его на двери.
Выберите замок на панели Структура. На панели Сведения, в разделе Пользовательские настройки, для параметра Отображать в игре установите значение false.
Указатель на карте
Когда место, куда игроку нужно добраться, находится далеко от места, где он взял оружие, игрокам полезно показать, куда нужно идти, с помощью указателя на карте. Соответствующее изображение отображается на их карте и мини-карте. При этом можно активировать пульсацию цели с указанием непосредственно на дверь. Чтобы добавить указатель на карте, выполните следующие действия.
Добавьте на уровень устройство Указатель на карте, спрятанное под дверью.
Выберите Указатель на карте на панели Структура. На панели Сведения, в разделе Пользовательские настройки:
Настройка Значение Пояснение Включить в начале игры
ложь
Указатель на карте включается только после того, как игрок берёт оружие.
Маленький значок
Выберите значок
Выберите значок, который хотите отобразить на мини-карте.
Крупный значок
Выберите значок
Выберите значок, который хотите отобразить на карте.
Кнопка с условием для предмета
Чтобы узнать, что игрок взмахивает оружием, которое необходимо, чтобы открыть дверь, вы можете использовать кнопку с условием для предмета. Чтобы добавить такую кнопку, выполните следующие действия.
Добавьте на уровень одно устройство Кнопка с условием для предмета.
Выберите кнопку с условием для предмета на панели Структура. На панели Сведения устройства в разделе Пользовательские настройки задайте следующие значения:
Настройка Значение Пояснение Удалять предметы-ключи
Ложь
Не нужно удалять оружие игрока после открытия двери.
Определение предмета 1: «Предмет-ключ»
Оружие
Это оружие, с помощью которого игрок должен открыть дверь.
Вращающаяся камера
Чтобы симулировать вид от первого лица, вы можете использовать вращающуюся камеру, позволяющую изменить перспективу игрока. Выполните следующие шаги, чтобы добавить вращающуюся камеру.
Добавьте на уровень одно устройство Камера кругового вращения.
Выберите кнопку вращающейся камеры на панели Структура. На панели Сведения, в разделе Камера, задайте следующие значения:
Настройка Значение Пояснение Расстояние
0,0 см
Параметры, необходимые для вида от первого лица
Смещение X
27,0 см
Параметры, необходимые для вида от первого лица
Смещение Y
0,0 см
Параметры, необходимые для вида от первого лица
Смещение Z
76,0 см
Параметры, необходимые для вида от первого лица
Горизонтальная скорость
0,0 см/с
Параметры, необходимые для вида от первого лица
На панели Сведения, в разделе Переход, задайте следующие значения:
Настройка Значение Пояснение Время приближения
0,0 с
Параметры, необходимые для вида от первого лица
Время отдаления
0,1 с
Параметры, необходимые для вида от первого лица
Тип отдаления
Медленное отдаление
Параметры, необходимые для вида от первого лица
Внутриигровое видео
Чтобы запустить видео при открытии двери, вам понадобится устройство последовательности внутриигрового видео. Чтобы добавить последовательность внутриигрового видео, выполните следующие действия.
Добавьте на уровень устройство Последовательность внутриигрового видео.
В Каталоге ресурсов создайте последовательность внутриигрового видео, которую хотите использовать на уровне. В последовательности внутриигрового видео используется камера вращения, которую вы установили ранее. Она должна показывать открытие двери при переходе камеры от первоначального ракурса к виду от первого лица. Дополнительная информация о создании собственных последовательностей внутриигрового видео приведена в разделе «Создание видеороликов и заставок».
На панели Структура выберите последовательность внутриигрового видео. Затем на панели Сведения, в разделе Пользовательские настройки, присвойте для Последовательности вашу последовательность внутриигрового видео.
Нажмите на изображение, чтобы увеличить его.
Внутриигровое видео открытия двери с использованием Verse
Для обработки логики воспроизведения видео и открытия двери будет использоваться устройство Verse. Это устройство прослушивает событие взмаха оружием внутри устройства области, затем воспроизводит последовательность внутриигрового видео, открывает дверь и переводит игрока в режим от первого лица.
Настройка полей
Чтобы создать устройство Verse:
Создайте новое устройство Verse с помощью проводника Verse и назовите его
door_open_cinematic_manager.Над определением класса
door_open_cinematic_managerдобавьте канал записи для вывода в журнал сообщений, относящихся к этому устройству. Затем добавьте диспетчер журналов в определение класса для использования с каналом записи в журнал.Versedoor_open_channel := class(log_channel){} # A Verse-authored creative device that can be placed in a level door_open_cinematic_manager := class(creative_device): Logger:log = log{Channel := door_open_channel}Добавьте следующие поля в определение класса
door_open_cinematic_manager:Редактируемое устройство области под названием
DoorVolume. Это область, внутри которой должен находиться игрок, чтобы открыть дверь.Verse# The volume the player needs to be inside of to open the door. @editable DoorVolume:volume_device = volume_device{}Редактируемое устройство активации при нажатии с названием
FireTrigger. Оно прослушивает использование игроком своего оружия внутриDoorVolume.Verse# The input trigger that listens for the player swinging their weapon # when inside the DoorVolume. @editable FireTrigger:input_trigger_device = input_trigger_device{}Редактируемое устройство «Кнопка с условием» с названием
ConditionalButton. Оно проверяет, есть ли у игрока правильное оружие, когда он находится внутри устройства области.Verse# The Conditional Item Button that checks that the player has the correct weapon. @editable ConditionalButton:conditional_button_device = conditional_button_device{}Редактируемое устройство «Замок» с названием
DoorLock. Оно позволит держать дверь запертой, если у игрока нет подходящего оружия.Verse# The lock device that prevents the door from being opened. @editable Door:lock_device = lock_device{}Редактируемое устройство «Последовательность внутриигрового видео» с названием
CinematicSequence. Оно воспроизводит видео, ведущее к переходу камеры при открытии двери.Verse# The cinematic sequence device that plays the cinematic when opening the door. @editable CinematicSequence:cinematic_sequence_device = cinematic_sequence_device{}Редактируемое устройство «Указатель на карте» с названием
ObjectiveMarker. Оно отображает расположение двери на мини-карте, когда игрок берёт в руки оружие.Verse# The map indicator device that shows the location of the door. @editable ObjectiveMarker:map_indicator_device = map_indicator_device{}Редактируемое устройство выдачи предметов с названием
ItemGranter. Даёт игроку оружие, необходимое для продвижения.Verse# The item granter device that grants the player the weapon they need. @editable ItemGranter:item_granter_device = item_granter_device{}Редактируемое устройство «Кнопка» с названием
ItemGrantButton. АктивируетItemGranter, чтобы выдать игроку необходимое оружие.Verse# The button that activates the ItemGranter granter. @editable ItemGrantButton:button_device = button_device{}Редактируемое устройство «Вращающаяся камера» с названием
FPSCamera. Симулирует вид от первого лица и добавляется к игроку после окончания видео.Verse# The orbit camera that simulates a first-person view. @editable FPSCamera:gameplay_camera_orbit_device = gameplay_camera_orbit_device{}Переменная
logicс названиемIsDoorOpen. Это поле отслеживает, открыта ли дверь. Если открыта, последовательность не воспроизводится.Verse# A variable that tracks whether the door is already open. var IsDoorOpen:logic = falseОтменяемаяпеременнаяoptionс названиемFireSubscription. Хранит подписку наPressedEventдляFireTrigger. Эта последовательность внутриигрового видео должна срабатывать только тогда, когда игрок находится рядом с дверью. Эта отменяемая подписка гарантируетотпискуигрока отFireTrigger, если тот уйдёт слишком далеко.Verse# A cancelable subscription to the FireTrigger device. var FireSubscription:?cancelable = false
Воспроизведение внутриигрового видео
Когда дверь открывается, воспроизводится внутриигровое видео, которое показывает открытие двери и меняет вид игрока от третьего лица к первому. Выполните следующие действия, чтобы активировать внутриигровое видео, когда игрок открывает дверь.
Добавьте новый метод
PlayCinematic()к определению классаdoor_open_cinematic_manager. Добавьте новый методPlayCinematic()к определению классаdoor_open_cinematic_manager. Эта функция действует на игроке, открывающем дверь. Затем она воспроизводит внутриигровое видео и открывает дверь с помощью устройства замка.Verse# Plays a cinematic and unlocks the door. PlayCinematic(Agent:agent):void=В
PlayCinematic()сначала воспроизводим внутриигровое видео изCinematicSequence, затем снимаем замок, после чего дверь открывается с помощьюUnlock()иOpen()соответственно.Verse# Plays a cinematic and unlocks the door. PlayCinematic(Agent:agent)<suspends>:void= Logger.Print("Player is holding item, playing cinematic...") CinematicSequence.Play() # Unlock the door, then open it. Door.Unlock(Agent) Door.Open(Agent)Наконец, измените для игрока вид от третьего лица на вид от первого, добавив к нему камеру вращения с помощью
AddTo(), затем отключите маркер цели. Готовая функцияPlayCinematic()должна выглядеть следующим образом:Verse# Plays a cinematic and unlocks the door. PlayCinematic(Agent:agent)<suspends>:void= Logger.Print("Player is holding item, playing cinematic...") CinematicSequence.Play() # Unlock the door, then open it. Door.Unlock(Agent) Door.Open(Agent) set IsDoorOpen = trueВнутриигровое видео должно воспроизводиться только тогда, когда игрок держит нужный предмет, и не должно воспроизводиться вновь, если дверь уже открыта. Чтобы обработать эту логику, добавьте новый метод
CheckCinematic()к определению классаdoor_open_cinematic_manager. Эта функция принимает игрока вDoorVolumeи проверяет, есть ли у него необходимые предметы.Verse# Check if the player has the required item and the door isn't already open. CheckCinematic(Agent:agent):void=В
CheckCinematic()проверьте, держит ли игрок предмет, зарегистрированный вConditionalButtonс помощьюIsHoldingItem[]. Также проверьте, имеет лиIsDoorOpenзначение false, чтобы убедиться, что дверь ещё не открыта. Если это так, используйтеspawn{}для создания функцииPlayCinematic(), передающей игрока, открывающего дверь. Готовая функцияCheckCinematic()должна выглядеть следующим образом:Verse# Check if the player has the required item and the door isn't already open. CheckCinematic(Agent:agent):void= if: ConditionalButton.IsHoldingItem[Agent] and not IsDoorOpen? then: spawn{PlayCinematic(Agent)}
Отслеживание игрока и выдача предметов
Поскольку игроку необходимо взмахивать оружием, находясь внутри DoorVolume, чтобы открыть дверь, устройство активации при нажатии должно прослушивать это событие. Выполните следующие действия, чтобы активация при нажатии прослушивала, когда игрок взмахнёт оружием.
Добавьте новый метод
OnPlayerEntersVolume()к определению классаdoor_open_cinematic_manager. Эта функция принимает агента и регистрирует его с помощьюFireTrigger, когда он входит вDoorVolume.Verse# Registers the Agent with the FireTrigger when they enter the DoorVolume. OnPlayerEntersVolume(Agent:agent):void= Logger.Print("Agent entered DoorVolume")В
OnPlayerEntersVolume()зарегистрируйте агента сFireTrigger, вызвавRegister(). Затем установите дляFireSubscriptionрезультат подпискиFireTrigger.PressedEventнаPlayCinematic(). Готовая функцияOnPlayerEntersVolume()должна выглядеть следующим образом:Verse# Registers the Agent with the FireTrigger when they enter the DoorVolume. OnPlayerEntersVolume(Agent:agent):void= Logger.Print("Agent entered DoorVolume") FireTrigger.Register(Agent) # Subscribe the PressedEvent to PlayCinematic, and store that subscription in FireSubscrition. set FireSubscription = option{(FireTrigger.PressedEvent.Subscribe(PlayCinematic))}Когда игрок выходит из
DoorVolume, вам необходимо прекратить отслеживание подписки наFireTrigger.PressedEvent, поскольку игрок должен быть в состоянии активировать внутриигровое видео только в том случае, если он не находится внутри области. Чтобы обработать эту логику, добавьте новый методOnPlayerExitsVolume()к определению классаdoor_open_cinematic_manager.Verse# Unregister the Agent with the FireTrigger when they leave the DoorVolume. OnPlayerExitsVolume(Agent:agent):void=В
OnPlayerExitsVolume()сначала отмените регистрацию агента с помощьюUnregister()дляFireTrigger. Затем получите подписку внутриFireSubscriptionи отмените её. Готовый методOnPlayerExitsVolume()должен выглядеть следующим образом:Verse# Unregister the Agent with the FireTrigger when they leave the DoorVolume. OnPlayerExitsVolume(Agent:agent):void= Logger.Print("Agent exited DoorVolume") FireTrigger.Unregister(Agent) # Cancel the subscription to the FireSubscription. if (SubscriptionToCancel := FireSubscription?): SubscriptionToCancel.Cancel()Когда игрок взаимодействует с
ItemButton, ему выдаётся оружие, необходимое для продвижения. На мини-карте также появляется маркер цели, который показывает путь к двери, если игрок ещё не нашёл её. Чтобы обработать эту логику, добавьте к определению классаdoor_open_cinematic_managerновый методGrantItem(), который будет приниматьагента. ВнутриGrantItem()вызовитеGrantItemдля переданного агента и включите маркер цели. Готовый методGrantItem()должен выглядеть следующим образом:Verse# Grants the Agent an item when they interact with the ItemGrantButton # and enables the ObjectiveMarker. GrantItem(Agent:agent):void= ItemGranter.GrantItem(Agent) ObjectiveMarker.Enable()
Связывание всех элементов
Теперь вы можете подписать каждое событие на функцию, связанную с ним, и протестировать свой код в игре.
В
OnBegin()подпишите событиеItemGrantButton.InteractedWithEventна функциюGrantItem(). Затем подпишитеDoorVolume.AgentEntersEventиDoorVolume.AgentExitsEventна связанные с ними функции. Ваша функцияOnBegin()должна выглядеть следующим образом:Verse# Runs when the device is started in a running game OnBegin<override>()<suspends>:void= # Subscribe each event to its associated function. ItemGrantButton.InteractedWithEvent.Subscribe(GrantItem) DoorVolume.AgentEntersEvent.Subscribe(OnPlayerEntersVolume) DoorVolume.AgentExitsEvent.Subscribe(OnPlayerExitsVolume)Сохраните свой код и скомпилируйте его.
В UEFN выберите устройство DoorOpenCinematicManager на своём уровне. На панели Структура назначьте каждую редактируемую ссылку устройству на уровне.
Нажмите на изображение, чтобы увеличить его.
Нажмите Запустить сеанс на панели инструментов UEFN, чтобы выполнить игровой тест уровня. При игровом тестировании уровня взаимодействие с кнопкой предмета должно предоставлять игроку необходимое оружие и добавлять маркер цели на его мини-карту. Когда игрок использует оружие внутри области двери, должно запуститься внутриигровое видео, дверь должна открыться, а игрок должен перейти в вид от первого лица.
Полный код
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
# See https://dev.epicgames.com/documentation/en-us/uefn/create-your-own-device-in-verse for how to create a verse device.
door_open_log := class(log_channel){}
door_open_cinematic_manager := class(creative_device):
Logger:log = log{Channel := door_open_log}
Самостоятельная работа
Изучив это руководство, вы узнали, как использовать Verse для воспроизведения видео, когда игрок открывает дверь, и как перейти от камеры от третьего лица к камере от первого лица.
Используя полученные знания, попробуйте выполнить следующее:
Можете ли вы выполнить другие типы перехода камеры, например переход к виду для сайд-скроллера?
А как насчёт специальной кнопки для изменения угла камеры? Сможете разработать уровень, для прохождения которого потребуется несколько ракурсов камеры?
Можете ли использовать активацию при нажатии для отрицательных штрафов, например, предлагая игрокам пройти через какой-либо участок без прыжков, и воспроизводить видео, если им не будет удаваться это сделать?