Menu
CoddyTech

Seguimiento suave

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

Una cámara que copia la posición del jugador más un desplazamiento en LateUpdate() convierte cada sacudida del jugador en una sacudida de la vista. Vector3.SmoothDamp(current, target, ref velocity, smoothTime) devuelve una posición que se desplaza hacia target como lo haría un resorte amortiguado: acelera, reduce la velocidad al acercarse al objetivo y llega sin sobrepasarlo. Esta cámara sigue al jugador desde 3 unidades arriba y 6 por detrás, con un pequeño retraso:

public Transform player;
public Vector3 offset = new Vector3(0, 3, -6);
public float smoothTime = 0.3f;
Vector3 velocity;

void LateUpdate()
{
    Vector3 target = player.position + offset;
    transform.position = Vector3.SmoothDamp(transform.position, target, ref velocity, smoothTime);
}

ref le pasa a SmoothDamp la variable en sí, en lugar de una copia, para que el método pueda modificarla. SmoothDamp mantiene en velocity la velocidad actual de la cámara en los tres ejes y la necesita de vuelta en el siguiente fotograma, por eso es un campo. Si se declarara dentro de LateUpdate(), empezaría desde cero en cada fotograma y la cámara avanzaría a paso de tortuga, aproximadamente medio por ciento del recorrido por fotograma. Para un solo número, como el zoom de una cámara, Mathf.SmoothDamp funciona del mismo modo con una velocidad float.

smoothTime determina cuánto se retrasa la cámara: con 0.3, recorre aproximadamente el 60% de un salto repentino en 0.3 segundos y casi llega al cabo de 1 segundo. Un valor más pequeño la hace seguir más de cerca. SmoothDamp lee Time.deltaTime por sí mismo, así que no se multiplica por este ningún valor de la llamada.

challenge icon

Desafío

Intermedio

Haz que la cámara siga al jugador suavemente desde una altura fija.

  1. Añade un campo Vector3 velocity;.
  2. En LateUpdate(), construye Vector3 target = new Vector3(player.position.x, height, player.position.z - back);, para que un salto no mueva la vista.
  3. Establece transform.position = Vector3.SmoothDamp(transform.position, target, ref velocity, smoothTime);.

Pulsa «Jugar», corre y salta: la cámara te sigue con un ligero retraso y nunca rebota. Después, pulsa «Comprobar».

Pruébalo tú mismo

using UnityEngine;

public class TopDownCamera : MonoBehaviour
{
    public Transform player;
    public float height = 12f;
    public float back = 5f;
    public float smoothTime = 0.25f;

    void LateUpdate()
    {
        // Desplázate suavemente hacia el punto situado sobre el jugador (x), a back unidades detrás de él (z), a una altura fija.
    }
}

Todas las lecciones de Física y jugabilidad

Practica por tu cuenta: Playground de Unity