CharacterController.Move
Часть раздела Создание настоящих игр путешествия по Unity на Coddy. Урок 37 из 56.
CharacterController — это компонент Unity для персонажа, который ходит: капсула, которая перемещается только тогда, когда ваш скрипт вызывает controller.Move(motion). motion — это расстояние, на которое нужно переместиться за этот кадр, то есть скорость, умноженная на Time.deltaTime. Move скользит капсулой вдоль стен, а не сквозь них, позволяет подниматься по склонам с углом до значения Slope Limit (45 градусов) и забираться на уступы высотой до значения Step Offset (0.3 единицы). Это не Rigidbody: здесь нет сил, гравитации, отскока, и ничто не толкает персонажа. Он перемещается точно туда, куда его направляет Move, что и нужно для отзывчивого управления в игре.
Гравитацию нужно добавить самостоятельно, как и поиск пола. isGrounded имеет значение true, когда последний Move коснулся чего-то снизу, поэтому перемещение без движения вниз никогда не находит пол. Move с длиной меньше Min Move Distance контроллера (0.001) вообще ничего не делает, поэтому контроллер, который перемещали только вбок, сообщает, что он не стоит на земле, как только останавливается. Этот курьер ходит с помощью клавиш со стрелками и немного движется вниз при каждом перемещении:
public class Courier : MonoBehaviour
{
public float speed = 6f;
CharacterController controller;
void Start()
{
controller = GetComponent<CharacterController>();
}
void Update()
{
Vector3 move = new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical")) * speed;
move.y = -2f; // всегда прижимать вниз, чтобы обнаружить пол
controller.Move(move * Time.deltaTime);
if (!controller.isGrounded)
{
Debug.Log("Off the ground");
}
}
}Капсула сохраняет расстояние, равное Skin Width (0.08), до поверхностей, которых касается, поэтому контроллер высотой 2 единицы на полу с y = 0 располагается на высоте y = 1.08, а не 1. Move начинает перемещение с позиции, в которой физическая система в последний раз видела контроллер, поэтому заданное ему значение transform.position может быть отменено при следующем вызове Move: чтобы телепортировать его, задайте controller.enabled = false, переместите его, а затем снова включите.
Задание
СреднеИсследователь стоит на каменной платформе: сзади находится стена, а слева — обрыв. Напиши Explorer.cs и добавь его к Player, у которого есть CharacterController. В Inspector задаются значения speed (4) и fallSpeed (3), а Start() уже находит контроллер и Renderer исследователя.
- Стрелки (или WASD), считываемые с помощью необработанных осей, перемещают исследователя со скоростью
speedединиц в секунду: влево и вправо вдоль оси x, вверх и вниз вдоль оси z. Стена должна его остановить. - При каждом перемещении исследователь также опускается вниз со скоростью
fallSpeedединиц в секунду, поэтому он остается на платформе и падает с ее края. - Пока контроллер находится на земле, исследователь имеет цвет
Color.green; когда он не на земле —Color.red.
Нажми Play, подойди к стене и сойди с края, затем нажми Check.
Попробуйте сами
using UnityEngine;
public class Explorer : MonoBehaviour
{
public float speed = 4f;
public float fallSpeed = 3f;
CharacterController controller;
Renderer rend;
void Start()
{
controller = GetComponent<CharacterController>();
rend = GetComponent<Renderer>();
}
void Update()
{
// Перемещайте исследователя с помощью controller.Move, затем меняйте его цвет в зависимости от isGrounded
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Создание настоящих игр
1Текст на экране
Холст и текстПокажем счётФорматирование чиселТаймер обратного отсчётаПовторение: спидометр4Сцены и уровни
Загрузить сценуПерезапустить уровеньСледующий уровеньСохранить между сценамиПовторение: выбор уровня7Управление временем
Пауза с timeScaleЗамедленное движениеНемасштабируемое времяПовторение: Bullet Time10Проект: 3D-платформер
ТрассаДвижущиеся платформы2Кнопки и экраны
Кнопки и onClickЛямбдыСвязи в InspectorВключение и выключение панелейШкалы здоровьяПовторение: магазин улучшений5Сохранение с помощью PlayerPrefs
Сохранение числаЗагрузка со значением по умолчаниюРекордСохранение настроекПовторение: монеты в банке8Контроллер персонажа
CharacterController.MoveГравитация вручнуюПрыжкиТолкаем предметыДвижение в направлении взглядаПовторение: двойной прыжок