Pola pabrik. Contoh aplikasi dalam Unity

Sebenarnya ada banyak metode pabrik.
Bahkan dasar jika konstruksi adalah metode pabrik, seperti halnya saklar.
Tetapi tidak nyaman untuk membaca dan memperluas.


Bayangkan sebuah contoh sederhana. Kami memiliki permainan pedang dengan monster. Kami memiliki beberapa mode: mudah, sedang, keras. Karena itu, biarkan monster memiliki kehidupan dan kerusakan yang berbeda. Bagaimana cara mengatur penciptaan monster yang nyaman di satu tempat? Semuanya dilemahkan.


1. Buat deskripsi perkiraan monster dalam bentuk Deskripsi.


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

2. Isi monster kami berdasarkan level


Sebenarnya ada banyak cara untuk mengisi Deskripsi seperti itu, baik itu json, xml, atau hanya ScriptableObject. Sebagai contoh, kita akan menggunakan ScriptableObject dan kita akan membuat kelas daftar deskripsi monster.


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

Dan dapatkan ini.


Karena kita memiliki 3 tingkat kesulitan, mari kita isi


Nah, sekarang kita memiliki semua deskripsi tingkat kesulitan untuk monster kita.


3. Buat Model untuk monster mvc.


Ini hanya templat untuk menggunakan ekstensi model agar tidak menyimpan data tentang monster secara langsung dalam model.


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

4. Sekarang buat kelas pabrik yang akan membuat monster tergantung pada tingkat kesulitannya. Sangat mudah untuk memperluas pabrik seperti itu, serta menambah pabrik lain untuk menghasilkan benda jatuh atau bertelur.


 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. Dan tentu saja, contoh dari menyebut penciptaan monster.


Meskipun tidak ada logika, kami menggunakan hardcode. Dalam versi final, ini mungkin deskripsi tambahan tingkat di mana akan ada parameter untuk menelurkan monster dengan kondisi normal. Misalnya, ketika seorang pemain melewati titik tertentu, N musuh level X akan muncul.


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


All Articles