Una plataforma móvil que arranca justo al pisarla añade tensión y ritmo al juego. Aquí verás cómo implementarla en Unity 2D con un enfoque práctico: usar un trigger para activar la animación, ajustar el collider y sincronizar posición y velocidad. Todo con C#, Animator y un prefab reutilizable.
¿Cómo activar una plataforma móvil con trigger en Unity 2D?
Para evitar desajustes cuando el personaje se mueve automáticamente hacia la derecha, la idea clave es simple: la plataforma permanece estática y arranca solo cuando el personaje se posa encima. Esto se logra con un trigger y el Animator deshabilitado por defecto.
¿Qué script C# necesitas?
Crea un script en C# llamado Moving Platform y sobreescribe el método OnTriggerEnter2D. Al detectar al jugador, habilita el Animator del objeto padre de la plataforma.
usingUnityEngine;publicclassMovingPlatform:MonoBehaviour{privateAnimator animator;voidAwake(){ animator =GetComponent<Animator>(); animator.enabled =false;// La animación debe empezar apagada.}voidOnTriggerEnter2D(Collider2D other){if(other.CompareTag("Player")){ animator.enabled =true;// Activa el movimiento al pisar.}}}
Puntos clave:
Usa GetComponent<Animator>() para acceder al Animator del padre.
Mantén animator.enabled = false al inicio.
Activa al tocar el trigger con animator.enabled = true.
¿Dónde asignarlo y qué prefab crear?
Asigna el script al objeto padre de la plataforma móvil.
Crea un prefab de la plataforma para reutilizarla en distintos escenarios.
Configura la plataforma para moverse en horizontal mediante su animación.
¿Qué ajustes de collider y animator evitan errores comunes?
Un BoxCollider2D configurado como isTrigger en el objeto padre define la “zona de arranque”. Debe cubrir la plataforma y ser ligeramente más alto para detectar al jugador antes de aterrizar. Aun así, evita dejar demasiado margen o el personaje podría “rozar” sin llegar a tocar, como mostró el gizmo rojo sin contacto real.
Ajustes prácticos:
Añade un BoxCollider2D al padre y marca “Is Trigger”.
Haz el trigger del tamaño de la plataforma, un poco más alto.
Si “no llega a tocar”, baja el borde inferior del collider para permitir el aterrizaje.
Verifica que el Animator esté deshabilitado por defecto en el GameObject.
Errores típicos a evitar:
Dejar la animación activa al inicio: arrancará sin pisar.
Un trigger demasiado alto: genera “rozar” continuo sin colisión efectiva.
Probar con la plataforma muy elevada: baja su posición para testear saltos.
¿Cómo sincronizar posición y velocidad de la animación?
Si la animación empieza a una altura distinta a la de la plataforma, ocurren desajustes. El caso descrito: plataforma en y = −3.44 y animación en y = 0. Solución: unifica las posiciones clave en un valor coherente (por ejemplo, y = −3) al inicio, en el centro y al final de la animación.
Pasos recomendados:
Ajusta todas las claves de posición Y a un mismo valor: −3 en inicio, medio y fin.
Elimina puntos intermedios innecesarios que muevan en vertical.
Alinea la animación con la posición real de la plataforma en la escena.
Velocidad de animación y jugabilidad:
Velocidad inicial muy lenta: 0.12.
Mejora progresiva: 0.15.
Resultado óptimo para igualar al personaje: 0.20.
Consejos de ritmo:
Si el personaje va más rápido, sube la velocidad de la animación.
Un poco más rápida que el jugador añade tensión positiva sin frustrar.
Prueba y ajusta hasta que el avance sea fluido.
¿Qué retos de diseño de nivel puedes probar?
Integra la plataforma móvil horizontal en un bloque de nivel existente.
Crea variantes: looping, diagonal, arriba/abajo para mayor dificultad.
Diseña un nivel solo con plataformas móviles para nivel experto.
Añade monedas, pociones y zonas de supersalto para guiar al usuario.
Equilibra distancias y tiempos para mantener la tensión sin romper el flujo.
¿Te animas a compartir cómo equilibraste velocidad, recorrido y colocación de ítems en tus plataformas móviles? Cuéntalo y enriquece la práctica de toda la comunidad.
Para no modificar cada vez la animación, podemos crear un padre que sea la posición 0, 0 de nuestra plataforma, este padre no se movera simplente estara donde queremos que empiece la animación
Buena solución muchas gracias.
No lo había pensado, pero es una excelente solución que ni se le ocurrió al docente
Mi solución a evitar tener que hacer una animación para cada posición del objeto: Crear un 2do padre a la plataforma y asignarle a él todos los componentes (script, collider, animator). Quedando así:
Muchas gracias Pedro! Está solución es excelente! Me estaba volviendo loco para cuadrar las animaciones
Que excelente solución, muchas gracias por tu aporte!
Para evitar el problema del desfase preferí crear una nueva "animation" para cada bloque con el nombre. (Ej. animBlock1.1, 1.2, etc).
Me pareció mas cómodo para poder animar mas rápido cada elemento del nivel :D
Es importante que la plataforma se encuentre en la posición inicial (al menos relativa) de la animación para evitar el desfase que se puede ver en este momento.
Por qué cuando el player sube a la plataforma se resbala, no deberia adquirir la misma velocidad de la plataforma? Suponiendo que mi player se queda quieto.
Para evitar que el personaje se quede como colgado o pegado a un collider, puedo crear y añadir un material de física 2D al collider y bajarle la fricción a 0
Pero ahora debo solucionar que por la fuerza se desliza un poco y lo haré en el script de PlayerController
se resbala, si es lo mismo que me pasaba a mi que se desliza como si estuviera en hielo supongo que es por la "fuerza" o la adición al vector de su movimiento. En cualquier caso lo solucioné haciendo que cuando no presiono las teclas de movimiento horizontal, su vector de movimiento mantenga la coordenada y pero que en horizontal se quede en 0 (precisamente donde está sin que se deslice)
Cambio de color, movimiento vertical y horizontal en plataformas
Existe alguna manea de establecer las animaciones con los valores de la posicion directamente? En lugar de modificarlas 1 por 1 con cada plataforma? Aunque sea por script
Obtienes tu objeto y le pasas el transform en x
Por que no se usa el if(collision.tag=="Player") como en el Script de la Killzone?
Creo que lo hace porque no hay otro objeto que pueda colisionar con él, pero es buena práctica agregarlo.
Tengo un nivel con las plataformas, y a medida que se va generando mi nivel, crece en Y y mi personaje va subiendo en la pantalla, lo que pasa es que no he podido acomodar bien el movimiento de la pantalla en Y para seguir a mi personaje al subir a medida que avanza el nivel.
En este caso, tengo una plataforma que sube, pero esta queda bajo la killZone del siguiente bloque y mi personaje muere, como podría hacer que no muriese al subir?
Por ahora hice lo siguiente, en mis bloques de nivel, cree un nuevo GameObject llamado StartZone, le agregue un Collider2D y un script al cual vincularle la KillZone de forma pública, La idea es que al cruzar la StarZone, active el Collider de la KillZone del bloque de nivel.
Si bien la mayoría de las clases me parecieron buenas, esta no tanto. Me pareció que quedo incompleto lo de la animación, o un poco confuso. Entiendo lo de la linea de tiempo porque he usado el after effects e incluso de chico usaba flash. Pero acá las animaciones y el objeto se desfasan y es muy dificil alinearlas. Intentaré hacer lo que proponen los compañeros
puede que se un bug, pero para disparar el evento es necesario marcar isTrigger en box collider que agregar al padre animator
Exacto, todos los onTriggerEnter deben si o si tener un collider con ese atributo activo.