Menu
CoddyTech

Câmera Orbital

Parte da seção Física e Jogabilidade do Journey de Unity da Coddy. Lição 48 de 71.

Para orbitar um ponto, mantenha um ângulo, gire um deslocamento fixo por esse ângulo e some o resultado ao ponto. A multiplicação de rotação por vetor faz o giro: Quaternion.Euler(0, angle, 0) * offset faz o deslocamento girar em torno do eixo y, enquanto seu comprimento e sua altura permanecem iguais. Esta câmera orbita uma estátua a 20 graus por segundo, sempre a 3 unidades de altura e a 6 de distância:

public Transform statue;
public float speed = 20f;
float angle;

void LateUpdate()
{
    angle += speed * Time.deltaTime;
    Vector3 offset = new Vector3(0, 3, -6);
    transform.position = statue.position + Quaternion.Euler(0, angle, 0) * offset;
    transform.LookAt(statue);
}

Com o ângulo em 0, o deslocamento é (0, 3, -6), então a câmera fica atrás da estátua. Em 90, ele é (-6, 3, 0), ao lado da estátua no sentido de -x, e em 180, é (0, 3, 6), à frente. Mover a câmera não a faz girar, então LookAt a aponta de volta para a estátua a partir de cada nova posição.

Um segundo ângulo eleva a câmera: Quaternion.Euler(pitch, yaw, 0) * new Vector3(0, 0, -distance) gira a direção para trás para cima em pitch (um giro positivo em torno de x inclina (0, 0, -1) para cima) e, em seguida, gira em torno de y por yaw, mantendo a câmera a distance de distância em qualquer ângulo.

O ângulo fica em seu próprio campo, como em Ângulos de Euler: ele pode ultrapassar 360 ou ficar abaixo de 0 sem nenhum salto, e você pode limitá-lo ou alterá-lo pelo teclado. Fazer isso em LateUpdate() posiciona a câmera depois que a estátua ou um jogador se moveu naquele quadro.

challenge icon

Desafio

Médio

Deixe o jogador voar com a câmera ao redor da torre.

  1. Em Update(), as setas para a direita e para a esquerda alteram yaw com turnSpeed, e as setas para cima e para baixo alteram pitch com tiltSpeed, multiplicados por Time.deltaTime.
  2. Depois, mantenha pitch = Mathf.Clamp(pitch, 10f, 60f);.
  3. Em LateUpdate(), defina transform.position = target.position + Quaternion.Euler(pitch, yaw, 0) * new Vector3(0, 0, -distance); e, em seguida, transform.LookAt(target);.

Pressione “Jogar” e voe ao redor da torre. Depois, clique em “Verificar”.

Experimente você mesmo

using UnityEngine;

public class OrbitCamera : MonoBehaviour
{
    public Transform target;
    public float distance = 8f;
    public float turnSpeed = 90f;
    public float tiltSpeed = 45f;
    public float yaw = 0f;
    public float pitch = 30f;

    void Update()
    {
        // As teclas de seta alteram yaw e pitch.
    }

    void LateUpdate()
    {
        // Posicione a câmera ao redor do target e aponte-a para ele.
    }
}

Todas as lições de Física e Jogabilidade

Pratique por conta própria: Playground de Unity