Вернуться назад


Как сделать свою 3D игру на Unity. Гайд для новичков



Подготовимся к созданию игры

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

Теперь нужно установить Unity. Ознакомиться с подробной инструкцией по установке и базовым возможностям Unity можно ознакомиться в статье: Как создать первую игру на Unity: гайд для новичков.

Если у вас есть Unity, подготовимся к созданию самого проекта, а именно нам нужно сделать модели и текстуры. Их можно найти в интернете или сделать самому. Мы будем использовать уже готовые модели машин и дороги.

Скачать модели и текстуры можно здесь
.

После подготовки приступим к созданию самого проекта. Для этого в UnityHubнажимаем NewProjectи в меню создания проекта выбираем 3DCore, после чего выбираем папку, в которой будет храниться проект и создаем его.



Создание игры

Как сделать свою 3D игру на Unity

После создания проекта  нас встречает главное окно. Напомню, за что отвечает каждый элемент интерфейса.

  • Панель инструментов - обеспечивает доступ к наиболее важным рабочим функциям;
  • Панель сцены (Scene View) - основное рабочее пространство, где создаются и редактируются игровые объекты. Здесь можно перемещать, масштабировать и вращать объекты, а также настраивать их свойства;
  • Панель игры (Game View) - отображает, как сцена будет выглядеть в реальной игре;
  • Иерархия (Hierarchy) - показывает все объекты, присутствующие в текущей сцене, в виде дерева. Здесь можно организовывать объекты, создавая родительские и дочерние связи;
  • Инспектор (Inspector) - отображает свойства выбранного объекта. Здесь можно изменять параметры, добавлять компоненты и скрипты, а также настраивать поведение объектов;
  • Панель проекта (Project) - показывает все файлы и ресурсы, используемые в проекте. Здесь создавать папки, скрипты, спрайты, а также управлять ресурсами;
  • Консоль (Console) - отображает сообщения об ошибках, предупреждениях и другие важные уведомления. Это инструмент для отладки и выявления проблем в проекте.

Перед тем как создавать игру, импортируем все модели и текстуры. Для этого перетащите все нужны файлы в панель проекта. При импортировании всех моделей выбираем Allи Import.

После импорта всех моделей создадим сцену. Для этого в панели проекта заходим в Azerilo/HQRacingCarModels/Prefab, выбираем понравившуюся машину и перетаскиваем ее на сцену. У нас она будет белого цвета.

Как сделать свою 3D игру на Unity


Создадим дорогу. Чтобы это сделать, необходимо в верхнем меню зайти в GameObject/3DObject/Cube. После выполнения этого действия у нас на сцене появится куб.

Чтобы сделать его похожим на дорогу, сделаем из него параллелепипед. Это можно сделать в панели инструментов выбрав ScaleTool.

Теперь нужно «натянуть» на нашу будущую дорогу текстуру. В корневой папке у нас находится картинка дороги, перетащите ее на наш параллелепипед. 

Сцена почти готова, остается перетащить MainCameraв CarWhiteдля того чтобы закрепить камеру за игроком.

Теперь добавим физику. Нажимаем на игрока (в нашем случае на белую машину) и добавляем ей компонент Rigidbody. Для дороги выбираем BoxCollider.

Следующим шагом будет расположение дороги подальше от машины, позже поймете почему.

Как сделать свою 3D игру на Unity

Теперь пришло время писать скрипты. Для начала напишем скрипт для движения игрока вперед. Создаем скрипт в панели проекта при помощи нажатия ПКМ и выбора Create/C# Scrypt, и даем ему имя move. Чтобы редактировать скрипт, просто нажмите на него 2 раза ЛКМ, после чего он откроется в текстовом редакторе или редакторе кода.

Код move.cs

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

 

public class move : MonoBehaviour

{

    public float speed = 10f; // скоростьдвижения

    public float horizontalSpeed = 5f; // Скоростьдвижениявбок

 

