Close

22.09.2017

Создание простой игры на движке Unity

В данной статье я рассмотрю основы работы с Unity и покажу процесс создание простой 3D игры на основе туториала с офифиального сайта.

Данный туториал представляет из себя набор видеоуроков, в процессе которых создается игра Roll a Ball.

Суть игры довольно проста: на прямогугольном поле, ограниченном рамками, расположен круглый шарик, способный кататься по поверхности. Вокруг шарика располагаются повисшие над поверхностью вращающиеся кубики. При соприкосновении с шариком кубик исчезает. Задача игрока — собрать таким образом все имеющиеся на игровом поле кубики, управляя наклоном поля при помощи основных игровых клавиш (W, S, A, D, либо стрелки в правой части клавиатуры).

Мой вариант игры слегка дополнен и усложнен. Вместо четырех рамок покраям на игровом поле я сделал лабиринт из множества стенок, а также горок и трамплинов для того, чтобы протестировать, как работает физика шарика, а также сменил истояник ввода на данные акселерометра и собрал получившуюся игру для платформы Android.
Готовое приложение моэжно скачать здесь.

Ниже я разберу процесс создания подобной игры более подробно.

1. Обзор среды разработки Unity 2017.1.1f1

Главное окно среды разработки Unity поделено на 4 основных части:

  1. Основная рабочая область, где отображается 3D сцена и все игровые объекты. Также здесь есть вкладка «Game» для запуска проекта в режиме отладки (в туториале на официальном сайте эта вкладка размещена внизу рабочей области и отображается всегда) ;
  2. Иерархическая структура проекта, на которой отображены все сцены, а также все игровые объекты, расположенные на сценах. Здесь удобно выбирать конкретные объекты сцены, а также переменовывать и группировать их;
  3. Панель инспектора ресурсов проекта (содержимое папки Assets). Здесь представлены все сцены, материалы, модели, скрипты и другие файлы, включенные в проект;
  4. Панель инспектора объекта. Здесь отображены основные компоненты выбранного объекта и их свойства.

На верхней панели приложения размещены кнопки для редактирования игровых объектов (просмотр, перемещение, вращение, масштаб, выделение области), а также, в центре кнопки для запуска и отладки приложения.

2. Создание игровых объектов

Игровые объекты — это все, что расположено на сцене. Создать игровой объект можно выбрав пункт «Game Object» в главном меню приложения, а также нажав кнопку «Create» сверху на панели иерархической структуры объекта.

Объектом может быть один из нескольких геометрических примитивов (которым автоматически назначается Mesh Renderer и Collider, соответствующие их форме). Также, можно создать пустой объект и установить ему в дальнейшем любой другой Mesh Renderer и Collider.Кроме того, игровым объектом может быть камера или источник света.

Нам необходимо создать объект Plan — это плоскость, по которой будет кататься шарик, а также объект Sphere — это сам шарик. Нажимаем создать -> нужный тип объекта — новый объект моментально появляется на сцене в точке пересечения координатных осей. В инспекторе отображаются компоненты выбранного объекта и их свойства. Можно перемещать объект по сцене, изменять его масштаб и поворот при помощи кнопок в левом верхнем углу, либо задать точные координаты в компоненте «Transform» выбранного объекта в инспекторе. Также доступна точная подстройка параметров через протаскивание около полей ввода.

3. Физика игровых объектов

Для того, чтобы сделать объект «материальным» необходимо добавить два компонента из вкладки «Phisics», для этого пролистайте вниз панель инспектора и нажмите кнопку «Add Component».

В данном примере нас интересуют компоненты Rigidbody и Collider (в нашем случае Sphere Collider). Первый компонент устанавливает массу и инертность объекта, его взаимодействие с гравитацией, а второй компонент определяет форму его границ и коллизии с другими игровыми объектами. Готовый Sphere Collider, означает, что наш шарик не просто перемещается в пространстве, а, находясь на плоскости, катится по ней и вращается, натыкаясь на препятствие либо подскакивает, либо упирается в него. При отсутствии опоры шарик будет падать в бездну. И (О чудо!) мы сделали это, не написав ни единой строчки кода!

4. Поведение игровых объектов

Теперь нам нужно, чтобы шарик начинал движение по плоскости при нажатии клавиш управления (в моем варианте при наклоне экрана Android-устройства)
Для этого добавим скрипт к игровому объекту, нажав в инспекторе «Add Component» -> «New Script».

Заменяем содержимое скрипта следующим:



using UnityEngine;
using System.Collections;

public class PlayerController : MonoBehaviour {

public float speed;
private Rigidbody rb;

   void Start ()
   {
      rb = GetComponent();
   }

   void FixedUpdate ()
   {
      float moveHorizontal = Input.GetAxis ("Horizontal");
      float moveVertical = Input.GetAxis ("Vertical");
      Vector3 movement = new Vector3 (moveHorizontal, 0.0f, moveVertical);
      rb.AddForce (movement * speed);
   }
}

 

В общем, несложно догадаться, что метод onStart() вызывается при старте игры. Здесь происходит инициализация поля rb, используемого для доступа к физической модели обьъекта.

Метод FixUpdate() вызывается как раз тогда, когда объекты должны обновить свои физические параметры. Здесь мы берем данные, вводимые пользователем посредством нажатий игровых кнопок. Данные эти представляют из себя два параметра, изменяемые в зависимости от длительности нажатия той или иной клавиши, давая тем самым бОльшую дискретность управлению. На основе этих данных создается вектор силы, примененной к шарику, который присваивается соответствующему полю Rigidbody. Такаим образом шарик приходит в движение. Переменная speed используется как множитель силы, чтобы удобно настраивать скорость его движения в зависимости от нажатия клавиш, и, так как она объявлена с модификатором доступа «public», мы можем видеть её вне скрипта. В частности, она отображается как свойство в инспекторе компонентов.

В моем варианте игры я использовал данные гироскопа для управления шариком, поэтому вместо


float moveHorizontal = Input.GetAxis ("Horizontal"); 
float moveVertical = Input.GetAxis ("Vertical");

пишем


float moveHorizontal = Input.acceleration.x; 
float moveVertical = Input.acceleration.y;

Запускаем приложение, управляем шариком. Шарик катается по поверхности, ударяется о стенки, но точно так же ударяется и о кубики, расположенные на игровом поле, а нам нужно, чтобы они исчезали. Для этого переопределим обработчик коллизии.
Но для начала назначим объектам, которые должны исчезать теги. Лучше всего для этого предварительно объединить их в группу.

Чтобы добавить тег, нужно нажать выпадающее меню напротив надписи «Tag» в инспекторе, затем нажать кнопку «+», чтобы создать новый тег или же выбрать из списка.

После того, как теги будут назначены, можно добавить следующий код в скрипты игрового объекта (шара):


       void OnTriggerEnter(Collider other)
       {
           if (other.gameObject.CompareTag("Pick Up"))
           {
               other.gameObject.SetActive(false);
           }
       }

 

Данный метод вызывается, когда коллайдер объекта пересекается с другим коллайдером, который передается ему в качестве аргумента. Мы определяем, есть ли у объекта, к которому привязан последний, необходимый нам тег. Далее, если тег обнаружен, мы убираем объект со сцены.

Заключение

Движок Unity позволяет легко создавать 3D — игры и собирать их под различные платформы с использованием минимального количества кода.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *