Доброго времени суток, уважаемые хабаровчане!

Каждый разработчик хочет быстрее создать свою игру, но как сделать это? В этой статье рассмотрены базовые навыки, позволяющие сократить время разработки в среде Unity.

Навык #1 — Работа со структурой проекта


Для поддержания порядка в проекте требуется разобраться с его структурой. Она может быть представлена в следующем виде:

  1. Models — хранит все модели, используемые в проекте
  2. Prefabs — хранит все шаблоны моделей
  3. Textures — хранит все текстуры
  4. Materials — хранит все материалы
  5. Scripts — хранит все скрипты
  6. Sounds — хранит все звуки
  7. Animations — хранит все анимации

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


Структура папки персонажа

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


Структура папки анимаций

Навык #2 — Работа с иерархией объектов на сцене


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

Это поможет легко отключить свет на всей локации или в помещении. Узнать месторасположение всех объектов.

Каждый элемент называется относительно того, что он из себя представляет, в конце добавляется постфикс родительского объекта. Например, золотой слиток в пещере будет носить название «goldBar_cv1», где cv1 обозначает cave1, а дерево в лесу «tree_frt1», где frt1 обозначает forest1. Для постфикс берется первая буква слова, первая буква второго слога и последняя буква слова.


Пример иерархии объектов на сцене

Навык #3 — Работа с визуальным представлением


В Unity имеется 3 основных источника света:

  1. Естественный свет (Directional Light) — аналог Солнца
  2. Точечный свет (Point Light) — аналог лампочки
  3. Прожектор (Spotlight) — аналог фонарика

Если есть свет, значит должен быть источник света. Например, в пещере не может быть светло, если у персонажа нет факела (для факела подойдет точечный свет).

Используйте PostProcessing для наложения эффектов.

image
Сцена без постобработки

image
Сцена с постобработкой

UPD от thenonsense:

Кроме визуально представленных источников света есть ещё глобальные настройки света: вкладка сверху Window, пункт Lighting, подпункт Settings. Там можно, например, подкрутить освещение окружения, установить скайбокс, добавить туман. Собственно, именно сюда нужно заглянуть, если вы задались вопросом «удалил все источники света, а на сцене всёравно светло, как днём». Кстати, в эти настройки можно залезать уже во время того, как в редакторе запущена игра, чтобы сразу, на лету, видеть изменения. Правда, после закрытия игрового режима настройки вернутся к тому состоянию, какими они были до запуска игрового теста. Так что придётся снова залезть в это окно и откорректировать значения. Полезная деталь — если вам, допустим, хотелось поменять цвет освещения (Ambient color в группе Environment Lighting), то на панели с палитрой обратите внимание на пункт Hexadecimal — там в окошке указан номер текущего цвета, можно скопировать его и позднее вставить в это же поле, когда игровой режим будет выключен. Этот же трюк пригодится для настройки цвета тумана и так далее.

Подобным же образом, находясь в запущенном в игровом режиме, можно менять какие-то параметры у объектов через редактор — значения переменных скриптов вынесенные в зону видимости, включение/отключение рендера сетки объекта и так далее. Главное не увлекаться, чтобы чего-либо не сломать. После выключения игрового режима изменённые значения восстановятся. Это не касается некоторых отдельных элементов, например, если вы во включенном игровом режиме редактировали текстуру террайна, то её изменения сохранятся.


Навык #4 — Работа с камерой


Нужно найти объект на сцене? Кликните 2 раза по имени объекта в иерархии.

Хотите пролететь по сцене от 1 лица? Зажмите ПКМ и перемещайтесь клавишами WASD, на Shift ускорение.

Требуется посмотреть сцену с разных углов? Воспользуйтесь Гизмо (Gizmos).


Расположение Гизмо

Навык #5 — Работа с объектами


Хотите добавить персонажа на сцену? Добавьте компоненты RigidBody и CapsuleCollaider. RigidBody говорит движку, что к этому объекту должна применяться физика твердого тела.

Хотите проверить столкновение персонажа с объектом? Добавьте объекту компонент MeshCollaider и в скрипте персонажа в функции OnCollisionEnter проверяйте тег (tag) объекта, с которым столкнулся персонаж.

Пример реализации проверки столкновения персонажа с объектом
    private void OnCollisionEnter(Collision collision)
    {
        switch (collision.gameObject.tag)
        {
            case "Moneys":
                Destroy(collision.gameObject);

                // Do something
                break;
            case "TrapSpikes":
                hitPoints -= 5.5;

                break;
        }
    }



