Build a VR Pawn with Unreal Engine Luis Cataldi Russian
1. Luis Cataldi - Education Evangelist – Epic Games
Создаём с нуля VR
Project, VR Pawn и VR
Player Controller!
2. 2
Создайте новый Блупринт и выберите Pawn Class
➔ На свободном месте в
content browser кликните
правой кнопкой мыши и
выберите Create Basic
Asset > Blueprint Class
➔ Теперь назовите его,
например “MyVR-Pawn”
3. 3
Ознакомьтесь со множеством различных настроек Blueprint editor
➔ Components
➔ Menu Bar
➔ Details
➔ Viewport
➔ Construction Script
➔ Graph Editor
➔ My Blueprint: Variables,
Functions, Components
➔ Debug
➔ Compiler Results
5. 5
Обновлённые камеры автоматически закрепляются к HMDs
(шлему виртуальной реальности)
➔ Обновлённые camera
components отныне
автоматически
закрепляются к
поддерживаемому HMDs
➔ В UE 4.13 управление
камерой в VR не требует
выполнения
дополнительных действий
6. 6
Откройте World Settings из меню настроек (Settings menu)
➔ Выберите World Settings из
выпадающего списка в
настройках (Settings menu)
➔ Справа от вкладки Details
появится новая вкладка
World Settings. В ней будет
находиться несколько под-
меню, включая Game Mode
и Gamemode Overrides
7. 7
Создайте новый GameMode Override
➔ Для создания нового
override кликните + справа
от GameMode Override
➔ Назовите GameMode
Override, например,
MyVRGameMode
➔ Теперь его можно
сохранить в папку Blueprints
8. 8
Назначьте ваш MyVRPawn к Default Pawn Class
➔ Выберите Default Pawn
Class и назначьте в него
только что созданный
MyVRPawn Blueprint
9. 9
Создайте PlayerController Class Blueprint в меню GameMode Override
➔ Для создания нового override
кликните + справа от Player
Controller Class
➔ Назовите PlayerController
Override, например,
MyVRPlayerController
➔ Теперь его также можно
сохранить в папку Blueprints
10. 10
Перейдите во вкладку Event Graph в вашем новом MyVRPlayerController
➔ Как только новый
MyVRPlayerController
Blueprint будет создан, он
сразу откроется в новом
окне и будет доступен для
редактирования
➔ Выберите третью по счёту
вкладку, которая называется
Event Graph
11. 11
Перейдите в Project Settings для создания новых инпутов (imputs)
➔ Здесь в разделе Input section,
мы можем добавить новые
Axis Mappings и Action
Mapping, которые и будут
нашими инпутами
12. 12
Создайте 2 новых Action Mappings
➔ Создайте MyGlide Action
Mapping и назначьте для него
Middle Mouse Button (Средняя
кнопка мыши)
➔ Создайте MyInteraction Action
Mapping и назначьте для него
Right Mouse Button (правую
кнопку мыши)
13. Вернитесь к MyVRPlayerController и создайте MyGlide Linetrace Blueprint
➔ Во вкладке EventGraph в
MyVRPlayerController, кликните
правой кнопкой мыши и
добавьте InputAxis для Glide
➔ Добавьте (Get) Player Camera
Manager
➔ Вытяните GetActorLocation
➔ Вытяните GetActorFowardVector
➔ Умножьте (Multiply) Float x Float
из GetActorForwardVector и
поставьте значение, например,
10000 units в нижний float
➔ Создайте LineTraceByChannel
➔ Соедините его с ExecutionPin из
MyGlide InputAxis
➔ Соедините Start и
GetActorLocation
➔ Соедините End с суммой
(Addition) GetActorLocation и
умноженного значения (multiply
node)
14. 14
Создайте 2 новые переменные (Variables) с типом Vector
➔ Создайте переменную
StartTrace Vector
➔ Создайте переменную
EndTrace Vector
15. 15
Вытяните EndTrace чтобы его засетить (Set)
➔ Выберите и вытяните
переменную EndTrace в Event
Graph и выберите Create Setter
(Set)
16. 16
Подключите EndTrace
➔ Соедините Execution Pin из
Line Trace с EndTrace
➔ Вытяните Trace End vector из
Break Hit Result в инпут
EndTrace для того, чтобы
установить его значение
18. 18
Соедините Set StartTrace с Actor Location
➔ Кликните правой кнопкой
мыши чтобы вызвать функцию
GetPlayerPawn
➔ Протяните из Return Value для
создания функции
GetActorLocation node
➔ Соедините вновь созданную
функцию с инпутом (input)
вектора StartTrace Vector,
чтобы передать в него нужное
значение
19. 19
Соедините BreakHitResult с EndTrace
➔ Соедините Set End Trace с Set
Start Trace
➔ Вызовите функцию
GetPlayerPawn, соедините её с
функцией GetActorLocation,
которую, в свою очередь, уже
подключите к StartTrace
20. 20
Создайте Timeline и назовите его, к примеру, MyGlideCruve
➔ Создайте FloatCurve и назовите
её, к примеру, GlideFloat
➔ Добавьте 2 Ключа (Keys)
➔ Первый Ключ (Key) установите в
значения 0 и 0
➔ Второй Ключ (Key) установите в
значения, к примеру, .9 и .9
➔ Установите флажок в чекбокс Use
Last Keyframe
21. Используйте Timeline Component для получения функции SetPlayRate, с помощью
которой можно будет регулировать скорость передвижения
➔ Подключите функцию SetPlayRate
к StartTrace
➔ Разделите значение NewRate на 1
для нормализации значения
➔ Создайте новую Переменную
RateOfGlide и установите в неё,
для начала, значение 20
➔ Соедините output функции
SetPlayRate с инпутом Play from
Start в MyGlideCurve’s
22. Добавьте Lerp (Vector) для более плавного передвижения
➔ Протянув из GlideFloat в
MyGlideCurve’s вы сможете создать
Lerp (Vector). Соедините его с
инпутом Alpha
➔ Соедините output EndTrace с
инпутом B в Lerp (Vector)
➔ Соедините output StartTrace с
инпутом A в Lerp (Vector)
➔ Протянув из ReturnValue (Lerp
(Vector)) создайте функцию
SetActorLocation. Соедините его с
NewLocation, чтобы игрок мог понять
куда и как ему передвигаться
23. Используйте колёсико мыши для определения glide distance (расстояния скольжения)
➔ Создайте новый инпут Axis
Mapping и назовите его
MyTraceDistance
➔ Назначьте на него
MouseWheelAxis
25. Вернитесь в SetPlayRate для работы с MyGlideCurve
➔ MouseWheelAxis разделите на 500
и умножьте (Multiply) RateOfGlide
➔ Это позволит вам управлять
дистанцией трейса с помощь
колёсика мыши
➔ ** Убедитесь в том, что вы вернули
значение RateOfGlide в 5 вместо
20
26. Используйте MouseWheelAxis, чтобы определить дистанцию трейса для line trace
➔ Вернитесь к функции
LineTraceByChannel и замените
установленной там по умолчанию
значение 10000 на переменную
флоат MouseWheelAxis, чтобы
регулировать дистанцию, на
которую игрок будет
перемещаться за каждый клик
28. Давайте создадим новый Actor Class Blueprint
➔ Создайте новый Actor Class
Blueprint в папке с блупринтами
(Blueprints folder)
➔ Назовите его, к примеру,
MyPreviewMesh-BP
29. Добавьте в него mesh component
➔ В выпадающем списке +Add
Component найдите и выберите
компонент Sphere (Basic Shape) и
добавьте его к MyPreviewMesh-BP
➔ Назовите его, к примеру,
PreviewMesh
30. Давайте создадим новый материал для нашего preview mesh
➔ В папке Blueprints folder кликните
правой кнопкой мыши и создайте
новый Basic Asset > Material
➔ Назовите его MyPreview-MAT
32. Создайте Emissive Color (излучающий цвет)
➔ Создайте Vector3
➔ Измените цвет на 1,1,1 белый
(white)
➔ Конвертируйте его в Параметр под
названием BaseColor
➔ Соедините его с инпутом А функции
умножения (Multiply)
➔ Добавьте Parameter Node и
назовите её GlowPower
➔ Соедините её с инпутом B функции
умножения (Multiply)
➔ Соедините функцию умножения с
каналом Emissive Color в материале
33. Настройка прозрачности (Opacity)
➔ Соедините Power node с каналом
Opacity в материале
➔ Подключите Fresnel Node в Base
(Power Node)
➔ Создайте функцию Scalar
Parameter с названием Fresnel
Power и присоедините её к
Exponent в Fresnel Node
➔ Сохраните и примените материал
(Save and apply the material)
34. Давайте создадим новый материал инстанс для нашего preview mesh
➔ Найдите в контент браузере
MyPreview-MAT. Кликните по нему
ПКМ и выберите Create Material
Instance
35. Давайте создадим новый материал инстанс для нашего preview mesh
➔ Выбрав MyPreview-Mat_Inst вы
можете изменить ряд параметров.
36. Назначьте новый Material Instance к вашему preview mesh
➔ Выберите Сферу (Sphere Mesh
component)
➔ Назначьте Material Instance к
материалу to the Material в слот
Element 0 кликнув на стрелочку
(assign arrow)
37. Теперь вернитесь в MyVRPlayerController, пришло время спавнить (spawn) вашу
preview sphere
➔ Для начала, мы можем
полностью скопировать
первую часть нашего MyGlide
linetrace Blueprint
38. Давайте подключим Tick event, чтобы запустить line trace
➔ Создайте Event Tick и
подключите его ко входу в
lineTrace
39. Теперь заспавним (Spawn) Preview Mesh Blueprint
➔ Кликните правой кнопкой
мыши и создайте Event
BeginPlay
➔ Протяните из него и создайте
SpawnActor of Class
➔ В выпадающем списке Класса
(Class dropdown), найдите ваш
MyPreviewMesh-BP
40. Добавьте к SpawnActor новый трансформ (New Transform)
➔ Соедините Trace End из Break
Hit Result с Spawn Transform в
функции SpawnActor
➔ Не переживайте если
создастся новая функция
(Сonvert) для того, чтобы
учесть преобразование Vector
в Transform
41. Преобразуйте (Promote) значение ReturnValue (SpawnActor)
➔ Преобразуйте (Promote)
значение RetunValue в
SpawnActor в Переменную и
назовите её MyPreviewSphere
➔ Это добавит ссылку на неё в
вашем списке переменных
(Variables List)
42. Теперь давайте создадим Функцию, которая будет изменять цвет Сферы при её
столкновении с поверхностью
➔ Кликните на + Function key для
создания новой функции
➔ Назовите её SphereColor-F
43. Теперь давайте создадим Функцию, которая будет изменять цвет Сферы при её
столкновении с поверхностью
➔ Добавьте ссылку
MyPreviewSphere
➔ Потяните из MyPreviewSphere
и начните набирать “dynamic”
для создания
DynamicMaterialInstance
44. Теперь давайте создадим Функцию, которая будет изменять цвет Сферы при её
столкновении с поверхностью
➔ Назначьте MyPreview-
MAT_Instance в Source Material
45. Теперь давайте создадим Функцию, которая будет изменять цвет Сферы при её
столкновении с поверхностью
➔ Потяните из ReturnValue и
создайте
SetVectorParameterValue
46. Теперь давайте создадим Функцию, которая будет изменять цвет Сферы при её
столкновении с поверхностью
➔ В Parameter Name впишите
BaseColor
➔ Создайте (Promote to Variable)
новую переменную NewColor
➔ Compile and Save
47. Теперь давайте закончим работу с Preview Graph
➔ Создайте Branch Node,
потянув из execution pin
LineTrace
➔ Соедините Blocking Hit из
BreakHitResult с Condition
➔ Из аутпута True вызовите
SphereColor-F Function и
установите цвет NewColor в
синий с помощью Set
NewColor Node
➔ Сделайте тоже самое для
False, установив жёлтый цвет
48. Теперь давайте закончим работу с Preview Graph
➔ Создайте Branch Node,
потянув из execution pin
LineTrace
➔ Соедините Blocking Hit из
BreakHitResult с Condition
➔ Из аутпута True вызовите
SphereColor-F Function и
установите цвет NewColor в
синий с помощью Set
NewColor Node
➔ Сделайте тоже самое для
False, установив жёлтый цвет
49. Теперь давайте закончим работу с Preview Graph
➔ Создайте новую переменную
SurfaceNormal из Location в
BreakHitResult при помощи
Promote to Variable
50. Теперь давайте закончим работу с Preview Graph
➔ Перетяните назначение (Set)
новой переменной в конец
выполнения True (после
назначения синего цвета)
51. Теперь давайте закончим работу с Preview Graph
➔ Создайте новую переменную
TraceEnd из Trace End в
BreakHitResult при помощи
Promote to Variable
➔ Как и в прошлый раз,
перетяните назначение (Set)
новой переменной в конец
выполнения False (после
назначения жёлтого цвета)
52. Теперь давайте закончим работу с Preview Graph
➔ Создайте SetActorLocation
потянув из MyPreviewSphere
➔ Соедините Set SurfaceNormal с
SetActorLocation и в значение
NewLocation передайте
SurfaceNormal
➔ Сделайте тоже самое ещё раз
для ноды Set TraceEnd
55. Давайте построим interaction graph (всё ещё в MyVRPlayerController)
➔ Создайте InputAction для
MyInteraction, который мы
создали в разделе инпутов в
настройках проекта (Input
section of the Project Settings)
➔ Соедините Pressed c инпутом
скопированного LineTrace
56. Создаём новый Blueprint Interface
➔ В папке с блупринтами
кликните ПКМ и в разделе
Blueprints выберите Blueprint
Interface
➔ Назовите его MyInteract-BPI
57. Создаём новый Blueprint Interface
➔ Blueprint Interface позволит
вам создавать новые Функции
➔ Создайте новую функцию
LookingAt
➔ Вы можете добавлять инпуты
и аутпуты (Inputs and Outputs),
но пока обойдёмся без этого
➔ Compile and Save
59. Возвращаемся к MyVRPlayerController
➔ Чтобы добавить LookingAt
потяните из HitActor снова и
наберите название вашего
Blueprint Interface - MyInteract-
BPI
➔ Соедините его с аутпутом ? Is
valid, который в свою очередь
соединён с LineTrace
➔ Compile and Save
61. Настроим Включение и Выключение вращения лопастей вентилятора с помощью sight
based interaction
➔ Если вы переместитесь к той
части локации, где находятся
вентиляторы, то увидите, что они
уже контролируются
Блупринтами
➔ Мы можем заменить
существующие Блупринты на
новые, которые добавят
взаимодействие с нашим line
trace
➔ Откройте существующий
Блупринт, чтобы найти ссылку на
тот меш, который используется в
данной сцене
62. Настроим Включение и Выключение вращения лопастей вентилятора
➔ Создайте новый Actor Class
Blueprint в папке Blueprints
➔ Назовите его MyVRFan-BP
➔ Откройте его для
редактирования
63. Настроим Включение и Выключение вращения лопастей вентилятора
➔ Добавьте Static Mesh
Component вентилятора в
Блупринт
64. Настроим Включение и Выключение вращения лопастей вентилятора
➔ Добавьте Rotating Movement
Component в Блупринт
65. Настроим Включение и Выключение вращения лопастей вентилятора
➔ Выбрав Rotating Movement
Component, установите новое
значение Rotation Rate X,
например 450
66. Настроим Включение и Выключение вращения лопастей вентилятора
➔ Теперь отключите AutoActive
(снимите галочку) для того,
чтобы вентилятор не
включался автоматически, а
только после выполнения
определённых действий
игроком
67. Настроим Включение и Выключение вращения лопастей вентилятора
➔ Кликните на кнопку Class
Settings в верхней панели для
того, чтобы перейти к его
настройкам (Class Settings)
➔ В Details Panel, в разделе
Interfaces, воспользуйтесь
кнопкой Add для назначения
MyInteract-BPI Blueprint как
вашего нового BP interface
➔ Обязательно Compile and Save
после этого, чтобы применить
ваш новый BP Interface
68. Настроим Включение и Выключение вращения лопастей вентилятора
➔ Как только мы применили наш
новый BP Interface, мы можем
кликнуть в нём правой кнопкой
мыши и получить доступ к
Event LookAt-BPI
➔ Это создаст Событие (Event),
которое мы сможем соединить
с ToggleActive для активации
RotatingMovement нашего
вентилятора (Component of the
Fan Mesh)
➔ Compile and Save
69. Настроим Включение и Выключение вращения лопастей вентилятора
➔ Убедитесь в том, что на
объектах, которые окружают
наш вентилятор нет коллизий,
чтобы дать возможность
взаимодействовать с ним
70. Настроим Включение и Выключение вращения лопастей вентилятора
➔ Для замены Блупринта, выберите
Actor в сцене, кликните по нему
ПКМ для вызова меню. В
появившемся меню выберите
Replace Selected Actors with
➔ Убедитесь в том, что в контент
браузере выделен необходимый
Блупринт
➔ Save All
➔ Теперь MyVRFan-BP размещён в
нужном месте и вы можете с ним
взаимодействовать. Для этого
направьте Preview Sphere на него
используя ПКМ
71. 71
VR с помощью Unreal Engine это круто.
Ознакомьтесь с UE4 VR learning resouces
для получения более исчерпывающей
информации.
luis.cataldi@epicgames.com