Domina un patrón robusto para enemigos en Unity: colisiones que activan el giro, daño configurable al jugador y control del escenario con prefabs. Con una lógica clara en OnTriggerEnter2D y el uso correcto de capas y colliders, el enemigo queda contenido entre rocas y se mueve con un efecto visual suave gracias a la animación en FixedUpdate.
¿Cómo configurar rocas, capas y prefabs para contener al enemigo?
Coloca un bloque de nivel desde los prefabs y sitúa rocas en el suelo para delimitar la zona. No hace falta etiquetarlas: la capa suelo ya evita que el personaje atraviese el escenario. Si quieres identificarlas, puedes usar etiquetas como rock o escenario, pero no es necesario.
Usa un bloque de nivel base y sitúalo en 0,0,0.
Arrastra el enemigo dentro del bloque para que el cambio quede en el prefab.
Añade una roca y ajusta su tamaño y collider para que el personaje pueda saltar sobre ella.
Clona una segunda roca y coloca al enemigo entre ambas: rebotará de una a otra.
Aplica los cambios al prefab y elimina la instancia en escena si tienes generación automática de niveles.
Resultado esperado: el enemigo queda “domesticado”, rebotando entre rocas y sin escapar del área diseñada por el game designer.
¿Cómo detectar colisiones y depurar con OnTriggerEnter2D?
El enemigo tiene su propio collider (por ejemplo, un Capsule Collider) marcado como isTrigger. Así, cuando entra en contacto con otro collider, Unity llama a OnTriggerEnter2D. Para comprobar con qué choca, usa un registro simple del tag en consola.
¿Qué comprobar con Debug.Log?
Ver etiquetas como: untagged, Player, Coin.
Ajustar temporalmente la velocidad del jugador para observar mejor la consola.
Idea clave: en función de collision.tag decides la acción. Con monedas no haces nada; con el jugador aplicas daño; con escenario u otros, giras al enemigo.
¿Cómo aplicar daño al jugador y provocar el giro automático?
Gestiona la lógica por casos. Si la etiqueta es Coin, sales del método. Si es Player, localizas su componente y llamas a CollectHealth con un valor negativo. Si no es ninguna de las anteriores, cambias la dirección del enemigo invirtiendo la variable facingRight.
¿Cómo definir daño configurable desde el editor?
Expón un entero público enemyDamage.
Evita “hardcodear” valores: podrás crear enemigos con daños distintos.
publicint enemyDamage =10;voidOnTriggerEnter2D(Collider2D collision){// Moneda: no reaccionar.if(collision.tag =="coin")return;// Jugador: aplicar daño.if(collision.tag =="Player"){var player = collision.gameObject.GetComponent<PlayerController>();if(player !=null){ player.CollectHealth(-enemyDamage);}return;}// Escenario u otros: girar. facingRight =!facingRight;}
¿Cómo se logra el efecto visual del giro?
Cambias solo el estado: facingRight = !facingRight.
La rotación real la hace el método FixedUpdate ya implementado, generando un giro suave.
Comportamiento logrado: el enemigo choca con la roca, da la vuelta y vuelve. Al pasar por detrás de las monedas, no las afecta. Se crea un sistema de rutas simple con colisiones, alternativa directa a usar waypoints.
—
Habilidades y conceptos puestos en práctica:
Configuración de prefabs y colocación de elementos de escenario.
Uso de capas frente a etiquetas para colisión del suelo.
Manejo de colliders con isTrigger y método OnTriggerEnter2D.
Depuración con Debug.Log y lectura de collision.tag.
Parámetros configurables en el editor: enemyDamage como int.
Interacción con el jugador vía GetComponent<PlayerController> y CollectHealth con valores negativos.
Control de dirección con bandera booleana facingRight y animación en FixedUpdate.
Rutas por colisión frente a waypoints.
Nota práctica: queda por ajustar la altura de colisión para evitar que el collider se quede “enganchado” y gestionar la muerte del personaje en una mejora posterior.
¿Te gustaría comentar cómo limitas tú las rutas de los enemigos o qué otras etiquetas/capas te funcionan mejor en Unity?