UPD от thenonsense:
Не всегда для персонажа требуется использовать rigidbody, методы управления могут быть разные. А вот коллайдер для персонажа потребуется почти всегда, если только вы не собрались высчитывать столкновения более хитрым способом. Так же в Unity есть несколько специфических контроллеров/коллайдеров — лучше почитать документацию, чтобы подробнее в них разобраться. Но начать лучше с простых примеров на ютубе.

Что касается тех объектов, с которыми персонаж сталкивается. Mesh Collider обычно следует вешать на те объекты, сложная форма которых вам так или иначе важна для учёта столкновения. Если это просто кнопка, то лучше обойтись коллайдерами попроще, вроде Box Collider. Кроме того вам, возможно, придётся для особо сложных 3д объектов делать более простую, невидимую, сетку столкновений и вешать Mesh Collider на неё, а не на сам видимый объект.

Про кнопки-коллайдеры стоит помнить, что в их компоненте коллайдера нужно поставить флажок на пункт Is Trigger, чтобы скрипт вобще мог обработать событие нажатия. Всяким бочкам, ящикам и прочим объектам, которые должны просто красиво физически реагировать на столкновения и падать под действием гравитации надо назначать компонент rigidbody.


Навык #6 — Импорт моделей


Рассмотрим порядок действий на примере импорта модели из Blender. Предполагается, что Вы уже сделали развертку, нанесли текстуру или выбрали материалы.

  1. Расположить модель в нулевых координатах (центрировать относительно осей)
  2. Установить масштаб (Scale) равным единице
  3. Удалить лишние объекты (камера, источник света)
  4. Сохранить модель в формате .fbx
  5. Перенести файл в Unity
  6. Растащить по папкам — Модель к Моделям, Материал к Материалам и т.д.
  7. Создать префаб модели
  8. Работать дальше с префабами


UPD от thenonsense:

Blender


Обратите внимание, что если на модель назначены материалы блендера, то они в упрощённом виде перенесутся тоже и будут захламлять список материалов.
Можно вовсе не делать сложные развёртки и текстурирование в Blender'е — более простой способ это пройтись по всем элементам модели и для каждой выбрать в окне справа пункт Data. Это значок в виде смотрящего вниз треугольника с тремя точками, между пунктами Modifiers (гаечный ключ) и Material (розовый шарик). В нём нажимаете на + рядом с графой UV Maps — там появляется автоматическая развёртка со значком шахматного шарика. Это нужно сделать для каждого элемента модели и только после этого делать экспорт. Тогда уже в Unity на эту деталь можно будет наложить материал с тайловой текстурой, а если этого не сделать, то материал будет лишь окрашивать деталь в сплошной цвет. (Если вы позднее деформировали элемент модели, то сбросьте развёртку и переназначьте заново, чтобы она не была растянутой).

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

Как по-простому текстурировать модель.


Для начала вам хватит каких-нибудь тайловых текстур 512 на 512. Добавляете её так же, как и 3д модель, через Import New Asset (помните, что должна быть выбрана подходящая папка). При этом справа, в инспекторе, у добавленной текстуры в окне Default выставляете параметр Max Size в 512. И затем жмёте Apply. Теперь текстура готова для того, чтобы добавить её в материал или, допустим, ею теперь можно раскрашивать террайн. Обратите внимание на самый первый пункт — Texture Type, сейчас он в дефолтном режиме, но когда вам понадобится загрузить карту нормали, изображение для полупрозрачного спрайта, и так далее, то потребуется там выставить соответствующую настройку.
Далее нам понадобится создать материал. Заходим опять в меню сверху — Assets, выпадающий список Create, Material (опять не забудьте, что материал создастся в той папке, которая выбрана сейчас). Вбиваете название материала и в инспекторе открываете пункт Albedo (на других параметрах пока не будем останавливаться, но принцип схож), где ищете и назначаете свою ранее загруженную текстуру. Рядом есть окошко цвета, которым можно дополнительно подкрасить вашу текстуру, а также ползунки Metalic и Smoothness, чтобы добавить блики или матовость. Также пригодится параметр размера тайлов Tiling, он находится на несколько строк ниже.
После того как материал создан можно хватать его и перекидывать прямо на модель или её элементы, только не промахнитесь, а то покрасите не то, что нужно.

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

Префабы.