    void Start()

    {

       

    }

 

    void Update()

    {

        // Двигаеммашинувперёдпоеёлокальнойоси Z (двигаеммашинувперед)

        transform.Translate(Vector3.forward * speed * Time.deltaTime);

    }

}

Теперь машина постоянно движется вперед. Но из за того что у нас короткая дорога она сразу падает в пустоту. Чтобы создать иллюзию нескончаемой дороги, напишем скрипт для ее бесконечной генерации. Но чтобы не перегружать ваш ПК, нужно оптимизировать процессы и для этого используем такой подход, как удаление пройденного расстояния. Для этого создадим новый скрипт под названием RoadGenerator.

Код RoadGenerator.cs

              

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

 

public class RoadGenerator : MonoBehaviour

{

    public GameObject roadPrefab;         // Префабдороги

    public Transform player;              // Ссылканаигрокаилимашину

    public float roadLength = 20f;        // Длинаодногосегмента

    public int numberOfRoads = 10;         // Сколькодержатьнасцене

 

    private float spawnZ = 0f;

    private List<GameObject> activeRoads = new List<GameObject>();

 

    void Start()

    {

        for (int i = 0; i < numberOfRoads; i++)

        {

            SpawnRoad();

        }

    }

 

    void Update()

    {

        // Еслиигрокпроехалдалеко, создаёмновыйсегмент

        if (player.position.z > spawnZ - numberOfRoads * roadLength)

        {

            SpawnRoad();

            DeleteOldRoad();

        }

    }

 

    void SpawnRoad()

    {

        GameObject road = Instantiate(roadPrefab, new Vector3(0, 0, spawnZ), Quaternion.identity);

        activeRoads.Add(road);

        spawnZ += roadLength;

    }

 

    void DeleteOldRoad()

    {

        Destroy(activeRoads[0]);

        activeRoads.RemoveAt(0);

    }

}

Чтобы скрипт заработал, создадим пустой объект и присвоим ему данный скрипт, для этого в иерархии нажимаем ПКМ, выбираем CreateEmpty и даем ему имя RoadManager. После этого на сцене появится пустой объект. Теперь перетащим этот скрипт в RoadManager. Теперь в инспекторе Менеджера дороги в разделе roadPrefab выбираем нашу дорогу, а в Player выбираем нашего игрока. Так же важно игроку добавить тег Player, чтобы все заработало. Это можно сделать в инспекторе в левом верхнем углу. Если все сделано правильно, то после запуска игры машины будет ехать по вечно генерирующийся дороге.

Как сделать свою 3D игру на Unity

Если у вас дорога генерируется слишком медленно или быстро, то в RoadManager поменяйте параметры RoadLength иNumberofRoads, а также длину самой дороги.

Теперь изменим скрипт move, чтобы игрок мог двигаться вправо и влево. Для этого, в Updateдобавим следующие строки:

floathorizontalInput = Input.GetAxis("Horizontal"); // ← или →, A/D

transform.Translate(Vector3.right * horizontalInput * horizontalSpeed * Time.deltaTime);

Как сделать свою 3D игру на Unity

В конечном итоге у нас должно полностью работать движение автомобиля.

       

Но какая гонка без препятствий? Для этого в папке Azerilo/HQRacingCarModels/Prefab найдем еще 2 модели машин и добавим их на сцену. Чтобы препятствия появлялись в случайном порядке перед игроком, добавим скрипт ObstacleSpawner.

КодObstacleSpawner.cs

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

 

public class ObstacleSpawner : MonoBehaviour

{

    public GameObject[] obstaclePrefabs;  // Массивпрефабовпрепятствий

    public float spawnInterval = 2f;      // Интервалмеждуспавнами

    public float spawnZ = 50f;            // Дистанция по Z перед игроком

    public float roadWidth = 6f;          // Половина ширины дороги

    public Transform player;              // Ссылканаигрока

 

