Как сделать управление персонажем в unity3d через character controller

Обновлено: 07.07.2024

Данный урок рассчитан на тех, кто ознакомился с первым уроком (ссылка) от pax и
уже имеет начальные представления о Unity и его редакторе. Так же предполагается,
что читающие умеют программировать на любом из языков программирования, немного
знают об объектно-ориентированном программировании и английском языке.

1. Создание проекта
Запускаем Unity и видим последний сохраненный проект, загружаемый по умолчанию.
Отмечу, что если при загрузке Unity держать Alt, то откроется диалоговое окно,
где можно будет выбрать проект из ранее сохраняемых. Создадим новый проект.
При создании проекта будет выведен диалог, где спросят, какие стандартные пакеты
(packages) мы хотим использовать. Для данного урока потребуется только Character
Controller. Необходимые пакеты можно будет добавить после.

2. Создание и позиционирование объектов
Добавим на сцену, к уже имеющейся камере Main Camera, плоскость и куб.
Главное меню -> GameObject -> Create Other -> Cube и затем Plane.
После создания в окне Hierarchy (Иерархии объектов) добавятся два объекта.
Теперь надо спозиционировать камеру, плоскость и куб, так чтобы при нажатии на
"Play" на экране была плоскость и стоящий на ней куб.
Для этого выбираем камеру и в окне Inspector(Свойства), задаем параметры
X, Y, Z равными (0, 1, -5), для куба - (0, 1, 0) и для плоскости - (0, 0, 0).
Так же можно добавить точечный источник света
Главное меню -> GameObject -> Create Other -> Point Light
задав ему положение (0, 2, 0). Обратите внимание, что X - это положение объекта
по красной оси, Y (вертикаль) - по желтой, а Z - по синей.
Для плоскости Plane рекомендую задать параметр Scale (3, 3, 3).
Нажимаем "Play" и проверяем, что виден куб, подсвеченный сверху.
Отмечу, что для переключения между режимами игры и редактирования можно
использовать сочетание клавиш Ctrl + P.

  • Transform - информация о положении и ориентации объекта в пространстве
  • Mesh Filter - геометрическая модель, связанная с объектом
  • Box Collider - физическая модель, используемая для обработки физики
  • Mesh Renderer - компонент, используемый для вывода на экран

4. Добавление ресурсов
В окне редактора Project (Проект) создаем новую папку
Меню -> Create -> Folder
Заходим в папку и добавляем новый звук
Меню -> Import New Asset -> . (в открывшемся окне выбираем файл)
Далее выбираем на сцене Куб и из окна Project в параметр Audio Clip
перетаскиваем полученный файл.
Как понятно, данное окно отвечает за добавление новых ресурсов, таких как
текстуры, модели, аудио-файлы, скрипты, текстовые файлы и т.д. Которые
можно хранить по папкам, так как вам необходимо. Отмечу, что все созданные
папки и добавленные ресурсы будут находиться в директории проекта в папке
Assets (Ресурсы).
Нажимаем "Play", слушаем.

5. Добавление стандартных пакетов (packages)
При создании проекта выводится окно, где можно выбрать необходимые пакеты.
В основном это наиболее востребованные скрипты, реализующие ту или иную
функциональность, как например генерация ландшафтов, skybox и другие.
Для следующего шага потребуется наличие пакета Character Controller. Переходим
в окно Project и в папке Standard Assets находим Character Controller. Если
его нет, т.е. при создании проекта он не был выбран, то вызываем меню
Меню -> Import Package -> Character Controller.
Обратите внимание, что некоторые пакеты имеют приставку (Pro Only), означающую,
что пакет будет работать только в Pro-версии Unity.

6. Вид от первого лица или как двигать камеру
Выбираем камеру Main Camera на сцене и добавляем ей новый компоненты
Главное меню -> Component -> Character -> FPS Input Controller
Главное меню -> Component -> Camera Control -> Mouse Look
Первый компонент добавил камере перемещение клавиатурой, второй - обработку
мышки. Обратите внимание, что добавление первого скрипта привело к добавлению
еще двух компонент. Первая - Character Controller, описывающая капсулу, которая
будет считаться игроком для обработки столкновений с другими телами (в частности
куба и плоскости). Вторая - скрипт Character Motor, содержащий общий код, для
реализации ходьбы.
Нажимаем "Play" и проверяем.