Обычно префаб делается примерно так — перетащили объект на сцену, потом зацепили его имя в окне иерархии и перетащили внутрь папки. Тогда там появится префаб на основе объекта, в инспекторе у префаба будет значок синего кубика и ниже тега будет так и подписано, Prefab.
Однако, вам незачем обязательно сразу всё делать префабами. Вы можете бросить объект на сцену, затем расклонировать его копипастом и тестировать прямо так. Если всё устраивает, то переводите объект в префаб, если нет, например в модели выявился какой-то баг, то удаляете её копии со сцены, саму модель из папки, исправляете в 3д пакете и импортируете заново.

Вы также можете засунуть внутрь префаба, выставленного на сцену, какие-то новые дочерние элементы. При этом они не станут полноценной его частью, то есть не повлияют на прочие копии этого префаба, пока вы не нажмёте кнопку Apply в инспекторе на строчке с названием Prefab.


Навык #7 — Реализация логики


Избегайте выполнения дорогостоящих операций. Примером может служить определение расстояния до объекта.

Пример с дорогостоящей операцией
using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour
{
    public Transform other;

    void Example()
    {
        if (other)
        {
// Считаем квадратный корень из суммы квадратов
// В данном случае квадратный корень является дорогостоящей операцией
            float dist = Vector3.Distance(other.position, transform.position); 
            print("Distance to other: " + dist);
        }
    }
}


Пример более быстрой реализации
using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour
{
    public Transform other;
    public float closeDistance = 5.0f;

    void Update()
    {
        if (other)
        {
            Vector3 offset = other.position - transform.position;
 // Считаем только сумму квадратов
            float sqrLen = offset.sqrMagnitude;

            // Возводим в квадрат расстояние, с которым мы сравниваем
            if (sqrLen < closeDistance * closeDistance)
            {
                print("The other transform is close to me!");
            }
        }
    }
}


Прочитать больше о дорогостоящих операций можно здесь.

Заключение


Вышеперечисленные навыки позволят значительно сократить время как во время разработки, так и во время сопровождения проекта.

Если Вы считаете, что какие-то темы раскрыты поверхностно, просьба написать в комментариях о них поподробнее.

