Hoy añadiremos “Plataformas” a nuestro “Primer Juego 3D” en Unity 🙂
Para ser más precisos, crearemos plataformas móviles que vayan a lo largo de varios puntos previamente definidos (a los que llamaremos “waypoints“) en un ciclo de movimiento perpetuo.
Tutorial de Unity Nivel: Principiante.
3.1 La Plataforma.
Comenzaremos creando un cubo 3D al cuál le vamos a modificar su tamaño para que tenga una forma parecida y funcional al de una plataforma de un videojuego (es decir, una donde nuestro personaje se pueda subir y quedarse parado por un tiempo mientras la plataforma lo lleva al lugar de destino). A nuestra plataforma la llamaremos “Platform“.
Una vez tengamos nuestra plataforma, vamos a crear y asignarle el tag “Platform“; la capa o layer se quedará como “Default“.
Como siguiente paso, vamos a añadirle el componente “Box Collider” y le activaremos la propiedad “Is Trigger” (esto es porque queremos que este collider sirva como una zona invisible a la cual si nuestro personaje entra suceda una cierta acción).
Para asegurar que exista una zona que permita la detección de nuestro personaje, vamos a modificar este collider para que sobresalga un poco de la plataforma del lado donde el personaje deba subirse a ella (como se muestra a continuación):

Ahora, vamos a crear un objeto vacío dentro de nuestra plataforma (clic derecho y “Create Empty“), después a este objeto vacío no le pondremos un tag pero si le asignaremos la capa o layer “ground3D“. Por último le asignaremos un “Box Collider” asegurándonos que tenga el tamaño exacto de nuestra plataforma (lo cual normalmente sucede de forma automática). Esto lo hacemos para crear el área donde nuestro personaje se pueda parar y mover.

3.2 El Código de la Plataforma
Para que nuestra plataforma se pueda mover a través de los puntos que uno designe (waypoints), es necesario crear y asignarle a nuestra plataforma el siguiente código (“MovingPlatform.cs“):
using UnityEngine;
/// <summary>
/// Script para mover una plataforma 3D entre puntos predefinidos (waypoints) de forma cíclica y repetitiva.
/// </summary>
public class MovingPlatform : MonoBehaviour
{
/// <summary>
/// Array de waypoints (puntos objetivo) donde se moverá la plataforma.
/// Estos puntos deben crearse como GameObjects vacíos en la escena.
/// </summary>
[SerializeField] private Transform[] waypoints;
/// <summary>
/// Velocidad a la que se mueve la plataforma entre los waypoints.
/// </summary>
[SerializeField] private float speed = 2f;
/// <summary>
/// Tiempo que se espera en cada waypoint antes de continuar al siguiente.
/// </summary>
[SerializeField] private float waitTime = 1f;
/// <summary>
/// Índice del waypoint actual al que se dirige la plataforma.
/// </summary>
private int currentWaypointIndex = 0;
/// <summary>
/// Temporizador para controlar el tiempo de espera en cada waypoint.
/// </summary>
private float waitTimer = 0f;
/// <summary>
/// Bandera para indicar si la plataforma está en estado de espera (detenida en un waypoint).
/// </summary>
private bool waiting = false;
/// <summary>
/// Inicializa la posición de la plataforma y valida los waypoints.
/// </summary>
void Start()
{
// Validar que existan waypoints asignados
if (waypoints.Length == 0)
{
Debug.LogError("¡No hay waypoints asignados a la plataforma!");
enabled = false; // Desactiva el script para evitar errores
return;
}
// Posicionar la plataforma en el primer waypoint al inicio
transform.position = waypoints[0].position;
}
/// <summary>
/// Maneja el movimiento de la plataforma entre waypoints.
/// </summary>
void Update()
{
// Si la plataforma está en estado de espera, incrementar el temporizador
if (waiting)
{
waitTimer += Time.deltaTime; // Incrementa el temporizador basado en el tiempo real
if (waitTimer >= waitTime)
{
waiting = false; // Salir del estado de espera
// Avanzar al siguiente waypoint (con ciclo cíclico)
currentWaypointIndex = (currentWaypointIndex + 1) % waypoints.Length;
}
return;
}
// Verificar si hay waypoints definidos
if (waypoints.Length == 0) return;
// Seleccionar el waypoint objetivo actual
Transform target = waypoints[currentWaypointIndex];
// Mover la plataforma hacia el waypoint objetivo
transform.position = Vector3.MoveTowards(
transform.position,
target.position,
speed * Time.deltaTime
);
// Comprobar si la plataforma llegó al waypoint objetivo
if (Vector3.Distance(transform.position, target.position) < 0.05f)
{
waitTimer = 0f; // Reiniciar el temporizador
waiting = true; // Activar estado de espera
}
}
/// <summary>
/// Dibuja líneas entre waypoints en el Editor de Unity para visualizar la ruta.
/// </summary>
private void OnDrawGizmos()
{
// Validar que existan al menos 2 waypoints para dibujar conexiones
if (waypoints == null || waypoints.Length < 2) return;
// Dibujar líneas entre waypoints consecutivos
for (int i = 0; i < waypoints.Length - 1; i++)
{
Gizmos.color = Color.cyan; // Color de las líneas
if (waypoints[i] != null && waypoints[i + 1] != null)
Gizmos.DrawLine(waypoints[i].position, waypoints[i + 1].position);
}
// Dibujar línea del último waypoint al primero para completar el ciclo
Gizmos.DrawLine(waypoints[waypoints.Length - 1].position, waypoints[0].position);
}
}
Este script hay que añadirlo a nuestra plataforma, y antes de hacerlo funcionar es necesario crear los puntos por donde queremos que nuestra plataforma se mueva (waypoints).
Los “waypoints” son objetos vacíos que nos sirven como referencia para asignar las coordenadas por donde nuestra plataforma va a pasar. Así que, crearemos objetos vacíos (con “Create Empty“) sin tag ni layers asignados, los llamaremos “Waypoint” y los colocaremos en los lugares dentro de nuestra escena por donde queremos que nuestra plataforma pase.
Una vez hecho esto, asignaremos cada waypoint que hicimos en la sección “Waypoints” de nuestro código “MovingPlatform”.