    void Start()

    {

        StartCoroutine(SpawnObstacles());

    }

 

    IEnumerator SpawnObstacles()

    {

        while (true)

        {

            yield return new WaitForSeconds(spawnInterval);

 

            // Выбор случайной позиции по X (в пределах дороги)

            float randomX = Random.Range(-roadWidth, roadWidth);

 

            // Выборслучайногопрефаба

            int prefabIndex = Random.Range(0, obstaclePrefabs.Length);

 

            Vector3 spawnPosition = new Vector3(randomX, 0f, player.position.z + spawnZ);

 

            Instantiate(obstaclePrefabs[prefabIndex], spawnPosition, Quaternion.identity);

        }

    }

}

Как сделать свою 3D игру на Unity


Для того чтобы скрипт заработал, создадим пустой объект и назовем его ObstacleSpawner. После чего перетащим этот скрипт в ObstacleSpawner. Теперь настроим сам скрипт. В нашей игре будет всего 2, постоянно появляющихся препятствия - это черная и синяя машины. В разделе Sizeвписываем значение 2 и в списке снизу выберем наши препятствия. Задаем интервал появления (SpawnInterval) = 2, SpawnZ = 50, Roadwidth(в зависимости от длинны вашей дороги) = 2 и выберем нашего игрока.

 

Если все сделано правильно, то перед игроком должны появляться в случайном порядке машины перед игроком.

 

Теперь, сделаем так, чтобы при касании препятствий игра завершалась. Сделаем мы это с помощью добавления нового скрипта под названием PlayerCollision.


Код PlayerCollision.cs

 

using UnityEngine;

using UnityEngine.SceneManagement;

          

public class PlayerCollision : MonoBehaviour

{

    void OnTriggerEnter(Collider other)

    {

        if (other.CompareTag("Enemy"))

        {

            UnityEditor.EditorApplication.isPlaying = false;

            Application.Quit();

        }

    }

}

Но этого будет мало. Чтобы скрипт заработал его нудно добавить в Player и задать препятствиям тег Enemy.

                   

Поздравляем! Вы на финишной прямой! Осталось добавить только таймер, который будет замерять время, которое вы проехали. Чем больше, тем вы круче!

 

Нажимаем ЛКМ по иерархии, выбираем пункт UI, нажимаем Text и задаем ему имя TimerText. Важно, что при создании интерфейса у вас в иерархии появится Canvas, а в нем уже сам текст, именно этот текст мы и будем редактировать. На сцене должно появится окно с текстом. Этот текст можно расположить по своему усмотрению. В инспекторе можно задать нужную вам ширину, размер, шрифт, цвет и т.д.

Создадим скрипт Timer.

Код Timer.cs

 

using UnityEngine;

using UnityEngine.UI;

 

public class Timer : MonoBehaviour

{

    public Text timerText;      // Ссылкана UI текст

    private float timeElapsed;  // Прошедшеевремя

 

    void Update()

    {

        timeElapsed += Time.deltaTime;

        //Debug.Log("Time: " + timeElapsed);

 

        int minutes = Mathf.FloorToInt(timeElapsed / 60f);

        int seconds = Mathf.FloorToInt(timeElapsed % 60f);

 

        timerText.text = string.Format("{0:00}:{1:00}", minutes, seconds);

    }

}

Создаем на сцене пустой объект под именем TimeManager и прикрепляем к нему этот скрипт. В пункте TimerTextвыбираем текст, который вы создали ранее.

                                                                                                      

Если у вас что-то не работает, внимательнее перечитайте статью. Если у вас не получается решить возникшую проблему то вот файл проекта, в котором вы можете посмотреть всю его структуру.

 

Готово! Поздравляем! Вы только что создали полноценную 3D игру с очень интересными и довольно сложными механиками.

 

Автор статьи: Константин Масальцев, ученик "САИКТ" на курсе "Проектная деятельность"