Menu
CoddyTech

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, переместите его, а затем снова включите.

challenge icon

Задание

Средне

Исследователь стоит на каменной платформе: сзади находится стена, а слева — обрыв. Напиши 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
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Создание настоящих игр