Каждый разработчик хочет быстрее создать свою игру, но как сделать это? В этой статье рассмотрены базовые навыки, позволяющие сократить время разработки в среде Unity.
Навык #1 — Работа со структурой проекта
Для поддержания порядка в проекте требуется разобраться с его структурой. Она может быть представлена в следующем виде:
- Models — хранит все модели, используемые в проекте
- Prefabs — хранит все шаблоны моделей
- Textures — хранит все текстуры
- Materials — хранит все материалы
- Scripts — хранит все скрипты
- Sounds — хранит все звуки
- Animations — хранит все анимации
Если у Вас есть сложные объекты, например, персонаж, для него создается отдельная папка, где повторяется вышеописанная структура.
Структура папки персонажа
Другим подходом будет создание вышеописанных папок, и размещение в каждой папке частей объекта, то есть для анимации персонажа будет следующая структура.
Структура папки анимаций
Навык #2 — Работа с иерархией объектов на сцене
Для упрощения работы с наборами одинаковых объектов их можно объединять в группы, где в качестве родителя выступает пустой объект.
Это поможет легко отключить свет на всей локации или в помещении. Узнать месторасположение всех объектов.
Каждый элемент называется относительно того, что он из себя представляет, в конце добавляется префикс родительского объекта. Например, золотой слиток в пещере будет носить название «goldBar_cv1», где cv1 обозначает cave1, а дерево в лесу «tree_frt1», где frt1 обозначает forest1. Для префикса берется первая буква слова, первая буква второго слога и последняя буква слова.
Пример иерархии объектов на сцене
Навык #3 — Работа с визуальным представлением
В Unity имеется 3 основных источника света:
- Естественный свет (Directional Light) — аналог Солнца
- Точечный свет (Point Light) — аналог лампочки
- Прожектор (Spotlight) — аналог фонарика
Если есть свет, значит должен быть источник света. Например, в пещере не может быть светло, если у персонажа нет факела (для факела подойдет точечный свет).
Используйте PostProcessing для наложения эффектов.
Сцена без постобработки
Сцена с постобработкой
Навык #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;
}
}
Навык #6 — Импорт моделей
Рассмотрим порядок действий на примере импорта модели из Blender. Предполагается, что Вы уже сделали развертку, нанесли текстуру или выбрали материалы.
- Расположить модель в нулевых координатах (центрировать относительно осей)
- Установить масштаб (Scale) равным единице
- Удалить лишние объекты (камера, источник света)
- Сохранить модель в формате .fbx
- Перенести файл в Unity
- Растащить по папкам — Модель к Моделям, Материал к Материалам и т.д.
- Создать префаб модели
- Работать дальше с префабами
Навык #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!");
}
}
}
}
Прочитать больше о дорогостоящих операций можно здесь.
Заключение
Вышеперечисленные навыки позволят значительно сократить время как во время разработки, так и во время сопровождения проекта.
Если Вы считаете, что какие-то темы раскрыты поверхностно, просьба написать в комментариях о них поподробнее.
Автор: Алексей Охотниченко