Это руководство поможет вам создать свое первое VR-приложение в Unity. Это базовое приложение, которое поможет вам ознакомиться с основными понятиями Unity, такими как 3D-объекты, компоненты и настройки сборки. В нем не используется пакет Oculus Integration, поскольку цель этого урока — познакомить вас с основными понятиями и интерфейсом Unity. В конце у вас будет VR-приложение, готовое к запуску на компьютере.
Что это за приложение?
Это просто игра. Сцена содержит игровую зону, окруженную четырьмя стенами, и шарик, который выступает в роли игрока. Цель игры — перекатывать шарик так, чтобы он не сталкивался со стенами. Если он столкнется с одной из стен, цвет стены должен измениться, а на экране должен появиться текст, сообщающий о столкновении. Для ввода вам нужно использовать клавиатуру или джойстики, совместимые с Unity.
Вот что мы будем создавать:
Видео: демонстрация движения мяча и его поведения при столкновении со стенками.
Предварительные требования
Прежде чем приступить к этому уроку, убедитесь, что вы установили среду разработки и выполнили необходимые настройки.
В этом разделе рассказывается об основах создания приложений или игровых механик. Мы объясняем только основные понятия, связанные с рабочим процессом, которые пригодятся при создании этого VR-приложения. Подробнее о понятиях и рабочих процессах Unity см. в руководстве пользователя Unity.
Сцена — это контейнер, в котором хранятся различные игровые объекты.
Игровые объекты — это фундаментальные объекты, представляющие персонажей, реквизит, свет, камеру или спецэффекты. В этом приложении мы будем использовать 3D-объекты, состоящие из примитивных форм, таких как плоскость, куб и сфера.
Компоненты определяют поведение игрового объекта. В основном компонент Transform определяет положение, поворот и масштаб каждого игрового объекта, а значения представляются в виде координат X, Y и Z для каждого свойства. По умолчанию положение устанавливается в точку (0,0,0), которая также известна как точка начала отсчета, откуда происходят все вычисления координат в сцене.
Материал придает объектам текстуру и цвет. В этом приложении мы ограничимся использованием материалов для окраски объектов и не будем вдаваться в другие технические подробности.
Сборка приложения
Шаг 1. Создайте материал, чтобы сделать игровые объекты цветными.
Одна из основных потребностей в дизайне любого приложения — добавление цветов и текстур. Материалы позволяют определять различные эффекты внешнего вида, такие как цвета, шейдеры, текстуры и многое другое. В этом приложении мы ограничимся использованием материалов для добавления цвета.
В окне Project (Проект) в папке Assets (Объекты) создайте новую папку, в которой будут храниться материалы для различных игровых объектов приложения, переименуйте ее в Materials (Материалы) и нажмите два раза, чтобы открыть ее.
В меню выберите Assets (Объекты) > Create (Создать) > Material (Материал) и переименуйте материал в floor-color (цвет пола).
В представлении Inspector (Инспектор) в разделе Main Maps (Основные карты) нажмите поле цвета Albedo, чтобы открыть окно выбора цвета и изменить цвет по своему усмотрению. В этом приложении мы будем использовать значения RGB (3,32,70).
Повторите шаги 2–4, чтобы создать материалы для стен, шарика и изменения цвета стен при столкновении. Переименуйте их в wall-color (цвет стен), ball-color (цвет шарика) и after-collision (после столкновения) и установите значения RGB (255,255,255), (240,240,0) и (241,107,8) соответственно.
Шаг 2. Создайте пол, шарик и четыре стены
Игровыми объектами этого приложения выступают пол, шарик и четыре стены, а для их создания мы будем использовать плоскость, сферу и кубы из инвентаря Unity.
Пол:
В меню выберите GameObject (Игровой объект) > 3D Object (3D-объект) > Plane (Плоскость).
В дереве дайте этой плоскости имя floor (пол).
В представлении Inspector (Инспектор) в разделе Transform (Трансформация) убедитесь, что в качестве положения установлено начало, т. е. (0,0,0). Если это не так, установите значение (0,0,0).
В разделе Transform (Трансформация) установите масштаб (2,1,2), чтобы увеличить пол. Это плоский объект, он не имеет объема. Поэтому по умолчанию значение Y равно единице.
Перетащите материал floor-color на плоскость, чтобы добавить цвет.
Шарик игрока:
В меню выберите GameObject (Игровой объект) > 3D Object (3D-объект) > Sphere (Сфера).
В дереве присвойте объекту имя player-ball (шарик).
Из папки Materials (Материалы) перетащите ball-color (цвет шарика) на сферу.
В представлении Inspector (Инспектор) в разделе Transform (Трансформация) убедитесь, что задано положение (0,0,0), и установите для Y значение 0,5, чтобы шарик лежал на полу, т. е. (0,0.5,0).
Четыре стены:
В меню выберите GameObject (Игровой объект) > 3D Object (3D-объект) > Cube (Куб).
Из папки Materials (Материалы) перетащите wall-color (цвет стены) на куб.
В представлении Inspector (Инспектор) в разделе Transform (Трансформация) установите положение (0,0,0) и масштаб (0.5,2,20.5), чтобы стена аккуратно прилегала к краям пола.
В дереве нажмите куб правой кнопкой мыши и выполните следующие действия:
а. Переименуйте куб в first-wall (первая стена).
б. Продублируйте куб три раза, чтобы добавить ещё три стены, и переименуйте их в second-wall (вторая стена), third-wall (третья стена) и fourth-wall (четвертая стена) соответственно.
В дереве выберите third-wall (третья стена) и в представлении Inspector (Инспектор) в разделе Transform (Трансформация) задайте поворот (0,90,0). Повторите этот шаг для fourth-wall (четвертой стены).
В дереве выберите first-wall (первая стена), и в представлении Inspector (Инспектор) в разделе Transform (Трансформация) введите следующие значения, чтобы изменить положение стены таким образом, чтобы она окружала пол со всех сторон. Повторите этот шаг для остальных стен.
first-wall (первая стена) — (-10,0,0)
second-wall (вторая стена) — (10,0,0)
third-wall (третья стена) — (0,0,10)
fourth-wall (четвертая стена) — (0,0,-10)
Шаг 3. Настройте камеру и освещение
Настройте основную камеру и освещение, чтобы улучшить вид сцены.
В дереве выберите Main Camera (Основная камера).
В представлении Inspector (Инспектор) в разделе Transform (Трансформация) установите положение (0,10,-20) и поворот (20,0,0).
В дереве выберите Directional Light (Направленный свет).
В представлении Inspector (Инспектор) в разделе Transform (Трансформация) установите поворот (50,60,0).
Шаг 4. Добавьте движение шарика
В дереве выберите player-ball (шарик).
В представлении Inspector (Инспектор) выполните следующие действия:
б. Нажмите Add Component (Добавить компонент) > New Script (Новый скрипт), назовите скрипт PlayerController и нажмите Create and Add (Создать и добавить).
в. Нажмите значок шестеренки рядом со скриптом PlayerController и нажмите Edit Script (Редактировать скрипт), чтобы открыть его в редакторе кода.
г. Чтобы получать ввод с клавиатуры и добавлять силы для перемещения шарика, замените пример кода следующим:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
// Appears in the Inspector view from where you can set the speed
public float speed;
// Rigidbody variable to hold the player ball's rigidbody instance
private Rigidbody rb;
// Called before the first frame update
void Start()
{
// Assigns the player ball's rigidbody instance to the variable
rb = GetComponent<Rigidbody>();
}
// Called once per frame
private void Update()
{
// The float variables, moveHorizontal and moveVertical, holds the value of the virtual axes, X and Z.
// It records input from the keyboard.
float moveHorizontal = Input.GetAxis("Horizontal");
float moveVertical = Input.GetAxis("Vertical");
// Vector3 variable, movement, holds 3D positions of the player ball in form of X, Y, and Z axes in the space.
Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);
// Adds force to the player ball to move around.
rb.AddForce(movement * speed * Time.deltaTime);
}
}
В представлении Inspector (Инспектор) в разделе скрипта PlayerController в поле Speed (Скорость) введите значение скорости. Например, 500. Это та же самая переменная speed (скорость), которую мы объявили в скрипте PlayerController на шаге 4.2.d.
Нажмите кнопку Play (Воспроизвести) сверху для предпросмотра приложения. Нажимайте кнопки со стрелками на клавиатуре, чтобы перекатывать шарик.
Шаг 5. Добавьте текст
В меню выберите Game Object (Игровой объект) > UI (Пользовательский интерфейс) > Text (Текст).
В дереве выберите Text (Текст) и переименуйте его в message (сообщение).
Перейдите с вкладки представления Scene (Сцена) на вкладку представления Game (Игра), чтобы посмотреть, как текст будет показываться игроку.
В представлении Inspector (Инспекторе) в разделе RectTransform измените положение текста. При необходимости можно также изменить цвет и размер шрифта.
Шаг 6. Изменяйте цвет стен и выводите текст, когда шарик входит в столкновение или выходит из него
Столкновение происходит, когда шарик ударяется о стену. Вы можете добавить эффекты, чтобы выделить столкновение. Например, когда шарик сталкивается со стеной, цвет стены меняется и на экране появляется текст Ой! Затем, когда шарик вновь покатится, цвет стены изменится на исходный и на экране появится текст Катите…
В дереве выберите first-wall (первая стена).
В представлении Inspector (Инспектор) нажмите Add Component (Добавить компонент) > New Script (Новый скрипт), назовите скрипт ColorController и нажмите Create and Add (Создать и добавить).
Нажмите значок шестеренки рядом со скриптом ColorController и выберите Edit Script (Редактировать скрипт), чтобы открыть его в редакторе кода.
Замените пример кода следующим кодом:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class ColorController : MonoBehaviour
{
public Material[] wallMaterial;
Renderer rend;
// Appears in the Inspector view from where you can assign the textbox
public Text displayText;
// Start is called before the first frame update
void Start()
{
// Assigns the component's renderer instance
rend = GetComponent<Renderer>();
rend.enabled = true;
displayText.text = "";
}
// Called when the ball collides with the wall
private void OnCollisionEnter(Collision col)
{
// Checks if the player ball has collided with the wall.
if (col.gameObject.name == "player-ball")
{
displayText.text = "Ouch!";
rend.sharedMaterial = wallMaterial[0];
}
}
// It is called when the ball moves away from the wall
private void OnCollisionExit(Collision col)
{
if (col.gameObject.name == "player-ball")
{
rend.sharedMaterial = wallMaterial[1];
displayText.text = "Keep Rolling...";
}
}
}
В дереве выберите first-wall (первая стена).
В представлении Inspector (Инспектор) в разделе скрипта ColorController выполните следующие действия:
а. Разверните Wall Material (Материал стен), в поле Size (Размер) введите 2, а в поля Element 0 (Элемент 0) и Element 1 (Элемент 1) перетащите after-collision (после столкновения) и wall-color (цвет стены) соответственно.
б. Нажмите значок шестеренки рядом с полем Display Text (Показывать текст) и выберите message (сообщение). Display Text (Показывать текст) — это то же самое поле, которое мы объявили в скрипте ColorController.cs на шаге 6.4.
В дереве выберите second-wall (вторая стена).
В представлении Inspector (Инспектор) нажмите Add Components (Добавить компоненты) > Scripts (Сценарии), выберите в списке ColorController и повторите шаг 6.
Повторите шаги 7 и 8 для остальных стен.
Нажмите кнопку Play (Воспроизвести) сверху для предпросмотра приложения. Нажимайте кнопки со стрелками на клавиатуре, чтобы перекатывать шарик.
Шаг 7. Соберите и запустите приложение
В зависимости от целевой платформы, которую вы выбрали в настройках сборки, Unity собирает либо .apk-файл для Android, либо .exe-файл для Windows. Поскольку мы не использовали пакет Oculus Integration, приложение может не работать с контроллерами Meta Quest.
Сохраните сцену.
Выберите File (Файл) > Build and Run (Собрать и запустить).
Дважды нажмите файл, чтобы запустить приложение на компьютере. Для ввода используйте клавиатуру или совместимые с Unity джойстики.