Комментарии (10)


  1. dobrev
    20.07.2019 19:27

    Если Вы считаете, что какие-то темы раскрыты поверхностно, просьба написать в комментариях о них поподробнее.

    Недостаточно раскрыта тема целесообразности использования шрифта Comic Sans. Раскройте для новичков подробнее, пожалуйста.


  1. Griboks
    21.07.2019 00:02

    Ваш OnCollisionEnter вряд ли заработает с первого раза. Ну а на самом деле, я бы посоветовал почитать оф. документацию вместо этой статьи.


    1. alekseyHunter Автор
      21.07.2019 08:52

      Ваш OnCollisionEnter вряд ли заработает с первого раза.

      Можно поподробнее. У меня работает хорошо.



      я бы посоветовал почитать оф. документацию вместо этой статьи.

      Напоминает выражение «Гугл в помощь». Вы предлагаете прочитать сначала всю документацию, прежде чем разработчик начнет что-то делать?


      1. Griboks
        21.07.2019 10:04

        Не всю, а руководство начинающего. На это уйдёт не более получаса.

        Можно поподробнее

        Необходимо правильно подобрать параметры rigidbody, collider (и подобрать его). Если, например, вы сделаете пулю, то она просто пролетит сквозь персонажа, т. к. она двигается быстрее fps*colliderSize.


      1. alex_zzzz
        23.07.2019 16:13

        Вы предлагаете прочитать сначала всю документацию, прежде чем разработчик начнет что-то делать?

        Ровно так и сделал, когда выбирал-перебирал движки. Когда дошла очередь до Unity, потыкал в интерфейс, посмотрел всякие демки, подумал "кажется это оно", и полез читать мануал от начала до конца. Простые темы — целиком, сложные для восприятия — по диагонали, чтобы иметь общее представление и знать, куда в будущем смотреть. Всего пару дней/вечеров заняло. Сняло много глупых вопросов и дало много идей, что и какими способами можно сделать.


        Чтение мануала позволяет быстро превратиться из тупого слепого котёнка в новичка. Экономит больше времени, чем занимает. Рекомендую.


  1. thenonsense
    21.07.2019 12:53
    +6

    Стоило бы упомянуть, что добавление своего контента в проект (модели, текстуры, звуки и прочее) происходит через вкладку Assets вверху экрана. Через пункт Import New Asset... При этом стоит следить, чтобы в списке папок проекта перед этим действом была выбрана нужная, куда вы хотите сбросить этот файл. Если лень заводить свои папки, то хотя бы выбирать саму папку Assets — там его проще будет потом найти.

    Кроме визуально представленных источников света есть ещё глобальные настройки света: вкладка сверху Window, пункт Lighting, подпункт Settings. Там можно, например, подкрутить освещение окружения, установить скайбокс, добавить туман. Собственно, именно сюда нужно заглянуть, если вы задались вопросом «удалил все источники света, а на сцене всёравно светло, как днём». Кстати, в эти настройки можно залезать уже во время того, как в редакторе запущена игра, чтобы сразу, на лету, видеть изменения. Правда, после закрытия игрового режима настройки вернутся к тому состоянию, какими они были до запуска игрового теста. Так что придётся снова залезть в это окно и откорректировать значения. Полезная деталь — если вам, допустим, хотелось поменять цвет освещения (Ambient color в группе Environment Lighting), то на панели с палитрой обратите внимание на пункт Hexadecimal — там в окошке указан номер текущего цвета, можно скопировать его и позднее вставить в это же поле, когда игровой режим будет выключен. Этот же трюк пригодится для настройки цвета тумана и так далее.

    Подобным же образом, находясь в запущенном в игровом режиме, можно менять какие-то параметры у объектов через редактор — значения переменных скриптов вынесенные в зону видимости, включение/отключение рендера сетки объекта и так далее. Главное не увлекаться, чтобы чего-либо не сломать. После выключения игрового режима изменённые значения восстановятся. Это не касается некоторых отдельных элементов, например, если вы во включенном игровом режиме редактировали текстуру террайна, то её изменения сохранятся.

    Не думаю, что начинающим понадобится постпроцессинг. Лучше им для начала знать, что чтобы повесить новые компоненты на объект надо выбрать его и справа, в инспекторе нажать на кнопку Add Component. Она располагается ниже всех прочих прикреплённых к объекту компонентов. В открывшемся списке компоненты разбиты на группы, тут же вы найдёте и скрипты, включая ваши собственные.

    Не всегда для персонажа требуется использовать rigidbody, методы управления могут быть разные. А вот коллайдер для персонажа потребуется почти всегда, если только вы не собрались высчитывать столкновения более хитрым способом. Так же в Unity есть несколько специфических контроллеров/коллайдеров — лучше почитать документацию, чтобы подробнее в них разобраться. Но начать лучше с простых примеров на ютубе.

    Что касается тех объектов, с которыми персонаж сталкивается. Mesh Collider обычно следует вешать на те объекты, сложная форма которых вам так или иначе важна для учёта столкновения. Если это просто кнопка, то лучше обойтись коллайдерами попроще, вроде Box Collider. Кроме того вам, возможно, придётся для особо сложных 3д объектов делать более простую, невидимую, сетку столкновений и вешать Mesh Collider на неё, а не на сам видимый объект.

    Про кнопки-коллайдеры стоит помнить, что в их компоненте коллайдера нужно поставить флажок на пункт Is Trigger, чтобы скрипт вобще мог обработать событие нажатия. Всяким бочкам, ящикам и прочим объектам, которые должны просто красиво физически реагировать на столкновения и падать под действием гравитации надо назначать компонент rigidbody.

    Для импорта моделей из Blender, как уже говорилось, лучше делать экспорт модели в формат fbx. Формат blend Unity тоже поймёт, но fbx предпочтительнее. Перед экспортом убедитесь, что вы убрали лампы и камеры со сцены (можно посмотреть в аутлайнере на предмет невидимых/скрытых элементов). Обратите внимание, что если на модель назначены материалы блендера, то они в упрощённом виде перенесутся тоже и будут захламлять список материалов.
    Можно вовсе не делать сложные развёртки и текстурирование в Blender'е — более простой способ это пройтись по всем элементам модели и для каждой выбрать в окне справа пункт Data. Это значок в виде смотрящего вниз треугольника с тремя точками, между пунктами Modifiers (гаечный ключ) и Material (розовый шарик). В нём нажимаете на + рядом с графой UV Maps — там появляется автоматическая развёртка со значком шахматного шарика. Это нужно сделать для каждого элемента модели и только после этого делать экспорт. Тогда уже в Unity на эту деталь можно будет наложить материал с тайловой текстурой, а если этого не сделать, то материал будет лишь окрашивать деталь в сплошной цвет. (Если вы позднее деформировали элемент модели, то сбросьте развёртку и переназначьте заново, чтобы она не была растянутой).

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

    Как по-простому текстурировать модель. Для начала вам хватит каких-нибудь тайловых текстур 512 на 512. Добавляете её так же, как и 3д модель, через Import New Asset (помните, что должна быть выбрана подходящая папка). При этом справа, в инспекторе, у добавленной текстуры в окне Default выставляете параметр Max Size в 512. И затем жмёте Apply. Теперь текстура готова для того, чтобы добавить её в материал или, допустим, ею теперь можно раскрашивать террайн. Обратите внимание на самый первый пункт — Texture Type, сейчас он в дефолтном режиме, но когда вам понадобится загрузить карту нормали, изображение для полупрозрачного спрайта, и так далее, то потребуется там выставить соответствующую настройку.
    Далее нам понадобится создать материал. Заходим опять в меню сверху — Assets, выпадающий список Create, Material (опять не забудьте, что материал создастся в той папке, которая выбрана сейчас). Вбиваете название материала и в инспекторе открываете пункт Albedo (на других параметрах пока не будем останавливаться, но принцип схож), где ищете и назначаете свою ранее загруженную текстуру. Рядом есть окошко цвета, которым можно дополнительно подкрасить вашу текстуру, а также ползунки Metalic и Smoothness, чтобы добавить блики или матовость. Также пригодится параметр размера тайлов Tiling, он находится на несколько строк ниже.
    После того как материал создан можно хватать его и перекидывать прямо на модель или её элементы, только не промахнитесь, а то покрасите не то, что нужно.

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

    Префабы. Обычно префаб делается примерно так — перетащили объект на сцену, потом зацепили его имя в окне иерархии и перетащили внутрь папки. Тогда там появится префаб на основе объекта, в инспекторе у префаба будет значок синего кубика и ниже тега будет так и подписано, Prefab.
    Однако, вам незачем обязательно сразу всё делать префабами. Вы можете бросить объект на сцену, затем расклонировать его копипастом и тестировать прямо так. Если всё устраивает, то переводите объект в префаб, если нет, например в модели выявился какой-то баг, то удаляете её копии со сцены, саму модель из папки, исправляете в 3д пакете и импортируете заново.

    Вы также можете засунуть внутрь префаба, выставленного на сцену, какие-то новые дочерние элементы. При этом они не станут полноценной его частью, то есть не повлияют на прочие копии этого префаба, пока вы не нажмёте кнопку Apply в инспекторе на строчке с названием Prefab.


  1. besisland
    21.07.2019 19:49
    +3

    в конце добавляется префикс

    Замечу, что префикс по определению добавляется в начале (перед чем-то, pre). В данном случае добавляется суффикс (постфикс).


  1. marsermd
    21.07.2019 22:51

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


    1) Очень поверхностно
    2) Слишком широко
    3) Местами просто неверно


    Первое отметает даже людей с месяцем-другим опыта работы с Юнити.


    Второе размывает вашу аудиторию.
    Это статья для программистов? Тогда зачем экспорт из блендера?
    Для художников? Тогда зачем код?


    Третий пункт отметает полных новичков — потенциальный вреда от неправильного совета перевешивает пользу от поверхностных описаний.


    1. alekseyHunter Автор
      22.07.2019 09:47

      marsermd, Благодарю за объяснение.

      1) Очень поверхностно

      Согласен, буду писать более развернуто в спойлерах.

      2) Слишком широко

      А расширение компетенции плохо для читающих?

      3) Местами просто неверно

      Человек не может знать абсолютно все. Выбор каждого инструмента разработки будет находить положительные оценки у одной части аудитории и отрицательные у другой.
      И как гласит пословица, тот не ошибается, кто ничего не делает.
      Буду искать людей, которые могли бы указать на ошибки в статьях до публикации.


  1. DizzyJump
    23.07.2019 11:34
    +1

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

    А вот сами юнитеки советуют так НЕ делать, т.к. движение любого трансформа в иерархии помечает всю иерархию как требующую пересчёта, что в итоге приведёт к тратам ресурсов на обновление даже тех трансформов которые не двигаются.
    Тоже вместо этой статьи порекомендовал бы документацию и официальный канал Unity на ютюбе, там просто тьма разных гайдов и best practicies почти на любую тему