В данном уроке мы создадим самое простое и примитивное управление персонажем буквально в несколько строк при помощи CharacterController.
Для начала создадим проект и добавим на сцену простой Plane в нулевые координаты (0, 0, 0).
После чего создадим "игрока" - создаем пустой GameObject в нулевых координатах, даем ему соответствующее имя "CubePlayer". Внутрь вкладываем обычный Cube объект, удаляем за ненадобностью с него компонент Box Collider и по желанию меняем материал на любой который вам нравится.
На объект CubePlayer добавляем компонент CharacterController. В этот раз задаем размеры персонажу как шару - т.е. высота = 2 радиуса, а центр смещаем вверх на радиус.
Теперь займемся контролем. Для этого создадим и добавим новый скрипт и назовем его "CubeMovement". После создания скрипта переходим в редактор кода.
Над объявлением класса добавляем параметр RequireComponent, чтобы юнити понимал, что скрипту требуется компонент CharacterController - если его не будет на объекте при добавлении скрипта, юнити добавит этот компонент на объект автоматически.
В теле класса, в самом верху объявляем нужные нам поля. Публичный параметр Speed - для контроля скорости движения и скрытое поле controller, для сохранения ссылки на контроллер нашего персонажа.
После чего, при старте скрипта берем ссылку на компонент контроллера персонажа так, как описано в методе Start()
Теперь заполняем код управления персонажем в методе Update. Напоминаю что Update вызывается каждый кадр. Далее я объясню что мы тут делаем.
В начале метода мы берем параметры ввода с горизонтальной и вертикальной оси. Оси определены в параметрах ввода Unity как Horizontal и Vertical, и берут данные с кнопок WASD, стрелок и джойстика движения с геймпада. Значение по осям лежат в пределах [-1; 1]. Для текущей задачи этих осей будет достаточно.
После чего мы делаем вектор направления для движения нашего персонажа. Горизонтальную ось используем как параметр X, вертикальную ось используем как параметр Z. После чего, проверяем размер вектора направления и если его длина более 1, то нормализуем (приводим к длинне 1).
Для чего производим нормализацию? Все дело в том, что результатом при сложении двух единичных направлений (если сразу нажмем A + W или A + S и.т.п.) будет вектор длинее чем 1 и в итоге персонаж по диаганали будет двигаться быстрее чем по одному из направлений. Нормализация предотвращает выход направления за пределы единицы, таким образом персонаж будет двигаться во всех направлениях с одинаковой скоростью.
В конце собственно применяем полученное направление и скорость к контроллеру персонажа.
У компонента Character Controller есть два метода применения движения. "Move" и "SimpleMove". Если кратко, метод "Move" дает информацию о столкновениях персонажа и принимает в качестве параметра скорость за кадр. Метод "SimpleMove" принимает скорость движения за секунду и сам управляет гравитацией. В нашем примере это не принципиально поэтому используем метод Move.
Возвращаемся в Unity, ждем пока скрипт скомпилируется и запускаем воспроизведение игры в Unity. В итоге получаем результат как на видео.
На этом все, надеюсь что помог! Пишите комментарии если возникнут вопросы связанные с уроком.