Ikal Esteban Fernández Galván
WTF? Juan que paso?!
Dar vida a un enemigo exige precisión: animaciones en cuatro direcciones, físicas coherentes y colisiones justas. Con un buen ajuste del collider, un Rigidbody2D sin gravedad y un Blend Tree bien configurado, el desafío se siente claro y sin injusticias. Además, con etiquetas limpias como player y enemy facilitas la programación y el control de choques.
¿Cómo preparar el enemigo con animaciones en cuatro direcciones?
Configura el conjunto visual y la lógica de animación para que el enemigo reaccione a los ejes horizontal y vertical. La clave está en partir del tile set, crear las cuatro animaciones y un Blend Tree bidimensional que transicione de forma suave.
¿Cómo manejar el daño: contacto o ataque?
Se opta por daño por contacto: cuando el jugador toca al enemigo, recibe daño. No se añade animación de ataque. Si te interesa ampliar, puedes crear otra fase de ataque en un Blend Tree alternativo como variante del diseño.
¿Qué físicas y colisiones necesita para un contacto justo?
Para que el choque se sienta correcto, el área de impacto debe ser precisa. Un collider más pequeño que la silueta visual evita la sensación de “me ha dado sin tocarme”. Con el Rigidbody2D configurado, el enemigo se moverá de forma estable sin rotaciones inesperadas.
¿Por qué reducir el collider del enemigo?
Porque mejora la percepción de justicia del reto. Evita momentos de “le di” o “no me rozó”, alineando el contacto real con la expectativa visual.
¿Cómo organizar el animator y cuándo crear el prefab?
Estructura primero el sistema de animaciones y físicas, y deja la creación del prefab para cuando tengas código y estadísticas listos. Esto evita rehacer vínculos y asegura consistencia.
¿Tú cómo ajustarías el collider o el Blend Tree para mejorar el reto sin que se sienta injusto? Comparte tu enfoque y dudas en los comentarios.
Pues yo me emocione y me tome la libertad de darle animaciones de idle que no he programado por ahora, ademas de las animaciones de caminar hacia cada lado y un pequeño sistema de movimiento, que por cierto esta muy mal optimizado :c
Aqui mi codigo
using System.Collections; using System.Collections.Generic; using UnityEngine; enum directions { left, right, up, down } public class Enemy : MonoBehaviour { Rigidbody2D enemyRb; Animator enemyAnim; float speed = 2; directions enemyMove=directions.right; float count = 0; //Boleano para definir si se esta moviendo bool isMoving; //Variables de animator const string Vertical = "Vertical"; const string Horizontal = "Horizontal"; const string isMovingAnim = "isMoving"; const string LAST_V = "lastVertical"; const string LAST_H = "lastHorizontal"; void Start() { enemyAnim = GetComponent<Animator>(); enemyRb = GetComponent<Rigidbody2D>(); } void Update() { switch (enemyMove) { case directions.right: enemyAnim.SetFloat(Horizontal, 1.0f); this.transform.position = new Vector3(this.transform.position.x + Time.deltaTime * speed , this.transform.position.y, 0); count+=Time.deltaTime; if (count > 4) { enemyMove = directions.down; count = 0; enemyAnim.SetFloat(Horizontal, 0f); } break; case directions.down: enemyAnim.SetFloat(Vertical, -1.0f); this.transform.position = new Vector3(this.transform.position.x , this.transform.position.y - Time.deltaTime * speed, 0); count += Time.deltaTime; if (count > 4) { enemyMove = directions.left; count = 0; enemyAnim.SetFloat(Vertical,0f); } break; case directions.left: enemyAnim.SetFloat(Horizontal, -1.0f); this.transform.position = new Vector3(this.transform.position.x - Time.deltaTime * speed , this.transform.position.y, 0); count += Time.deltaTime; if (count > 4) { enemyMove = directions.up; count = 0; enemyAnim.SetFloat(Horizontal, 1.0f); } break; case directions.up: enemyAnim.SetFloat(Vertical, 1.0f); this.transform.position = new Vector3(this.transform.position.x , this.transform.position.y + Time.deltaTime * speed, 0); count += Time.deltaTime; if (count > 4) { enemyMove = directions.right; count = 0; enemyAnim.SetFloat(Vertical, 0f); } break; } isMoving = false; enemyAnim.SetBool(isMovingAnim, isMoving); } }
Acabo de parchear ese codigo, con este queda super bonito, solo es cuestion de acomodar los parametros en el animator y queda perfecto :D
using System.Collections; using System.Collections.Generic; using UnityEngine; enum directions { left, right, up, down } public class Enemy : MonoBehaviour { Rigidbody2D enemyRb; Animator enemyAnim; float speed = 2; directions enemyMove=directions.right; float count = 0; //Boleano para definir si se esta moviendo bool isMoving; //Variables de animator const string Vertical = "Vertical"; const string Horizontal = "Horizontal"; const string isMovingAnim = "isMoving"; void Start() { enemyAnim = GetComponent<Animator>(); enemyRb = GetComponent<Rigidbody2D>(); isMoving = true; } void Update() { if (isMoving) { switch (enemyMove) { case directions.right: enemyAnim.SetFloat(Horizontal, 1.0f); this.transform.position = new Vector3(this.transform.position.x + Time.deltaTime * speed , this.transform.position.y, 0); count += Time.deltaTime; if (count > 4) { count = 0; isMoving = false; } break; case directions.down: enemyAnim.SetFloat(Vertical, -1.0f); this.transform.position = new Vector3(this.transform.position.x , this.transform.position.y - Time.deltaTime * speed, 0); count += Time.deltaTime; if (count > 4) { count = 0; isMoving = false; } break; case directions.left: enemyAnim.SetFloat(Horizontal, -1.0f); this.transform.position = new Vector3(this.transform.position.x - Time.deltaTime * speed , this.transform.position.y, 0); count += Time.deltaTime; if (count > 4) { count = 0; isMoving = false; } break; case directions.up: enemyAnim.SetFloat(Vertical, 1.0f); this.transform.position = new Vector3(this.transform.position.x , this.transform.position.y + Time.deltaTime * speed, 0); count += Time.deltaTime; if (count > 4) { count = 0; isMoving = false; } break; } } else { count += Time.deltaTime; if (count > 2) { switch (enemyMove) { case directions.down: enemyMove = directions.left; enemyAnim.SetFloat(Vertical, 0f); break; case directions.up: enemyMove = directions.right; enemyAnim.SetFloat(Vertical, 0f); break; case directions.left: enemyMove = directions.up; enemyAnim.SetFloat(Horizontal, 1.0f); break; case directions.right: enemyMove = directions.down; enemyAnim.SetFloat(Horizontal, 0f); break; } count = 0; isMoving = true; } } enemyAnim.SetBool(isMovingAnim, isMoving); } }
Ikal Esteban Fernández Galván
WTF? Juan que paso?!
Ikal Esteban Fernández Galván
le agregue ataque al player y ordene la carpeta animations (tambien estoy agregando ataque al enemigo): Video
Ikal Esteban Fernández Galván
Codigo nuevo del player:
//En la clase bool attacking = false; const string attack = "Attacking"; //Update attacking = false; if(Input.GetMouseButtonDown(0)) { attacking = true; } anim.SetBool(attack, attacking);
Leonardo Gutierrez
Genial
Wandy Rafael Santana Evangelista
Excelente clase.😄