Menu
CoddyTech

Sacudida de cámara

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

Un temblor es una breve serie de desplazamientos aleatorios: durante unas décimas de segundo, la cámara se queda en una posición aleatoria cerca de su posición de reposo, una nueva en cada fotograma, y después vuelve. Una corrutina encaja bien, porque se ejecuta durante varios fotogramas y termina por sí sola. Esta cámara tiembla cuando aterriza una roca (otro script llama a BoulderLanded(); el archivo empieza con using System.Collections; para IEnumerator):

public float strength = 0.2f;
public float duration = 0.4f;
Vector3 rest;

void Start()
{
    rest = transform.localPosition;
}

public void BoulderLanded()
{
    StartCoroutine(Shake());
}

IEnumerator Shake()
{
    float elapsed = 0f;
    while (elapsed < duration)
    {
        transform.localPosition = rest + Random.insideUnitSphere * strength;
        elapsed += Time.deltaTime;
        yield return null;
    }
    transform.localPosition = rest;
}

Random.insideUnitSphere * strength es un desplazamiento aleatorio de hasta strength de longitud en cualquier dirección, y yield return null elige uno nuevo en el siguiente fotograma. Sumar Time.deltaTime en cada pasada cuenta los segundos reales, así que el temblor dura duration con cualquier frecuencia de fotogramas. La última línea devuelve la cámara a su posición; sin ella, la cámara se queda donde la dejó el último desplazamiento.

En cada fotograma, Unity ejecuta todos los Update(), luego las corrutinas que esperan en yield return null y, después, todos los LateUpdate(). Así que una cámara de seguimiento que establece su posición en LateUpdate() sobrescribe lo que haya hecho el temblor. Aplicar el temblor a localPosition evita eso cuando la cámara es hija de un objeto vacío que realiza el seguimiento: el objeto padre se mueve y la cámara tiembla en su posición dentro de él.

challenge icon

Desafío

Intermedio

Esta cámara sigue al jugador (las flechas la mueven): en LateUpdate() se sitúa en la posición del jugador más offset, y no es hija de ningún objeto. Haz que tiemble mientras lo sigue:

  • La barra espaciadora la hace temblar durante duration (0.4) segundos. En cada fotograma del temblor, la cámara está en una nueva posición aleatoria a una distancia de hasta strength (0.3) de su posición de seguimiento, mientras sigue al jugador.
  • Cuando termina el temblor, vuelve exactamente a su posición de seguimiento.

La barra espaciadora ya inicia la corrutina Shake(). Pulsa Play, corre y pulsa la barra espaciadora; después, pulsa Check.

Pruébalo tú mismo

using System.Collections;
using UnityEngine;

public class ShakeFollow : MonoBehaviour
{
    public Transform player;
    public Vector3 offset = new Vector3(0, 4, -8);
    public float strength = 0.3f;
    public float duration = 0.4f;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            StartCoroutine(Shake());
        }
    }

    void LateUpdate()
    {
        transform.position = player.position + offset;
    }

    IEnumerator Shake()
    {
        // Sacude la cámara durante duration segundos, hasta una distancia de strength respecto a su posición de seguimiento.
        yield return null;
    }
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Física y jugabilidad