Этот урок дополняет Шаблон для стендап-шоу на Verse, в котором демонстрируется, как использовать устройства, поддерживающие социальное взаимодействие и кинематографичность во время представления в комедийном клубе:
Использование детализированных ресурсов аниматора персонажей MetaHuman с Устройствами персонажей
Запуск событий игрового процесса по привязкам ввода от игрока с помощью Устройств «Активация при нажатии»
Фиксирование положения игрока в одном месте для просмотра с помощью Устройства «Стул»
Устройство Verse используется для запуска шоу: основные концепции и код Verse представлены ниже.
Шаблон «Комедия» на Verse находится в разделе Демонстрация возможностей в UEFN (Unreal Editor для Fortnite).
Используемые устройства:
Концепции Verse, используемые в этом уроке:
Подписки
Условный оператор If
Массивы
Последовательности внутриигрового видео
API устройства «Стул»
API устройства «Активация при нажатии»
Важно понимать, что большинство изменённых настроек для взаимодействия устройств выполняется с помощью кода Verse, так что изменённые пользовательские настройки для большинства устройств будут отображаться в сокращённом виде.
Параметры острова
Здесь представлены изменённые настройки острова для шаблона стендап-шоу на Verse:
| option | Значение | Пояснение |
|---|---|---|
Макс. кол-во игроков | 1 | Это одиночный режим. |
Размер команды | 1 | Требуется только одна команда. |
Выполняется подключение | Наблюдать | Игроки перейдут в режим наблюдения, если присоединятся к уже начавшейся игре. |
После последнего появления перейти к | Индекс команды: 1 | Игроки будут возрождаться в своей команде. |
Голосовой чат | Все | Игроки могут общаться в голосовом чате. |
Начинать с кирки | False | Игроки не будут начинать игру с киркой. |
Разрешить наблюдение за другими командами | Запрещено | Игроки не могут наблюдать за другой командой. |
Ограничение по времени | 120 | Ограничение по времени составляет два часа. |
Скрыть украшение на спину | True | Украшение на спину на этом острове не будет отображаться. |
Разрешить лазанье/перепрыгивание | False | Игроки не смогут лазать и перепрыгивать. |
Расход энергии за секунду спринта | 2,0 | Расход энергии при спринте. |
Неуязвимость | True | Игроки неуязвимы. |
Разрешить строительство | Отсутствует | Игроки не могут строить. |
Постройки могут разрушать окружение | False | Постройки не смогут разрушать окружение. |
Урон окружению | Выкл. | Игроки не могут наносить урон элементам окружения. |
Бесконечные строительные материалы | False | Строительство в этом режиме отключено. |
Время суток | 0:00 | Настройка ночного времени. |
Яркость света | 0 | Все источники света в этом режиме являются лампами. |
Плотность тумана | 30 % | Пространство немного затуманено. |
Цвет тумана | Синий | Определяет цвет тумана. |
Пользовательское сообщение на экране победы | Спасибо, что пришли на шоу «Смехофабрика» | То, что игроки видят после окончания игры. |
Отображать сообщения об устранениях | False | Устранения не отображаются. |
Отображение количество древесины/камня/металла | False | Ресурсы не отображаются. |
Отображать счётчик устранений группы | False | Устранения группы не отображаются. |
Отладка | True | Функции отладки включены. |
Режим быстрой итерации | True | Быстрая итерация между фазами редактирования и игры включена. |
Стул
Когда игрок заходит в комедийный клуб, то видит стул перед освещённой сценой. Ему предлагается сесть на него. Сев на стул, игрок там и остаётся, после чего запускается череда событий, которые он будет наблюдать на протяжении всего вечера.
Здесь находятся изменённые Пользовательские настройки устройства «Стул»:
| option | Значение | Пояснение |
|---|---|---|
Модель стула | Пользовательские настройки | В этом режиме стул сначала становится невидимым, а потом заменяется на объект «Стул» из Fortnite, чтобы больше подходить для обстановки клуба. |
Угол взаимодействия | 180 градусов | Определяет угол, направленный в любую сторону от передней стороны стула, под которым требуется взаимодействие с ним. |
Радиус взаимодействия | 1,2 м | Определяет, на каком расстоянии от стула игрок может с ним взаимодействовать. |
Устройства «Активация при нажатии»
Устройство «Активация при нажатии» непосредственно связано с устройством «Стул». Оно связывает команды, поступающие от игрока, с самыми разными действиями, которые запускаются каждый раз, когда игрок нажимает на переназначаемую кнопку. Устройства «Активация при нажатии» настраиваются так, чтобы игрок мог изменять ракурсы камеры в ходе представления.
В устройстве предусмотрено двенадцать вариантов ввода. Выбрав один из вариантов, вы можете добавить описание HUD-интерфейса, чтобы было понятно, для чего используется ввод.
Ниже вы найдёте Пользовательские настройки для этого устройства. Каждое из устройств получит свою привязку и описание HUD-интерфейса, так как они связаны со своими отдельными устройствами «Последовательность внутриигрового видео».
| option | Значение | Пояснение |
|---|---|---|
Творческий режим: ввод | Пользовательское действие 5 (спринт) | Определяет, на какой ввод будет реагировать это устройство. |
Описание интерфейса | «Предыдущая камера» | Возможность описать для игрока назначение нового ввода. |
Поведение зарегистрированного игрока | Требовать регистрацию |
|
Устройства «Персонаж»
Устройства персонажей дают возможность напрямую взаимодействовать с игроком или другими персонажами в сцене. Этот шаблон использует четырёх персонажей, которые сменяют друг друга при выходе на сцену.
Здесь находятся изменённые Пользовательские настройки устройства «Персонаж»:
| option | Значение | Пояснение |
|---|---|---|
Персонаж | Выберите персонажа | Определяет, какой персонаж будет отображаться. |
Бездействие (пользовательские настройки) | При сидении | Выбирает индивидуальное положение бездействия для персонажа. |
Случайная исходная позиция бездействия | True | Определяет, должно ли бездействие начинаться со случайной позиции. |
Главный персонаж сидит на ступеньках за кулисами, а остальные персонажи ожидают в небольшой комнате сзади.
Поэкспериментируйте с различными образами с помощью выпадающего меню Персонаж, чтобы оценить, как они выглядят на сцене!
Этот шаблон использует импортированные анимации MetaHuman. Подробнее о том, как эта анимация записывалась и импортировалась, можно узнать на странице Импорт анимаций MetaHuman.
Устройства «Последовательность внутриигрового видео»
Шесть устройств «Внутриигровое видео» позволяют игроку смотреть шоу под разными углами, сидя на устройстве «Стул».
Процесс создания последовательностей внутриигрового видео на этой странице подробно не рассматривается. Дополнительная информация приведена на странице Sequencer и Регулятор каркаса. Более подробно об этом можно узнать в разделе Как создавать фильмы в Unreal Engine.
Это устройство изменяется только за счёт загрузки последовательности внутриигрового видео.
Как шоу работает на Verse
Этот шаблон использует Verse для запуска шоу в момент, когда игрок садится на устройство «Стул», а также для переключения его камеры на кинематографический просмотр, который называется ТВ-режим. Кроме того, он позволяет игроку для разнообразия переключаться между несколькими камерами и возвращаться в ТВ-режим или Свободный обзор.
Создайте новое устройство Verse в своём проекте и назовите его show_template_device.verse с помощью проводника Verse, после чего перетащите устройство в шаблон. Дважды нажмите на файл Verse, чтобы открыть его в Visual Studio Code.
В шаблоне вы создали устройства, которые позволяют воспроизводить стендап-шоу. Теперь давайте добавим ссылки на них в вашем коде.
Добавьте следующие поля в файл show_template_device:
Для начала перед определением класса
show_template_deviceдобавьтеlog_channelс названиемlog_show_template_device.Verse# Create a custom log channel for the show_template_device. This helps with log filtering in complex games with lots of log sources. log_show_template_device := class(log_channel){} # A Verse-authored creative device that can be placed in a level show_template_device := class(creative_device):Теперь в верхней части определения класса
show_template_deviceдобавьте регистратор журналов, который будет использовать каналlog_show_template_device, чтобы было понятно, какие командыPrint()поступают от этого устройства.Verse# A Verse-authored creative device that can be placed in a level show_template_device := class(creative_device): # Logger that uses custom log channel. Logger:log = log{Channel := log_show_template_device}Редактируемое устройство «Стул» с названием
TheChair. Именно на этот стул игроки садятся, чтобы началось стендап-шоу.Verse# The chair device the player should sit in. @editable TheChair:chair_device = chair_device{}Два редактируемых устройства «Последовательность внутриигрового видео» с названиями
MainSequenceиTVModeSequence.MainSequence— это последовательность внутриигрового видео, которая воспроизводит стендап-шоу, подключает анимацию и звуковое сопровождение для устройства персонажа на этом уровне.TVModeSequenceпереключает камеру игрока на режим просмотра, в котором удерживается внимание наMainSequence, с переключением от одного угла просмотра к другому.Verse# The sequence that drives animation and audio on the character device in the level. @editable MainSequence:cinematic_sequence_device = cinematic_sequence_device{} # The sequence that drives the TV mode sequence for viewing in the level. @editable TVModeSequence:cinematic_sequence_device = cinematic_sequence_device{}Редактируемый массив элементов
cinematic_sequence_deviceс названиямиCameraSwitches. Этот массив содержит ссылки на каждую из камер, между которыми игроки могут переключаться.Verse# A list of alternative camera sequences that are provided to view from during the main sequence. @editable CameraSwitches:[]cinematic_sequence_device = array{}Четыре редактируемых устройства
input_trigger_device. Каждое из этих устройств принимает ввод от игрока и переключается между различными режимами камеры. ТриггерReturnToFreeLookвозвращает игрока к камере по умолчанию, аReturnToTVMode— кTVModeSequence. КамераNextCameraиPreviousModeпереключает игрока между различными последовательностями внутриигрового видео в массивеCameraSwitches.Verse# An input trigger that will return us to free look while in the chair. @editable ReturnToFreeLook:input_trigger_device = input_trigger_device{} # An input trigger that will return us to TV mode when appropriate in the chair. @editable ReturnToTVMode:input_trigger_device = input_trigger_device{} # An input trigger that will choose the next camera while in the chair. @editableНеобязательная переменная устройства «Последовательность внутриигрового видео» с названием
CurrentSequence. При воспроизведении такой последовательности внутриигрового видео, какTVModeSequence, эта настройка сохраняет ссылку на неё. Мы не будем воспроизводить для персонажа сразу несколько последовательностей внутриигрового видео, поэтому эту настройку можно использовать для выключения текущей последовательности при переключении на новую.Verse# The alternative camera sequence that is playing if valid. var CurrentSequence:?cinematic_sequence_device = falseДве логические переменные:
MainSequencePlayingиInTvMode. Они позволяют отслеживать момент воспроизведенияMainSequenceилиTVModeSequence.Verse# Helps us track when the main sequence on the character device is playing. var MainSequencePlaying:logic = false # When we are in TV mode. var InTVMode:logic = falseЦелочисленная переменная
CurrentCameraIndex. Позволяет отслеживать индекс последовательности внутриигрового видео в массивеCameraSwitches, которая в данный момент воспроизводится.Verse# Keeps track of what camera we are viewing when using other cameras besides TV Mode. var CurrentCameraIndex:int = -1Пять необязательных
отменяемыхпеременных, позволяющих отслеживать подписки на все события, на которые ссылается этот шаблон. Различные функции, которые требуется запускать, когда игрок переключается между камерами, возвращается к свободному обзору или ТВ-режиму, либо покидает устройство «Стул». Далее мы подпишем эти функции на события, которые их запускают, и сохраним ссылку на каждую из подписок, чтобы их можно было отменить, когда они больше не будут нужны.Verse# Subscriptions to all the events we listen for while running. var ReturnToFreeLookSubscription:?cancelable = false var NextCameraSubscription:?cancelable = false var PrevCameraSubscription:?cancelable = false var ReturnToTVModeSubscription:?cancelable = false var ChairExitSubscription:?cancelable = falseСохраните сценарий в Visual Studio Code и скомпилируйте его, чтобы обновить Verse-устройство на уровне.
В шаблоне выберите
show_template_device. На панели Сведения присвойте ссылку каждого устройства в сценарии соответствующему устройству на уровне, включая все устройства «Активация при нажатии» и последовательности внутриигрового видео.
Запуск последовательности
Шоу запускается в момент, когда игрок садится на устройство «Стул». Требуется, чтобы последовательность внутриигрового видео начала воспроизводиться после того, как игрок сядет на стул. Выполните действия ниже для запуска основной последовательности после того, как игрок сядет на стул, а также для включения ТВ-режима, чтобы игрок мог начать просмотр.
Добавьте новую функцию
RunSequence()в классshow_template_device. Эта функция принимает агента, который запустил шоу, и запускает как MainSequence, так иTVModeSequence. Добавьте модификатор к функцииRunSequence(), чтобы она выполнялась асинхронно. Требуется это для того, чтобы параллельно с ней выполнялся другой код, а сам игрок мог переключать ракурсы камер без прерывания выполненияRunSequence().Verse# Handles running the main sequence which runs the character and TV mode sequences for viewing and then calls a function to await finishing. RunSequence(Agent:agent)<suspends>:void =В
RunSequence()на одну секунду вызовите функциюSleep(), чтобы анимация сидящего на стуле игрока завершилась до начала шоу. Затем вызовитеPlay()вMainSequenceи установите дляMainSequencePlayingзначение true.Verse# Sleep for a second because we just entered the chair and the animation to sit takes a moment. Sleep(1.0) # Run the Main sequence on the character device and the TV mode viewing sequence. Logger.Print("Main Sequence Playing") set MainSequencePlaying = true MainSequence.Play()Вызовите функцию
Play()дляTVModeSequence, передав запустившего шоу агента для смены камеры на кинематографический вид. Установите дляInTVModeзначение true и вызовите новую функцию, ожидающую окончанияMainSequence, под названиемAwaitMainSequenceEnding(), передав в неё агента. Эту функцию вы настроите на следующем шаге. Готовый кодRunSequence()должен выглядеть следующим образом:Verse# Handles running the main sequence which runs the character and TV mode sequences for viewing and then calls a function to await finishing. RunSequence(Agent:agent)<suspends>:void = # Sleep for a second because we just entered the chair and the animation to sit takes a moment. Sleep(1.0) # Run the Main sequence on the character device and the TV mode viewing sequence. Logger.Print("Main Sequence Playing") set MainSequencePlaying = true MainSequence.Play()Добавьте новую функцию
AwaitMainSequecingEnding()в классshow_template_device, которая будет приниматьагентизRunSequence(). Этой функции также нужен модификатор<suspends>, так как она должна выполняться в фоновом режиме и срабатывать при завершенииMainSequence.Verse# When the main sequence finishes, we clear the flag so that if the player sits back down, it will play again. AwaitMainSequencingEnding(Agent:agent)<suspends>:void =В
AwaitMainSequencingEnding()вызовитеAwait()дляMainSequence.StoppedEvent(). При завершенииMainSequenceустановите дляMainSequencePlayingзначениеfalseи заставьте игрока встать со стула, используя функцию стулаEject(). В конечном итоге функцияAwaitMainSequencingEnding()должна выглядеть следующим образом:Verse# When the main sequence finishes, we clear the flag so that if the player sits back down, it will play again. AwaitMainSequencingEnding(Agent:agent)<suspends>:void = MainSequence.StoppedEvent.Await() Logger.Print("Main Sequence Ended") set MainSequencePlaying = false # Kick the player out of the chair after the performance TheChair.Eject(Agent)Добавьте две новые функции
DoReturnToTVMode()иDoReturnToFreeLook()в классshow_template_device. Эти функции обрабатывают логику событий, когда игрок возвращается в ТВ-режим или к свободному обзору, но пока их нужно оставить пустыми: мы завершим их чуть позже.Verse# Returns us to our TV viewing mode sequence by checking where the main sequence is and aligning our playback to that point. DoReturnToTVMode(Agent:agent):void = Logger.Print("Return to TV Mode") # Determine if we are in TV mode or another camera sequence and return control to the main player camera. DoReturnToFreeLook(Agent: agent):void = Logger.Print("Return to Free Look")Добавьте новую функцию
OnSeated()в классshow_template_device, которая будет принимать агента, который сидел наTheChair.Verse# This function handles the player sitting down and starting up the performance if it isn't already running and setting up the input triggers. OnSeated(Agent:agent):void = Logger.Print("Player sat down")В
OnSeated(), еслиMainSequenceещё не воспроизводится, создайте функциюRunSequence(), передав в неё агента, который сел на устройство «Стул». В противном случае вызовитеDoReturnToTVMode()с тем же агентом.Verse# This function handles the player sitting down and starting up the performance if it isn't already running and setting up the input triggers. OnSeated(Agent:agent):void = Logger.Print("Player sat down") # If the main sequence is not playing on the character device in the level, run it, otherwise if it is running then just return to the TV mode viewing experience. if (MainSequencePlaying = false): spawn{RunSequence(Agent)} else: DoReturnToTVMode(Agent)Добавьте новую функцию
OnChairExited()в классshow_template_device, которая будет принимать игрока, вставшего со стула. Логику для этой функции мы добавим позднее.Verse# Handles the player leaving the chair and removing access to the input triggers that are available while in the chair. OnChairExited(Agent:agent):void = Logger.Print("Player got up")В
OnBegin()подпишитеTheChair.SeatedEventна функциюOnSeated(). Теперь, когда игрок сядет наTheChair, начнётся воспроизведение шоу.Verse# Runs when the device is started in a running game. OnBegin<override>()<suspends>:void = Logger.Print("Standup Template device started") TheChair.SeatedEvent.Subscribe(OnSeated)
Сохраните код в Visual Studio Code, скомпилируйте его и нажмите Запуск сеанса на панели инструментов UEFN, чтобы протестировать шаблон. Если во время игры сесть на устройство «Стул», должно начаться шоу, а камера игрока переведётся на кинематографический режим. При завершении шоу игрок должен встать со стула.
Переключение камер
Во время шоу игрок, сидящий на стуле (TheChair), может переключать вид с одной камеры на другую, которые будут обрабатываться различными последовательностями внутриигрового видео. Для настройки логики переключения между различными последовательностями выполните описанные ниже действия.
Добавьте новую функцию
DoCameraSwitch()в классshow_template_device. Эта функция принимает агента, камеру которого вы переключаете, и значениеint, соответствующее индексу последовательности внутриигрового видео вCameraSwitches.Verse# Switches us between camera sequences that have been specified by stopping any current ones and moving to the next appropriate one on the list. DoCameraSwitch(Agent:agent, Value:int):void =В
DoCameraSwitch(), в блокеif, получите последовательность внутриигрового видео по индексу Value в массивеCameraSwitches. Затем остановите любые воспроизводимые в данный момент последовательности, проверив, содержит лиCurrentSequenceпоследовательность внутриигрового видео, и вызвав для неёStop().Verse# Switches us between camera sequences that have been specified by stopping any current ones and moving to the next appropriate one on the list. DoCameraSwitch(Agent:agent, Value:int):void = if (CameraSwitch := CameraSwitches[Value]): Logger.Print("Switching Cameras to {Value}") # Stop any currently playing other camera sequence. if (PlayingSequence := CurrentSequence?): PlayingSequence.Stop(Agent)Запустите воспроизведение новой последовательности внутриигрового видео, вызвав
Play()дляCameraSwitch. Затем настройтеCurrentSequenceтак, чтобы она указывала, какая последовательность воспроизводится в данный момент. Наконец, зарегистрируйтеagentпри помощиRegister(), камеру которого вы переключаете с помощью устройств «Активация при нажатии»ReturnToTVModeиReturnToFreeLook, чтобы они могли вернуться в эти режимы при просмотре через другие камеры. В конечном итоге функцияDoCameraSwitch()должна выглядеть следующим образом:Verse# Switches us between camera sequences that have been specified by stopping any current ones and moving to the next appropriate one on the list. DoCameraSwitch(Agent:agent, Value:int):void = if (CameraSwitch := CameraSwitches[Value]): Logger.Print("Switching Cameras to {Value}") # Stop any currently playing other camera sequence. if (PlayingSequence := CurrentSequence?): PlayingSequence.Stop(Agent) # Start up the new camera viewing sequence.Для перехода к следующей или предыдущей камере зададим две похожие функции —
DoNextCamera()иDoPreviousCamera(). Сначала добавим логику для следующей камеры, для чего в классshow_template_deviceмы добавим новую функциюDoNextCamera(). Эта функция принимает агента (agent), камеру которого вы переключаете.Verse# Switches to the next camera on our list, or the first if we are in TV mode. DoNextCamera(Agent:agent):void = Logger.Print("Next Camera")В
DoNextCamera()проверьте, находится ли игрок в данный момент в ТВ-режиме. Если да, остановитеTVModeSequenceпри помощи `Stop(), дляInTVModeустановите значение false, а дляCurrentCameraIndex— значение–1. Значение–1используется по той причине, что требуется перейти к индексу следующей последовательности внутриигрового видео в массивеCameraSwitches, чей индекс будет равен0.Verse# If we are currently viewing from TV Mode, end that sequence and clear associated values. if (InTVMode?): TVModeSequence.Stop(Agent) set InTVMode = false set CurrentCameraIndex = -1Затем нужно определить, на какую камеру переключиться далее с учётом индекса текущей камеры. Для этого новой переменной
NextCameraValueприсвойте значение остатка от деления (Mod)CurrentCameraIndex + 1наCameraSwitches.Length. Благодаря этомуNextCameraValueбудет присваиваться значение в пределах от0до длиныCameraSwitchesбез возможности случайно получить дляNextCameraValueзначение за пределами массиваCameraSwitches. Получив значениеNextCameraValue, задайте дляCurrentCameraValueзначениеNextCameraValueи вызовитеDoCameraSwitch(), передав агента (agent) иCurrentCameraIndex. В конечном итоге функцияDoNextCamera()должна выглядеть следующим образом:Verse# Switches to the next camera on our list, or the first if we are in TV mode. DoNextCamera(Agent:agent):void = Logger.Print("Next Camera") # If we are currently viewing from TV Mode, end that sequence and clear associated values. if (InTVMode?): TVModeSequence.Stop(Agent) set InTVMode = false set CurrentCameraIndex = -1Для переключения на предыдущую камеру в класс
show_template_deviceдобавьте новую функциюDoPreviousCamera(). Скопируйте в эту функцию код изDoNextCamera(). При проверке, находится ли игрок в ТВ-режиме, установите дляCurrentCameraIndexзначение0вместо–1. Кроме того, измените значениеNextCameraValueна остаток от деления (Mod)CurrentCameraIndex – 1наCameraSwitches.Length.В конечном итоге функцияDoPreviousCamera()должна выглядеть следующим образом:Verse# Switches us to the previous camera on the list or last camera if we are leaving TV mode. DoPreviousCamera(Agent:agent):void = Logger.Print("Prev Camera") # If we are currently viewing from TV Mode, end that sequence and clear associated values. if (InTVMode?): TVModeSequence.Stop(Agent) set InTVMode = false set CurrentCameraIndex = 0
Когда игрок сидит на стуле (TheChair) и смотрит через другую камеру в CameraSwitches, он может вернуться либо в ТВ-режим, либо к свободному обзору. Вы уже задали функции DoReturnToFreeLook() и DoReturnToTVMode() ранее, так что теперь пора заполнить их логику.
В функции
DoReturnToFreeLook()проверьте, находится ли игрок в данный момент в ТВ-режиме. Если да, остановитеTVModeSequenceпри помощиStop()и дляInTVModeустановите значение false. Проделайте то же самое дляCurrentSequence, проверив, содержит лиCurrentSequenceпоследовательность внутриигрового видео, вызвавStop()и, если это так, установив для него значение false.Verse# If TV Mode is active, stop it. if (InTVMode?): TVModeSequence.Stop(Agent) set InTVMode = false # If we are playing another viewing experience, stop it. if (TempSeq := CurrentSequence?): TempSeq.Stop(Agent) set CurrentSequence = falseТеперь выполняем
Register()для агента с триггером активации при нажатииReturnToTVModeиUnregister()с триггеромReturnToFreeLook, так как не требуется, чтобы игрок вернулся в режим свободного обзора, если этот режим уже включён. В конечном итоге функцияDoReturnToFreeLook()должна выглядеть следующим образом:Verse# Determine if we are in TV mode or another camera sequence and return control to the main player camera. DoReturnToFreeLook(Agent: agent):void = Logger.Print("Return to Free Look") # If TV Mode is active, stop it. if (InTVMode?): TVModeSequence.Stop(Agent) set InTVMode = false # If we are playing another viewing experience, stop it.Функцию
DoReturnToTVMode()нужно дополнить, поскольку при возврате в ТВ-режим нужно запуститьTVModeSequenceс текущего моментаMainSequence. Сначала проверьте, находится ли игрок уже в ТВ-режиме при вызове этой функции. Если да, достаточно использоватьreturn, так как более ничего делать не нужно. Затем проверьте содержит лиCurrentSequenceпоследовательность внутриигрового видео, вызвавStop()и, если это так, задайте для него значениеfalse.Verse# If we are already in TV mode no need to return to it. if (InTVMode?): return # If we have another camera sequence playing, stop it and clear associated values. if (TempSeq := CurrentSequence?): TempSeq.Stop(Agent) set CurrentSequence = falseТеперь нужно определить, в каком месте воспроизведения находится
MainSequence, чтобы запуститьTVModeSequenceс того же места. Получите время воспроизведенияMainSequence, вызвавGetPlayBackTime(), и сохраните его в переменнойCurrentSeekTime. ДляTVModeSequenceустановите время воспроизведения наCurrentSeekTimeс помощьюSetPlaybackTime(), после чего запустите воспроизведения последовательности с помощьюPlay(), передав в неё агента. Затем установите дляInTVModeзначениеtrue.Verse# Figure out where the main sequence is in its playback and start up the TV mode sequence at the same spot to provide the proper viewing experience. CurrentSeekTime := MainSequence.GetPlaybackTime() TVModeSequence.SetPlaybackTime(CurrentSeekTime) TVModeSequence.Play(Agent) set InTVMode = trueНаконец, выполните отмену регистрации агента для триггера активации при нажатии
ReturnToTVModeпри помощиUnregister()и зарегистрируйте его с триггеромReturnToFreeLookпри помощиRegister(). В конечном итоге функцияDoReturnToTVMode()должна выглядеть следующим образом:Verse# Returns us to our TV viewing mode sequence by checking where the main sequence is and aligning our playback to that point. DoReturnToTVMode(Agent:agent):void = Logger.Print("Return to TV Mode") # If we are already in TV mode no need to return to it. if (InTVMode?): return # If we have another camera sequence playing, stop it and clear associated values. if (TempSeq := CurrentSequence?):
Объединение системы воедино
В предыдущей части вы настроили много функций и настало время связать их с различными триггерами активации при нажатии, которые их будут вызывать.
В
OnSeated()зарегистрируйте агента в триггерах активации при нажатииReturnToFreeLook,NextCameraиPreviousCameraпри помощиRegister(): это те самые триггеры, к которым сначала будет обращаться игрок, когда первый раз сядет на стул. Затем настройтеReturnToFreeLookSubscription,NextCameraSubscriptionиPreviousCameraSubscription, подписав каждый триггер на связанную с ним функцию. Аналогично настройтеReturnToTVModeSubscriptionиChairExitSubscription.Verse# Register for the input trigger for free look and subscribe to the pressed event when sitting. ReturnToFreeLook.Register(Agent) set ReturnToFreeLookSubscription = option{ReturnToFreeLook.PressedEvent.Subscribe(DoReturnToFreeLook)} # Register for the input trigger for the next camera and subscribe to the pressed event when sitting. NextCamera.Register(Agent) set NextCameraSubscription = option{NextCamera.PressedEvent.Subscribe(DoNextCamera)} # Register for the input trigger for the previous camera and subscribe to the pressed event when sitting. PreviousCamera.Register(Agent)Добавьте новую функцию
CancelSubscription(), которая принимает необязательное отменяемое значение, в классshow_template_device. ВCancelSubscription()проверьте, есть ли вSubscriptionкакое-нибудь значение. Если да, то отмените его при помощиCancel(). В конечном итоге функцияCancelSubscription()должна выглядеть следующим образом:Verse# Cancel a subscription if it is valid. CancelSubscription(Subscription:?cancelable):void = if (SubscriptionToCancel := Subscription?): SubscriptionToCancel.Cancel()В момент, когда игрок встаёт со стула, нужно остановить любые воспроизводимые для него последовательности, а также отменить все подписки на триггеры активации при нажатии, для которых он был зарегистрирован. В функции
OnChairExited(), как и в случае сDoReturnToFreeLook(), проверьте, включён ли для игрока ТВ-режим, а также содержит лиCurrentSequenceпоследовательность внутриигрового видео. Если это так, вызовитеStop()для каждой последовательности и задайте дляInTVModeзначениеfalse, если для игрока включён ТВ-режим. Затем задайте дляCurrentSequenceзначениеfalse.Verse# Stop the TV camera view when we leave the chair if it is active. if (InTVMode = true): TVModeSequence.Stop(Agent) set InTVMode = false # Stop the camera sequence we were using if it is active when we leave the chair. if (TempSeq := CurrentSequence?): TempSeq.Stop(Agent) # Clear whatever the current sequence was when we leave the chair.Теперь отмените все подписки игрока, передав каждую из них функции
CancelSubscription(). Кроме того, при помощиUnregister()отмените регистрацию для игрока в каждом триггере активации при нажатии, поскольку такие триггеры не должны получать доступ к тем кнопкам, когда игрок встаёт со стула. В конечном итоге функцияOnChairExited()должна выглядеть следующим образом:Verse# Handles the player leaving the chair and removing access to the input triggers that are available while in the chair. OnChairExited(Agent:agent):void = Logger.Print("Player got up") # Stop the TV camera view when we leave the chair if it is active. if (InTVMode = true): TVModeSequence.Stop(Agent) set InTVMode = false # Stop the camera sequence we were using if it is active when we leave the chair.
Сохраните код в Visual Studio Code, скомпилируйте его и нажмите Запуск сеанса на панели инструментов UEFN, чтобы протестировать шаблон. Во время игрового теста, если сесть на устройство «Стул», должно начаться шоу. Во время шоу должна быть возможность переключаться между ТВ-режимом, свободным обзором и просмотром под разными углами через камеры. При возврате в ТВ-режим последовательность ТВ-режима должна совпадать с основной последовательностью. Когда шоу завершится, камера должна вернуться в режим свободного обзора, и вы встанете со стула.