El patrón State permite que un objeto cambie su comportamiento dependiendo de su estado interno. En Unity, esto puede ser útil para gestionar diferentes comportamientos de personajes, enemigos, controles del juego, entre otros.
📝 Ventajas
- Flexibilidad: Permite que el comportamiento de un objeto cambie en tiempo de ejecución basado en el estado actual.
- Organización del código: Divide el código en diferentes estados, facilitando la gestión y mantenibilidad.
- Reutilización de código: Permite reutilizar comportamientos entre diferentes entidades que comparten el mismo estado.
🚧 Desventajas
- Complejidad: Puede hacer que el código sea más complejo si no se gestiona correctamente.
- Dependencia entre estados: Puede generar dependencias entre diferentes estados, lo que dificulta la separación de responsabilidades.
- Dificultad en pruebas: Pruebas unitarias pueden ser complicadas debido a la dependencia del estado.
🎮 Uso en videojuegos
El patrón State es muy útil en videojuegos para gestionar comportamientos de personajes, enemigos, interfaz de usuario, y otros elementos que tienen diferentes estados y comportamientos.
Ejemplos de uso:
- Personajes: Cambiar entre estados de idle, correr, saltar, atacar, etc.
- Enemigos: Cambiar entre estados de búsqueda, ataque, huir, etc.
- Interfaz de Usuario: Cambiar entre estados de juego, menú, configuración, etc.
🤔 Preguntas para evaluar si es el correcto
- ¿Los comportamientos del objeto cambian en tiempo de ejecución?
- ¿El objeto tiene diferentes estados que requieren diferentes comportamientos?
- ¿Estos comportamientos pueden ser compartidos entre diferentes objetos?
- ¿Necesito una forma de manejar estados complejos de manera organizada?

🖥️ Código fuente
using UnityEngine;
public interface ICharacterState
{
void OnEnter(CharacterController character);
void OnExit(CharacterController character);
void OnUpdate(CharacterController character);
}
using UnityEngine;
public class IdleState : ICharacterState
{
public void OnEnter(CharacterController character) => Debug.Log("En estado Idle");
public void OnExit(CharacterController character) => Debug.Log("Saliendo del estado Idle");
public void OnUpdate(CharacterController character) { }
}
public class RunState : ICharacterState
{
public void OnEnter(CharacterController character) => Debug.Log("En estado Run");
public void OnExit(CharacterController character) => Debug.Log("Saliendo del estado Run");
public void OnUpdate(CharacterController character)
{
character.Move(Vector3.forward * Time.deltaTime * 5);
}
}