Menu
CoddyTech

Cámara orbital

Parte de la sección Física y jugabilidad del Journey de Unity de Coddy. Lección 48 de 71.

Para orbitar alrededor de un punto, mantén un ángulo, gira un desplazamiento fijo según ese ángulo y suma el resultado al punto. La multiplicación de una rotación por un vector hace el giro: Quaternion.Euler(0, angle, 0) * offset hace girar el desplazamiento alrededor del eje y, y su longitud y altura se mantienen iguales. Esta cámara orbita alrededor de una estatua a 20 grados por segundo, siempre a 3 unidades de altura y a 6 unidades de distancia:

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);
}

Con un ángulo de 0, el desplazamiento es (0, 3, -6), así que la cámara está detrás de la estatua. Con 90, es (-6, 3, 0), en el lado -x de la estatua, y con 180 es (0, 3, 6), delante. Mover la cámara no la hace girar, así que LookAt vuelve a apuntarla hacia la estatua desde cada nueva posición.

Un segundo ángulo eleva la cámara: Quaternion.Euler(pitch, yaw, 0) * new Vector3(0, 0, -distance) gira la dirección hacia atrás hacia arriba en pitch (un giro positivo alrededor de x inclina (0, 0, -1) hacia arriba) y luego la hace girar en yaw, por lo que la cámara se mantiene a distance de distancia en cualquier ángulo.

El ángulo se almacena en tu propio campo, como en Ángulos de Euler: puede superar 360 o bajar de 0 sin saltos, y puedes limitarlo o cambiarlo desde el teclado. Hacer esto en LateUpdate() coloca la cámara después de que la estatua, o un jugador, se haya movido durante el fotograma.

challenge icon

Desafío

Intermedio

Deja que el jugador haga volar la cámara alrededor de la torre.

  1. En Update(), las flechas derecha e izquierda cambian yaw a turnSpeed, y las flechas arriba y abajo cambian pitch a tiltSpeed, multiplicados por Time.deltaTime.
  2. Después, mantén pitch = Mathf.Clamp(pitch, 10f, 60f);.
  3. En LateUpdate(), establece transform.position = target.position + Quaternion.Euler(pitch, yaw, 0) * new Vector3(0, 0, -distance); y después transform.LookAt(target);.

Pulsa «Jugar» y haz volar la cámara alrededor de la torre. Después, pulsa «Comprobar».

Pruébalo tú mismo

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()
    {
        // Las teclas de flecha cambian yaw y pitch.
    }

    void LateUpdate()
    {
        // Coloca la cámara alrededor de target y haz que apunte hacia él.
    }
}

Todas las lecciones de Física y jugabilidad

Practica por tu cuenta: Playground de Unity