Patrón de fábrica Ejemplo de aplicación en Unity

En realidad, hay muchos métodos de fábrica.
Incluso las construcciones básicas si no son métodos de fábrica, al igual que el interruptor.
Pero no es conveniente leer y expandir.


Imagina un ejemplo simple. Tenemos un juego slasher con monstruos. Tenemos varios modos: fácil, medio, difícil. Por lo tanto, deja que los monstruos tengan vidas y daños diferentes. ¿Cómo organizar una creación conveniente de monstruos en un solo lugar? Todo está socavado.


1. Cree una descripción aproximada del monstruo en forma de Descripción.


[Serializable] public class MobDescription { public float MaxHealth; public float Damage; } 

2. Llena nuestros monstruos por niveles


En realidad, hay muchas formas de completar tales descripciones, ya sea json, xml o simplemente ScriptableObject. Por ejemplo, utilizaremos ScriptableObject y crearemos una clase de listas de descripciones de monstruos.


 [CreateAssetMenu(fileName = "MobDescriptions", menuName = "MobDescriptions", order = 51)] public class MobDescriptions : ScriptableObject { [SerializeField] private List<MobDescription> _listOgre; [SerializeField] private List<MobDescription> _listTroll; public List<MobDescription> ListOgre => _listOgre; public List<MobDescription> ListTroll => _listTroll; } 

Y consigue esto.


Como hacemos 3 niveles de dificultad, llenemos


Bueno, ahora tenemos todas las descripciones de los niveles de dificultad para nuestros monstruos.


3. Cree un modelo para el monstruo mvc.


Esta es solo una plantilla para usar la extensión del modelo para no almacenar los datos sobre el monstruo directamente en el modelo.


 public class MobModel { private MobDescription _description; private float _currentHealth; public MobDescription Description => _description; public MobModel(MobDescription description){ _description = description; _currentHealth = _description.MaxHealth; } //    } 

4. Ahora crea una clase de fábrica que creará monstruos dependiendo del nivel de dificultad. Es fácil expandir una fábrica de este tipo, así como agregar otras fábricas para generar objetos de caída o generación.


 public class Factory { private Dictionary<string, Func<int, MobModel>> mobFactory; public void Init(MobDescriptions descriptions) { mobFactory = new Dictionary<string, Func<int, MobModel>>() { {"ogre", (level) => new MobModel(descriptions.ListOgre[level])}, {"troll", (level) => new MobModel(descriptions.ListTroll[level])} }; } public MobModel CreateMobModel(string nameMob, int level) { return mobFactory[nameMob](level); } } 

5. Y, por supuesto, un ejemplo de llamar a la creación de un monstruo.


Si bien no hay lógica, usamos hardcode. En la versión final, esta puede ser una descripción adicional del nivel en el que habrá parámetros para el engendro de monstruos con condiciones normales. Por ejemplo, cuando un jugador pasa un punto específico, N enemigo del nivel X aparecerá.


 public class GameManager : MonoBehaviour { [SerializeField] private MobDescriptions _mobDescriptions; private Factory _factory; private void Start() { _factory = new Factory(); _factory.Init(_mobDescriptions); _factory.CreateMobModel("ogre", 2); } } 

Source: https://habr.com/ru/post/482402/


All Articles