Modèle d'usine. Exemple d'application dans Unity

Il y a en fait beaucoup de méthodes d'usine.
Même les constructions basiques if else sont des méthodes d'usine, tout comme switch.
Mais ce n'est pas pratique à lire et à développer.


Imaginez un exemple simple. Nous avons un jeu de slasher avec des monstres. Nous avons plusieurs modes: facile, moyen, difficile. Par conséquent, laissez les monstres avoir des vies et des dégâts différents. Comment organiser une création pratique de monstres en un seul endroit? Tout est contre-dépouillé.


1. Créez une description approximative du monstre sous forme de description.


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

2. Remplissez nos monstres par niveaux


Il existe en fait de nombreuses façons de remplir de telles descriptions, que ce soit json, xml ou simplement ScriptableObject. Pour un exemple, nous utiliserons ScriptableObject et nous créerons une classe de listes de descriptions de monstres.


 [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; } 

Et prends ça.


Puisque nous faisons 3 niveaux de difficulté, remplissons


Eh bien, nous avons maintenant toutes les descriptions des niveaux de difficulté pour nos monstres.


3. Créez un modèle pour le monstre mvc.


Ceci est juste un modèle pour utiliser l'extension du modèle afin de ne pas stocker les données sur le monstre directement dans le modèle.


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

4. Créez maintenant une classe d'usine qui créera des monstres en fonction du niveau de difficulté. Il est facile d'agrandir une telle usine, ainsi que d'ajouter d'autres usines pour générer des objets drop ou spawn.


 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. Et bien sûr, un exemple d'appeler la création d'un monstre.


Bien qu'il n'y ait pas de logique, nous utilisons du code dur. Dans la version finale, cela peut être une description supplémentaire du niveau auquel il y aura des paramètres pour le frai des monstres dans des conditions normales. Par exemple, lorsqu'un joueur passe un point spécifique, N ennemi de niveau X apparaîtra.


 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/fr482402/


All Articles