El objetivo#
Que la cámara "tiemble" un instante al recibir un golpe, una explosión o un aterrizaje fuerte. Es de los efectos que más aportan al game feel (la sensación de impacto) por muy poco trabajo.
Opción A — Cinemachine Impulse (recomendada)#
Si usas Cinemachine, tiene un sistema hecho para esto: Impulse. Un objeto "emite" un impulso y las cámaras con un listener lo reciben y tiemblan. Desacoplado y potente.
- En tu CinemachineCamera, añade un CinemachineImpulseListener.
- En lo que provoca el temblor (el arma, la explosión), añade un CinemachineImpulseSource.
- Dispara el impulso por código:
using UnityEngine;
using Unity.Cinemachine; // Cinemachine 3.x (Unity 6)
[RequireComponent(typeof(CinemachineImpulseSource))]
public class Impacto : MonoBehaviour
{
private CinemachineImpulseSource fuente;
void Awake() => fuente = GetComponent<CinemachineImpulseSource>();
public void Sacudir(float fuerza = 1f)
{
fuente.GenerateImpulse(fuerza);
}
}En Cinemachine 3 el namespace es Unity.Cinemachine (en versiones antiguas era Cinemachine). Si copias código viejo y no compila el using, es por esto. Los componentes también cambiaron de nombre respecto a Cinemachine 2.
Con Impulse, cualquier cosa puede emitir un temblor y todas las cámaras reaccionan sin conocerse. Puedes definir el perfil del temblor (fuerte y corto para un disparo, largo y ondulante para un terremoto) como un asset reutilizable. Es el enfoque desacoplado que escala.
Opción B — Manual con corrutina#
Si usas una cámara normal (sin Cinemachine), una corrutina desplaza la cámara con valores aleatorios y la devuelve a su sitio:
using System.Collections;
using UnityEngine;
public class ScreenShake : MonoBehaviour
{
public IEnumerator Sacudir(float duracion, float magnitud)
{
Vector3 posOriginal = transform.localPosition;
float t = 0f;
while (t < duracion)
{
float x = Random.Range(-1f, 1f) * magnitud;
float y = Random.Range(-1f, 1f) * magnitud;
transform.localPosition = posOriginal + new Vector3(x, y, 0f);
t += Time.deltaTime;
yield return null; // siguiente fotograma
}
transform.localPosition = posOriginal; // volver a su sitio exacto
}
}Lánzalo con StartCoroutine(shake.Sacudir(0.2f, 0.3f));.
El error clásico: la cámara no vuelve exactamente a su sitio y "deriva" con cada temblor. Guarda posOriginal antes de empezar y restáurala al final. Si la cámara sigue a un jugador, aplica el shake sobre una cámara/objeto hijo, no sobre la que hace el seguimiento, para no pelearte con el movimiento.
Dosis: menos es más#
Un temblor sutil en cada golpe se siente genial; uno enorme en todo hunde la experiencia (y marea). Reserva la intensidad alta para momentos grandes (explosiones, jefes) y usa temblores mínimos para el feedback constante. Combínalo con partículas, un destello y sonido para un impacto redondo.
Errores frecuentes#
- La cámara no vuelve a su posición exacta y va derivando.
- Aplicar el shake a la cámara que sigue al jugador y romper el seguimiento (usa un hijo).
- Usar el namespace
Cinemachineen vez deUnity.Cinemachineen Unity 6. - Pasarse de magnitud hasta marear.
Resumen#
Para el temblor de cámara: con Cinemachine, usa Impulse (un CinemachineImpulseSource que GenerateImpulse y un CinemachineImpulseListener en la cámara) — desacoplado y con perfiles reutilizables. Sin Cinemachine, una corrutina que desplaza la cámara con ruido y restaura la posición original. Dosifica la intensidad y acompáñalo de partículas y sonido para el máximo impacto.