Обратите внимание на конструкцию третьей строки, которая расшифровывается так
Общедоступный класс Health наследует все свойства и методы от класса MonoBehaviour,
т.е. класс Enemy расширяет базовый класс MonoBehaviour.
Как видим нам предлагается задать две функции - Start и Update. Первая из них, вызывается
когда объект класса MonoBehaviour, а значит и Enemy, создается на сцене, а вторая
вызывается каждый кадр.
Добавим классу открытую (public) переменную Health (Здоровье), отметку в консоль,
что объект создан, а так же функцию, которая будет вращать объект вокруг вертикали.

Сохраняем код и переходим в редактор Unity. Выбираем куб на сцене и добавляем компонент
Главное меню -> Component -> Scripts -> Enemy
Смотрим на свойства куба и видим, что у его компонента Enemy есть одно поле Health, которое
можно задать прямо в редакторе.
Добавляем в редакторе отображение консоли
Главное меню -> Window -> Console
Нажимаем "Play", контролируем, что в консоль вывелось "Enemy created" и куб вращается.

8. Поиск объектов и статические члены
Изменим компонент Enemy так, чтобы здоровье уменьшалось прямо пропорционально расстоянию
от объекта с этим компонентом до игрока. Игрок - это фактически объект "Main Camera", поэтому
чтобы найти его в коде используем следующую конструкцию

Обратите внимание, что имя объекта зависит от регистра символов, будьте аккуратны.
Расстояние между объектом (кубом) и игроком, тогда можем посчитать так

9. Программный доступ к компонентам объекта
Теперь сделаем так, чтобы если Health 10. Главный цикл Unity и обработка ввода
Многие, кто программирует, уже привыкли, что у программы должен быть главный цикл, в
котором вызываются функции отрисовки и обработки клавиатуры с мышкой. В Unity главный
цикл изолирован от программиста. Фактически, главный цикл последовательно проходит по
всем объектам и компонентам и вызывает у них функции Update() и FixedUpdate (). Первая
используется, если компоненту требуется синхронизация с выводом графики, вторая -
с расчетом физики.
Отмечу, что в Update() желательно использовать переменную Time.deltaTime,
содержащую сколько секунд прошло с предыдущего кадра.

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

Если в качестве KeyCode указать Mouse0 или Mouse1, то можно получить состояние кнопок
мышки.
Чтобы распознать клик мышкой надо использовать следующий код

Отмечу, что такие обработчики можно добавлять в классе того объекта, где вам это
необходимо. Подробнее о вводе можно прочитать в разделе Reference для класса Input.

11. Шаблоны объектов (Prefabs)
Зачастую на сцене может быть много однотипных объектов. Можно вручную создавать Empty
объекты и добавлять им необходимые компоненты, но Unity предлагает лучший способ -
использование шаблонов. Выглядит это так: создаем на сцене объект, задаем ему нужные
компоненты, а затем перетаскиваем объект из окна Hierarchy в окно Project. В результате
будет создан шаблон. Теперь, чтобы добавить сходные объекты, надо на сцену вытаскивать
шаблон из окна Project. При этом, создаваемые объекты в окне Hierarchy будут выделены
синим цветом, указывающим на то, что используется шаблон. Мы может в отдельности изменить
каждый из объектов, например добавив компоненты, однако в этом случае Unity предупредит,
что шаблон будет потерян, т.е. изменения внесенные в шаблон, не будут автоматически
применены к этому объекту.
Для изменения шаблона нужно выбрать его в окне Project, после чего можно будет удалять
или добавлять компоненты.

13. Где тени и полноэкранные эффекты? Или о Unity Pro
Плохая новость состоит в том, что бесплатная Unity имеет несколько ограничений, в частности не
поддерживает тени, полноэкранные эффекты, компиляцию под различные платформы и кое-что еще.
Со список отличий можно ознакомиться на сайте Unity. Хорошая новость в том, что keygen существует,
а так же лицензия на Unity стоит всего 45000руб, что для коммерческой разработки не так уж и много.