Al hacerlo podremos ver en nuestra escena como cada waypoint se une al siguiente por medio de una línea de color cian representando la ruta que tendrá nuestra plataforma al moverse.
En este punto ya podrás oprimir “Play” en la escena para ver como se mueve la plataforma.
3.3 Últimos ajustes.
Si en este momento pruebas la escena, verás como la plataforma que hiciste comienza a moverse, pero si intentas subirte a ella notarás que el personaje no se moverá junto con la plataforma (se quedará quieto, la plataforma se moverá y poco después el personaje caerá). Para evitar esto, es necesario hacer lo siguiente:
En el controlador del personaje “PlayerController” hay que añadir la siguientes variables:
// === NUEVAS VARIABLES PARA PLATAFORMA ===
private Transform platform;
private Vector3 previousPlatformPosition;
Después, hay que añadir el siguiente código dentro del método “Update“:
void Update() {
// === CÓDIGO EXISTENTE...
// === CÓDIGO EXISTENTE...
// === CÓDIGO EXISTENTE...
// === MOVIMIENTO DE PLATAFORMA ===
// Este bloque de código se ejecuta cada frame para sincronizar el movimiento del personaje con la plataforma cuando entra en contacto con ella
if (platform != null)
{
// Calcular el desplazamiento de la plataforma desde el último frame
// - platform.position: posición actual de la plataforma
// - previousPlatformPosition: posición guardada de la plataforma en el frame anterior
// - platformMovement: vector que representa el movimiento total de la plataforma durante este frame
Vector3 platformMovement = platform.position - previousPlatformPosition;
// Actualizar la posición previa de la plataforma para el siguiente frame
// - Esto permite calcular el desplazamiento en el próximo ciclo
previousPlatformPosition = platform.position;
// Aplicar el movimiento calculado al personaje usando CharacterController.Move
controller.Move(platformMovement);
}
}
Y por último, en este mismo script añadiremos los dos siguientes nuevos métodos:
/// <summary>
/// Método llamado cuando el personaje entra en contacto con otro objeto (colisión de tipo trigger).
/// Detecta si el objeto colisionado tiene la etiqueta "Platform" y establece referencias para sincronizar el movimiento.
/// </summary>
void OnTriggerEnter(Collider other)
{
// Verificar si el objeto colisionado tiene la etiqueta "Platform"
if (other.CompareTag("Platform"))
{
// Asignar el transform del objeto "Platform" a la variable 'platform'
// Esto permite rastrear la posición y movimiento de la plataforma
platform = other.transform;
// Guardar la posición actual de la plataforma para calcular su desplazamiento en cada frame
previousPlatformPosition = platform.position;
}
}
/// <summary>
/// Método llamado cuando el personaje deja de estar en contacto con otro objeto (colisión de tipo trigger).
/// Limpia las referencias de la plataforma para evitar errores al salir de ella.
/// </summary>
void OnTriggerExit(Collider other)
{
// Verificar si el objeto con el que se salió de la colisión tiene la etiqueta "Platform"
if (other.CompareTag("Platform"))
{
// Limpiar la referencia a la plataforma
platform = null;
// Reiniciar la posición guardada de la plataforma
previousPlatformPosition = Vector3.zero;
}
}
Estos métodos detectan si el personaje entró o salió de la zona que designamos anteriormente en nuestra plataforma. Y al entrar en ella, añade la posición de la plataforma a nuestra posición actual del personaje para que este se mueva junto con la plataforma. Y al salir de ella, elimina esta referencia de nuestro personaje.
Con esto podremos usar nuestras plataformas sin problemas 🙂
No olvides asignar los tags y layers como descritos en este tutorial
¡Ahora sí, el Momento ha llegado, Oprime Play y disfruta tu Plataforma en tu Primer Juego 3D 🙂 !
Ejercicios.
Para reforzar lo aprendido, es necesario practicarlo, por ello intenta realizar los siguientes ejercicios:
- Modifica el script “MovingPlatform” para que la línea de color “cyan” ahora sea roja (red).
- Modifica valores en los componentes “Moving Platform” para que se mueva más rápido y se quede más tiempo en cada waypoint.
- Crea diferentes plataformas que te permitan llegar a lugares lejanos (en horizontal como en vertical).
Este Tutorial de Unity termina aquí. Acompáñanos en el siguiente tutorial donde añadiremos más funcionalidades a “Tu Primer Juego 3D”.
Siguiente Tutorial de Unity: “4. Salud y Daño“
Unity Tutorial: “Tu Primer Juego 3D“
1. Creando un Juego 3D
2. Supercargando el Juego
3. Añadiendo Plataformas
4. Salud y Daño
5. Enemigos 3D
6. Dinero y Triggers
Ver más Tutoriales






















