في الواقع هناك الكثير من أساليب المصنع.
حتى إذا كانت البنيات الأساسية هي طرق المصنع ، تمامًا مثل التبديل.
لكنها ليست مريحة للقراءة والتوسيع.
تخيل مثال بسيط. لدينا لعبة مائلة مع الوحوش. لدينا عدة أوضاع: سهلة ومتوسطة وصعبة. لذلك ، اسمح للوحوش بأرواح وأضرار مختلفة. كيفية تنظيم خلق مريحة من الوحوش في مكان واحد؟ كل شيء تقوض.
1. إنشاء وصف تقريبي للوحش في شكل وصف.
[Serializable] public class MobDescription { public float MaxHealth; public float Damage; }
2. ملء الوحوش لدينا من خلال المستويات
هناك بالفعل العديد من الطرق لملء مثل هذه الأوصاف ، سواء كان ذلك json أو xml أو ScriptableObject فقط. على سبيل المثال ، سوف نستخدم ScriptableObject وسنقوم بإنشاء فئة من قوائم أوصاف الوحوش.
[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; }
واحصل على هذا.

بما أننا نقوم بثلاثة مستويات من الصعوبة ، فلنملأ

حسنًا ، لدينا الآن جميع أوصاف مستويات صعوبة وحوشنا.
3. إنشاء نموذج للوحش mvc.
هذا مجرد قالب لاستخدام ملحق النموذج من أجل عدم تخزين البيانات المتعلقة بالوحش مباشرة في النموذج.
public class MobModel { private MobDescription _description; private float _currentHealth; public MobDescription Description => _description; public MobModel(MobDescription description){ _description = description; _currentHealth = _description.MaxHealth; }
4. قم الآن بإنشاء فئة المصنع التي ستخلق الوحوش اعتمادًا على مستوى الصعوبة. من السهل توسيع مثل هذا المصنع ، بالإضافة إلى إضافة مصانع أخرى لإنشاء كائنات إسقاط أو تفرخ.
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. وبالطبع ، مثال على الدعوة إلى إنشاء وحش.
بينما لا يوجد منطق ، نحن نستخدم hardcode. في الإصدار النهائي ، قد يكون هذا وصفًا إضافيًا للمستوى الذي ستوجد به المعلمات الخاصة بتفرخ الوحوش ذات الظروف العادية. على سبيل المثال ، عندما يمر اللاعب بنقطة محددة ، سوف يفرز N العدو من المستوى 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); } }