Voltar para o Blog
Quest Log

Câmera em Terceira Pessoa com Cinemachine e Colisão

Personagem 3D visto de trás com três anéis de órbita da câmera ao redor e uma parede próxima

Unity Cinemachine third person: câmera orbital com Orbital Follow, mouse e gamepad pelo Input System e Deoccluder para a câmera não atravessar parede.

Ferramenta:Unity

Câmera em Terceira Pessoa com Cinemachine e Colisão

Para montar uma câmera em terceira pessoa com Unity Cinemachine third person, você cria uma CinemachineCamera com Orbital Follow (a câmera orbita o personagem), Rotation Composer (ela mira no personagem) e Cinemachine Input Axis Controller (o mouse e o gamepad giram a órbita). A colisão com o cenário fica com a extensão Cinemachine Deoccluder. No Unity 6.3 LTS com Cinemachine 3, o atalho FreeLook Camera monta quase tudo isso de uma vez.

Este post fica só na câmera: órbita, colisão, mira por cima do ombro e os erros que fazem ela tremer, atravessar parede ou girar ao contrário. O movimento do personagem relativo à câmera aparece no fim, como ponte para o controlador.

Como a câmera em terceira pessoa com Cinemachine funciona por dentro

No Cinemachine 3, a câmera da cena (Main Camera) só tem um Cinemachine Brain. Quem decide posição e rotação é uma CinemachineCamera, um objeto separado que funciona como "câmera virtual". O Brain copia o resultado da CinemachineCamera ativa a cada frame.

Dentro da CinemachineCamera existem dois papéis:

  • Position Control: onde a câmera fica. Para terceira pessoa, o Orbital Follow coloca a câmera numa superfície em volta do alvo.
  • Rotation Control: para onde a câmera olha. O Rotation Composer gira a câmera para manter o alvo num ponto da tela.

E por cima disso, as extensões: o Deoccluder para colisão, o Impulse Listener para tremor, e outras.

Se você vem de tutoriais antigos: a CinemachineVirtualCamera virou CinemachineCamera, o CinemachineFreeLook virou a combinação Orbital Follow mais Rotation Composer, e o CinemachineCollider foi dividido em Deoccluder e Decollider. O namespace no código é Unity.Cinemachine.

Criando a CinemachineCamera com Orbital Follow e Rotation Composer

Antes de tudo, instale o pacote Cinemachine pelo Window > Package Management > Package Manager > Unity Registry.

Crie um alvo para a câmera. Mirar no pivô do personagem (os pés) deixa a câmera olhando para o chão. Dentro do objeto do jogador, crie um filho vazio chamado CameraTarget na altura do peito ou do ombro (por exemplo, Y = 1.5 para um personagem de 1,8 m).

Agora a câmera:

  1. GameObject > Cinemachine > Targeted Cameras > FreeLook Camera. A Unity cria uma CinemachineCamera com Orbital Follow, Rotation Composer e Input Axis Controller, e coloca o Brain na Main Camera.
  2. Em Tracking Target, arraste o CameraTarget.
  3. No Orbital Follow, escolha o Orbit Style:
    • Sphere: a câmera fica numa esfera de raio fixo (Radius). Simples, bom para câmera de inspeção.
    • Three Ring: três anéis (Top, Center, Bottom), cada um com altura e raio. O eixo vertical desliza a câmera entre eles por uma curva (Spline Curvature). É o padrão de jogo de ação e aventura.

Valores de partida para Three Ring, relativos ao alvo: Top com altura 3 e raio 1.5 (câmera alta e perto, olhando para baixo), Center com altura 0.5 e raio 4 (câmera na altura do ombro, atrás), Bottom com altura -0.5 e raio 2 (câmera baixa e perto, olhando para cima). Ajuste jogando.

  1. Em Binding Mode, use Lazy Follow para câmera livre: ela mantém distância e altura do alvo, mas não gira junto quando o personagem vira. Os modos Lock To Target fazem a câmera girar com o personagem, que é o comportamento de câmera presa nas costas.
  2. Position Damping baixo (0.1 a 0.3) mantém a câmera firme atrás do alvo.

No Rotation Composer, o padrão já mira no alvo. Ajuste Screen Position para deslocar o personagem um pouco para baixo na tela, e deixe Damping baixo. Damping alto aqui é a causa número um de câmera "flutuando" atrás do personagem.

Ligando o mouse e o gamepad com Input Axis Controller

O Cinemachine Input Axis Controller detecta sozinho os eixos que podem ser dirigidos por entrada. No Orbital Follow são três: Horizontal Axis (gira em volta do alvo), Vertical Axis (sobe e desce entre os anéis) e Radial Axis (aproxima e afasta, bom para zoom na rodinha).

Projetos novos da Unity 6 vêm com o Input System ativo e um arquivo de ações com a ação Look (Vector2, ligada ao delta do mouse e ao analógico direito). Para cada eixo no Input Axis Controller:

  • Input Action: aponte para a ação Look. O eixo horizontal usa o X do Vector2 e o vertical usa o Y.
  • Gain: o multiplicador da entrada. É aqui que você ajusta a sensibilidade e inverte o eixo (sinal negativo).
  • Accel Time e Decel Time: tempo para acelerar e frear o giro. Com 0.1 a 0.2, o analógico fica suave sem parecer atrasado.
  • Cancel Delta Time: marque quando a entrada já é um delta por frame, que é o caso do mouse. Sem isso, o giro do mouse fica proporcional ao frame rate.

Mouse e gamepad têm naturezas diferentes: o mouse entrega quanto andou no frame; o analógico entrega uma posição de -1 a 1 que precisa virar velocidade. Se a sensibilidade de um ficar boa e a do outro ruim, separe em duas ações (LookMouse e LookGamepad) com Gain diferente, ou use processors na própria ação.

Por fim, trave o cursor durante o jogo: Cursor.lockState = CursorLockMode.Locked; num script de inicialização.

Colisão de câmera: Deoccluder e Decollider

Sem colisão, a câmera atravessa paredes e o jogador vê o lado de dentro do cenário. O Cinemachine 3 tem duas extensões, e elas resolvem problemas diferentes.

Cinemachine Deoccluder: garante que o alvo continue visível. Se uma parede entra entre a câmera e o personagem, ele puxa a câmera para frente. Propriedades principais:

  • Collide Against: layers que bloqueiam a câmera. Marque só cenário (Default, Environment). Nunca a layer do jogador.
  • Ignore Tag: objetos com essa tag são ignorados. Coloque a tag do jogador.
  • Minimum Distance From Target: ignora obstáculos muito perto do alvo (como a própria arma do personagem).
  • Camera Radius: raio da esfera da câmera. 0.2 a 0.3 evita que a lente encoste na parede e mostre o lado de dentro.
  • Strategy: Pull Camera Forward (puxa para frente na linha do alvo), Preserve Camera Height e Preserve Camera Distance (tentam contornar). Comece com Pull Camera Forward.
  • Damping e Damping When Occluded: tempo para voltar à posição normal e para fugir do obstáculo. Fugir rápido (0 a 0.2) e voltar devagar (0.5 a 1) é o que parece natural.
  • Transparent Layers: layers que não bloqueiam a visão (vidro, folhagem).

Cinemachine Decollider: só tira a câmera de dentro de colliders, sem se preocupar com linha de visão. Tem Decollision com Obstacle Layers e Terrain Resolution, que coloca a câmera em cima do terreno por um raio de cima para baixo. É útil em campo aberto com terreno irregular, ou combinado com o Deoccluder.

Para adicionar qualquer um: selecione a CinemachineCamera, Add Extension, e escolha.

Câmera, controlador, animação e colisão são peças que funcionam bem sozinhas no tutorial e brigam entre si no projeto. Juntar tudo num personagem jogável, com o movimento respeitando a câmera, é a parte em que a maioria trava, e é o que um curso de Unity com projeto completo trabalha passo a passo.

Curso de Unity
Quer fazer seu primeiro jogo na Unity?

No curso de Unity 6 da CursoGame.Dev você vai do zero ao primeiro jogo, com um desafio prático em cada level e suporte individual no WhatsApp quando travar.

Conhecer o curso de Unity
Suporte no WhatsAppAcesso vitalícioGarantia de 7 dias

Câmera de mira por cima do ombro com Third Person Follow

Para tiro em terceira pessoa, a órbita livre não serve: a mira precisa ficar fixa no centro da tela. O caminho é outro Position Control, o Third Person Follow, com a extensão Cinemachine Third Person Aim. O atalho GameObject > Cinemachine > Targeted Cameras > Third Person Aim Camera monta os dois.

Propriedades do Third Person Follow: Shoulder Offset (deslocamento do ombro), Vertical Arm Length, Camera Side (0 é ombro esquerdo, 1 é ombro direito), Camera Distance, e um bloco próprio de colisão (Camera Collision Filter, Ignore Tag, Camera Radius, Damping Into Collision, Damping From Collision).

A diferença importante: esse modo não tem controle direto de entrada. A câmera segue a rotação do alvo. Quem gira o alvo é o seu script. Arquivo AimCameraTarget.cs, no CameraTarget:

using UnityEngine;
using UnityEngine.InputSystem;

public class AimCameraTarget : MonoBehaviour
{
    [SerializeField] private float mouseSensitivity = 0.15f;
    [SerializeField] private float minPitch = -40f;
    [SerializeField] private float maxPitch = 70f;

