Fabrik muster. Anwendungsbeispiel in Unity

Es gibt tatsächlich viele Fabrikmethoden.
Sogar die grundlegenden if else-Konstrukte sind wie switch Factory-Methoden.
Es ist jedoch nicht bequem zu lesen und zu erweitern.


Stellen Sie sich ein einfaches Beispiel vor. Wir haben ein Slasher-Spiel mit Monstern. Wir haben verschiedene Modi: einfach, mittel, schwer. Lass die Monster deshalb unterschiedliche Leben und Schaden haben. Wie organisiere ich eine bequeme Kreation von Monstern an einem Ort? Alles ist unterboten.


1. Erstelle eine ungefähre Beschreibung des Monsters in Form von Beschreibung.


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

2. Fülle unsere Monster nach Leveln


Es gibt tatsächlich viele Möglichkeiten, solche Beschreibungen auszufüllen, sei es json, xml oder nur ScriptableObject. Als Beispiel verwenden wir ScriptableObject und erstellen eine Klasse von Listen mit Monsterbeschreibungen.


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

Und nimm das.


Da wir drei Schwierigkeitsgrade haben, füllen wir sie


Nun haben wir alle Beschreibungen der Schwierigkeitsgrade für unsere Monster.


3. Erstelle ein Modell für das MVC-Monster.


Dies ist nur eine Vorlage für die Verwendung der Modellerweiterung, um die Daten über das Monster nicht direkt im Modell zu speichern.


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

4. Erstelle nun eine Fabrikklasse, die je nach Schwierigkeitsgrad Monster erschafft. Es ist einfach, eine solche Fabrik zu erweitern und andere Fabriken hinzuzufügen, um Drop- oder Spawn-Objekte zu generieren.


 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. Und natürlich ein Beispiel, wie man die Erschaffung eines Monsters nennt.


Obwohl es keine Logik gibt, verwenden wir Hardcode. In der endgültigen Version kann dies eine zusätzliche Beschreibung des Levels sein, auf dem es Parameter für die Entstehung von Monstern unter normalen Bedingungen geben wird. Wenn ein Spieler beispielsweise einen bestimmten Punkt überschreitet, erscheinen N Gegner der Stufe X.


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


All Articles