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

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.
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:
- 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.
- Em Tracking Target, arraste o
CameraTarget. - 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.
- 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.
- 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.
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.