    private InputAction lookAction;
    private float yaw = 0f;
    private float pitch = 0f;

    private void Awake()
    {
        lookAction = InputSystem.actions.FindAction("Look");

        Vector3 euler = transform.eulerAngles;
        yaw = euler.y;
        pitch = euler.x > 180f ? euler.x - 360f : euler.x;
    }

    private void OnEnable()
    {
        Cursor.lockState = CursorLockMode.Locked;
    }

    private void LateUpdate()
    {
        if (lookAction == null)
        {
            return;
        }

        Vector2 look = lookAction.ReadValue<Vector2>();
        yaw += look.x * mouseSensitivity;
        pitch -= look.y * mouseSensitivity;
        pitch = Mathf.Clamp(pitch, minPitch, maxPitch);

        transform.rotation = Quaternion.Euler(pitch, yaw, 0f);
    }
}

InputSystem.actions é o asset de ações do projeto, que vem configurado nos projetos novos da Unity 6. A conversão de euler.x evita o bug clássico: a Unity devolve -10 graus como 350, e o Clamp trava a câmera olhando para cima. O script trata o valor como delta de mouse; para gamepad, multiplique por Time.deltaTime e use uma sensibilidade maior.

O personagem, por sua vez, gira para onde o CameraTarget aponta quando o jogador mira, e o alvo é filho do personagem mas com rotação própria.

Erros comuns: câmera tremendo, atravessando parede e girando ao contrário

Câmera tremendo atrás do personagem. Quase sempre é o personagem andando na física sem interpolação. Ligue Interpolate no Rigidbody. Se o personagem usa CharacterController no Update, confira se o Update Method do Brain está em Smart Update ou Late Update. Damping alto no Rotation Composer também parece tremor quando o personagem muda de direção.

Câmera girando junto com o personagem quando você não quer. O Binding Mode do Orbital Follow está em algum Lock To Target. Troque para Lazy Follow ou World Space.

Câmera atravessando parede. Confira se o Deoccluder está na CinemachineCamera, se a parede tem collider e se a layer dela está em Collide Against. Se a câmera encosta e mostra o lado de dentro, aumente o Camera Radius e baixe o Near Clip Plane da Lens para 0.1.

Câmera pulando para perto do personagem sem motivo. A layer do jogador está em Collide Against, e o próprio corpo bloqueia a visão. Remova a layer ou use Ignore Tag.

Câmera girando ao contrário. O sinal do Gain está invertido no eixo. Mude o sinal e ofereça a opção de inverter no menu.

Próximo passo: alinhar o movimento do personagem à câmera

Com a câmera pronta, o personagem precisa andar "para frente da câmera", não para frente do mundo. A conta é pegar o forward e o right da câmera, achatar no plano do chão (zerar o Y e normalizar, ou usar Vector3.ProjectOnPlane com Vector3.up) e combinar com a entrada de movimento: direção = forward * input.y + right * input.x. Se esse tipo de operação com vetor ainda não está natural, o post de matemática para jogos: vetores cobre a base. O controlador completo, com corrida, pulo e rotação suave, está no guia de third person controller na Unity. E se você quer ver a mesma câmera em outra engine, compare com a câmera em terceira pessoa na Godot.

Perguntas frequentes

Onde está o FreeLook no Cinemachine 3?

O componente CinemachineFreeLook do Cinemachine 2 não existe mais como câmera separada. No Cinemachine 3 você usa uma CinemachineCamera com Orbital Follow (órbita) e Rotation Composer (mira). O atalho GameObject > Cinemachine > Targeted Cameras > FreeLook Camera cria essa combinação pronta.

O que substituiu o CinemachineCollider no Cinemachine 3?

Duas extensões: o CinemachineDeoccluder, que tenta manter o alvo visível puxando a câmera para frente quando algo entra na frente, e o CinemachineDecollider, que só tira a câmera de dentro de colliders sem se preocupar com a linha de visão. Para terceira pessoa orbital, o Deoccluder é o ponto de partida.

Como inverter o eixo vertical da câmera no Cinemachine?

No Cinemachine Input Axis Controller, cada eixo tem um campo Gain que multiplica a entrada. Trocar o sinal do Gain do eixo vertical inverte a direção. Exponha isso no menu de opções, porque parte dos jogadores prefere o eixo invertido.

Qual a diferença entre Orbital Follow e Third Person Follow?

O Orbital Follow gira a câmera em volta do alvo com base na entrada do jogador, independente da rotação do personagem. O Third Person Follow prende a câmera num braço atrás do ombro e segue a rotação do alvo, então quem gira é o seu script. O primeiro é câmera de aventura; o segundo, câmera de mira.