14. Пишем простой FPS
Для начала переименуем Cube в Enemy в окне Hierarchy, а затем перетащим из этого окна в окно
Project в созданную заранее папку Prefabs. Таким образом мы изготовили шаблон для врагов.
Теперь добавим на сцену сферу
Главное меню -> GameObject -> Create Other -> Sphere
Выставим ей значения Scale по всем осям 0.2 и переименовав в Bullet (снаряд), так же перенесем в окно
Projects в папку Prefabs.


Управление персонажем в 3D

  • Plane — это территория, по которой будет перемещаться наш персонаж.
  • Sphere — объект персонажа.



Создаем скрипт и даем ему название на английском языке.

  • movementSpeed — скорость передвижения.
  • turningSpeed — скорость поворота.
  • vertical — движение по вертикали.
  • horizontal — движение по горизонтали.



Управление персонажем в 2D

Для работы потребуется два спрайта — для персонажа и для земли. Перемещаем персонажа и землю на сцену. С помощью клавиш CTRL+D дублируем землю.



Создаем пустой объект. И в него перемещаем все объекты земли.



На пустой объект добавляем коллайдер. Add Component - Physics2D - BoxCollider. И с помощью инструмента Edit Collider настраиваем размеры.



Персонажу добавляем физику и коллайдер и так же настраиваем границы коллайдера.

  • maxSpeed — скорость персонажа
  • flipRight — направление спрайта персонажа.

Теперь отражаем наш спрайт в зависимости от того, в какую сторону движется наш персонаж. Условием If проверяем. Если нажали клавишу для перемещения вправо, а персонаж направлен влево, то поворачиваем спрайт вправо. С else if — обратная ситуация.

И теперь сама функция Flip. В ней мы отражаем спрайт по оси X и задаем размеры, чтобы из-за отражения не исказились размеры спрайта.

В школе “Пиксель” мы ведем полный курс обучения Unity 3D для детей и подростков. Изучая наши уроки Си Шарп, вы быстро освоите азы программирования и научитесь создавать свои игры.


Создаем скрипт PlayerControl

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

Всё достаточно просто. Различные детали, каждый сможет настроить под себя, плюс можно еще сделать материал для физики тела, например, чтоб увеличить коэффициент трения или наоборот, изменить массу Rigidbody, ну и прочее. В общем, поэкспериментируйте с настройками.

Пока тут болею бронхитом, ковыряю понемногу Unity. На следующем месте работы, вполне вероятно, придётся с фронтом работать, а не только с беком.

Решил потренироваться на простеньком платформере. Одно из первых и важных в платформере — персонаж и его управление. И там не всё так просто.


В общем-то, довольно много вариантов контроллеров для персонажа уже сущестует:

Предположим, мы не хотим заморачиваться с kinematic телом и используем стандартную физику с dynamic коллайдером. Вполне вероятно, что то, как оно работает по умолчанию, вам не очень понравится.

Если вам необходимо что-то сверх физики, какие-то свои фичи (например, прилипание к стенам), то с dynamic коллайдером это будет проблематично.

На нашей сцене уже имеется заготовка персонажа с анимацией, добавим к ней компоненты Box Collider 2d и Rigidbody 2d и настроим компонент так как на скриншоте

rogibody2d

Далее создадим скрипт к примеру TransformPlayer с таким кодом:

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

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

Добавим на сцену спрайты земли и продублируем 4 раза, на каждый компонент вешаем те же компоненты Box Collider 2d и Rigidbody 2d, создадим еще один скрипт TransformGround

ground

В этом скрипте, в методе Update реализована функция постоянного движения объекта по оси х , но при столкновении этого объекта с другим, у которого тэг barer, нашему объекту присвоится другая позиция на сцене, таким образом наши 4 объекта земли будут зациклены в движении .

Теперь подробнее… Создадим на камере два пустых объекта, один разместим слева и добавим Box Collider 2d и Rigidbody 2d, так же присвоим ему тэг, который указали в скрипте barer, а другой справа. Примерно так…

gameobject 2d

Теперь можно поверить запустив игру

Птица управляется, движение земли создает эффект движения птицы. В следующих уроках можно реализовать рандомное появление объектов на сцене и столкновение персонажа с ними. На это все удачных проектов.

Читайте также: