1. Основы Unity и создание мира: ландшафт, освещение и базовое движение персонажа
Основы Unity и создание мира: ландшафт, освещение и базовое движение персонажа
Добро пожаловать на курс «Создание 3D RPG на Unity с нуля». Я рад приветствовать вас в начале этого увлекательного пути. RPG (Role-Playing Game) — это один из самых сложных, но и самых интересных жанров в разработке игр. Мы будем строить наш мир шаг за шагом, начиная с фундамента.
В этой первой статье мы не будем сразу писать сложную систему инвентаря или диалогов. Сначала нам нужно подготовить почву — буквально и фигурально. Мы разберемся с интерфейсом Unity, создадим ландшафт нашего будущего фэнтезийного мира, настроим солнце и научим простую капсулу (нашего временного героя) перемещаться по этому миру.
Знакомство с Unity: Инструментарий творца
Unity — это игровой движок, который берет на себя огромную часть технической работы: рендеринг графики, физику, звук и управление памятью. Это позволяет нам сосредоточиться на геймплее и истории.
После установки Unity Hub и создания нового 3D-проекта, перед вами откроется интерфейс редактора. Он может показаться пугающим, но давайте разделим его на понятные зоны.
!Схема основных окон редактора Unity для быстрой ориентации.
Основные окна:
Создание ландшафта (Terrain)
Любая RPG начинается с мира. В Unity для создания больших открытых пространств используется инструмент Terrain.
Чтобы создать землю:
3D Object -> Terrain.Теперь у вас есть огромная плоская поверхность. Но мир RPG не бывает плоским. Нам нужны горы, долины и реки. В Инспекторе объекта Terrain есть инструменты кисти (Paint Terrain).
Скульптинг мира
Выбрав инструмент «Raise or Lower Terrain» (Поднять или опустить ландшафт), вы можете рисовать горы прямо на сцене. Это похоже на лепку из цифровой глины.
> Хороший левел-дизайн начинается не с деталей, а с крупных форм. Сначала наметьте горы, ограничивающие карту, затем холмы, и только потом — мелкие неровности.
С точки зрения математики, ландшафт в компьютерной графике часто представляется как карта высот (Heightmap). Это двумерный массив данных, где каждая точка имеет координату высоты.
Если представить наш ландшафт как функцию , то высота в любой точке зависит от координат и на плоскости.
Где — функция высоты ландшафта, и — горизонтальные координаты точки на карте, а — итоговая высота этой точки в 3D пространстве.
Освещение: Создаем атмосферу
Без света наш мир будет черным. В Unity по умолчанию создается объект Directional Light. Это наше солнце.
Типы источников света, которые нам пригодятся в будущем: * Directional Light: Имитирует солнце. Лучи параллельны и освещают всю сцену равномерно, независимо от положения источника. * Point Light: Лампочка или костер. Светит во все стороны из одной точки. * Spot Light: Фонарик или прожектор. Светит конусом.
Для начала нам достаточно настроить Directional Light. Выберите его в иерархии и в Инспекторе измените Rotation (Вращение). Вы увидите, как меняется время суток: тени удлиняются, небо меняет цвет (благодаря процедурному скайбоксу Unity).
Создание персонажа: Физика и Геометрия
Пока у нас нет красивой 3D-модели рыцаря или мага, мы будем использовать «прототип» — капсулу. Это стандартная практика в индустрии, называемая «грейбоксинг» (greyboxing).
Hierarchy -> Right Click -> 3D Object -> Capsule.Компонент Rigidbody
Чтобы наш персонаж подчинялся законам физики (падал вниз, сталкивался со стенами), нам нужно добавить компонент Rigidbody.
Add Component.Rigidbody.Constraints и поставьте галочки на Freeze Rotation X и Freeze Rotation Z. Это нужно, чтобы наша капсула не падала и не катилась как бочка, а всегда оставалась вертикальной.Теперь, если вы нажмете кнопку Play (сверху по центру), капсула упадет на землю под действием гравитации.
Программирование движения
Чтобы капсула двигалась по нашей воле, нам нужен скрипт. В Unity используется язык C#.
Create -> C# Script.PlayerController (без пробелов!).Код движения
Напишем простой код для перемещения. Удалите всё содержимое и вставьте следующее:
Разбор логики и математики движения
Давайте разберем, что происходит в строке transform.Translate. Мы используем векторную алгебру для вычисления новой позиции.
В трехмерном пространстве положение описывается вектором . Когда мы хотим переместить объект, мы прибавляем к его текущей позиции вектор смещения.
Формула обновления позиции выглядит так:
Где:
* — новая позиция объекта (вектор ).
* — текущая позиция объекта.
* — вектор направления движения (полученный от нажатия клавиш, например при движении вправо).
* — скорость движения (наша переменная speed).
* — время, прошедшее с последнего кадра (Time.deltaTime).
!Иллюстрация того, как вычисляется новая позиция персонажа в каждом кадре.
Почему важно умножать на Time.deltaTime?
Компьютеры работают с разной скоростью. У одного игрока игра выдает 60 кадров в секунду (FPS), у другого — 30. Метод Update() вызывается каждый кадр. Если мы будем просто прибавлять скорость, то игрок с 60 FPS будет бегать в два раза быстрее игрока с 30 FPS. Умножение на время, прошедшее между кадрами (), делает скорость движения независимой от частоты кадров. Если кадров много, маленький. Если кадров мало, большой. В итоге пройденное расстояние за секунду будет одинаковым.
Заключение
Поздравляю! Вы сделали первый шаг к созданию своей RPG. У вас есть мир (Terrain), есть солнце (Directional Light) и есть герой (Capsule), который умеет бегать по этому миру, подчиняясь законам физики.
В следующей статье мы заменим скучную капсулу на настоящую 3D-модель персонажа, добавим анимации бега и покоя, а также научим камеру следовать за героем, как в настоящих играх от третьего лица.