Menu
CoddyTech

CharacterController.Move

Parte da seção Criando jogos de verdade do Journey de Unity da Coddy. Lição 37 de 56.

Um CharacterController é o componente do Unity para um personagem que caminha: uma cápsula que se move somente quando seu script chama controller.Move(motion). motion é a distância a percorrer neste quadro, portanto é uma velocidade multiplicada por Time.deltaTime. Move desliza a cápsula ao longo das paredes em vez de atravessá-las, sobe inclinações até seu Slope Limit (45 graus) e passa por cima de obstáculos até seu Step Offset (0.3 unidades). Ele não é um Rigidbody: sem forças, sem gravidade, sem quique, e nada o empurra. Ele vai exatamente para onde Move o envia, o que é necessário para controles precisos no jogo.

A gravidade fica por sua conta, assim como encontrar o chão. isGrounded é true quando o último Move tocou algo abaixo, então um movimento sem componente para baixo nunca encontra o chão. Um Move menor que a Min Move Distance do controlador (0.001) não faz absolutamente nada, então um controlador movido apenas para os lados informa que não está no chão assim que fica parado. Este entregador caminha com as setas e pressiona um pouco para baixo em cada movimento:

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;   // sempre empurre para baixo, para que o chão seja detectado
        controller.Move(move * Time.deltaTime);
        if (!controller.isGrounded)
        {
            Debug.Log("Off the ground");
        }
    }
}

A cápsula mantém uma Skin Width (0.08) de distância daquilo que toca, então um controlador de 2 unidades de altura sobre um chão em y = 0 fica em y = 1.08, não em 1. E Move começa de onde a física viu o controlador pela última vez, então um transform.position definido nele pode ser desfeito pelo próximo Move: para teleportá-lo, defina controller.enabled = false, mova-o e ative-o novamente.

challenge icon

Desafio

Médio

O explorador está em uma plataforma de pedra, com uma parede atrás e uma queda à esquerda. Escreva Explorer.cs no Player, que tem um CharacterController. O Inspector define speed (4) e fallSpeed (3), e Start() já encontra o controlador e o Renderer do explorador.

  • As setas (ou WASD), lidas com os eixos brutos, movimentam o explorador com controller.Move à velocidade de speed unidades por segundo: esquerda e direita ao longo de x, cima e baixo ao longo de z. A parede deve detê-lo.
  • Cada movimento também desce à velocidade de fallSpeed unidades por segundo, para que o explorador permaneça na plataforma e caia pela borda.
  • Enquanto o controlador estiver no chão, o explorador fica Color.green; quando não estiver, Color.red.

Pressione Play, caminhe até a parede e saia pela borda, depois Check.

Experimente você mesmo

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()
    {
        // Mova-se com controller.Move e, em seguida, defina a cor do explorador de acordo com isGrounded
    }
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Criando jogos de verdade