Unity3D: مجمع مدير البرامج النصية التلقائية

المقدمة


ستركز هذه المقالة على نوع واحد من تنظيم التفاعل بين مديري النص البرمجي (تسمى الفردي) ، وعلى وجه التحديد ، استخدام فئة مجمّع منفصلة ، والتي تحتوي على روابط لجميع مديري المثيلات. خطرت لي فكرة إنشاء فئة مجمعة بعد قراءة هذه المقالة .

مهام


توصلت إلى استنتاج مفاده أن توجيه المديرين إلى فئة التجميع باستخدام أقلامهم الخاصة في كل مرة أمر غير مريح للغاية. عند إنشاء مدير جديد ، سيتعين عليك فتح فئة المجمّع وإجراء التغييرات. مع خبرة كافية ، يمكنك أتمتة هذه العمليات المملة. وهكذا ، تم تحديد المهام: الإنشاء التلقائي للعلامات الفردية وجامعيها التلقائي.

كلاس سنجلتون


using UnityEngine;
public class Singleton<T>: MonoBehaviour where T: MonoBehaviour
{
	public static T instance { get; private set; }

	public void Awake()
	{
		if (instance == null)
		{
			instance = GetComponent<T>();
			ManagersAregator.addManager(instance);
		}
		else
		{
			Debug.Log($"<color=red>   {typeof(T).ToString()}</color>");
			Destroy(gameObject);
		}
	}

	public void OnDestroy()
	{
		ManagersAregator.removeManager<T>();
	}
}

يستخدم تطبيق المفرد الكلاسيكي في Unity المتغير الثابت المثيل . يتحقق أسلوب Awake () لمعرفة ما إذا تم تعريف المثيل . إذا لم يكن الأمر كذلك ، نحصل على مرجع إلى مثيل الفصل باستخدام هذه الكلمة الرئيسية . لكن منذ في تطبيق معين ، يتم استخدام متغير "قالب" من الفئة T ، وهذا لا يمكن استخدامه. ولكن يمكننا بسهولة الحصول على مكون T من الكائن الذي يتم تعليق البرنامج النصي عليه. إذا تم تعريف المثال ، فيجب تدميره. وبالتالي ، سيكون الكائن دائمًا على المسرح في نسخة واحدة.

في طريقة Awake ()تتم إضافة عنصر جديد إلى فئة المجمع ، وفي طريقة OnDestroy () ، تتم إزالة العنصر من فئة المجمع.

إنشاء مفرد من فئة MyClass كما يلي:

public class MyClass: Singleton<MyClass>

إذا كنت بحاجة إلى استخدام استيقظ () طريقة في MyClass الدرجة ، فأنت بحاجة إلى استخدام قاعدة الكلمة ( أكثر حول قاعدة والميراث ):

new void Awake()
	{
		base.Awake(); //  Awake() -
		// 
	}

مجمع الفصل


using System.Collections.Generic;
using UnityEngine;

public static class ManagersAregator
{
	static Dictionary<string, MonoBehaviour> Managers = new Dictionary<string, MonoBehaviour>();

	public static void addManager<T>(T newManager)
	{
		string keyWord = typeof(T).ToString();

		if(Managers.ContainsKey(keyWord))
		{
			Debug.Log($"[ManagersAregator]  -{newManager}-   -{keyWord}-  ");
		}
		else
		{
			Managers.Add(keyWord, newManager as MonoBehaviour);
			Debug.Log($"<color=green>[ManagersAregator]    -{newManager}-   -{keyWord}-</color>");
		}
	}

	public static T getManager<T>(string callback) where T: Singleton<T>
	{
		string keyWord = typeof(T).ToString();

		if(Managers.ContainsKey(keyWord))
		{
			Debug.Log($"<color=yellow>[{callback}]   -{keyWord}-</color>");

			MonoBehaviour mbTemp = null;
			T manager = null;

			if(Managers.TryGetValue(keyWord, out mbTemp))
			{
				manager = (T)mbTemp;
				Debug.Log($"<color=green>[{callback}]  -{manager}- </color>");
			}
			else
			{
				Debug.Log($"<color=red>[{callback}]    -{keyWord}-</color>");
			}

			return manager;
		}

		Debug.Log($"<color=red>[ManagersAregator]    -{keyWord}-   .</color>");
		return null;
	}

	public static void removeManager<T>()
	{
		string keyWord = typeof(T).ToString();

		if(Managers.ContainsKey(keyWord))
		{
			Managers.Remove(keyWord);
			Debug.Log($"[ManagersAregator]    -{keyWord}-   ");
		}
		else
		{
			Debug.Log($"[ManagersAregator]    -{keyWord}-   .");
		}
	}
}

الفئة ثابتة ، أي لا يمكن أن يكون له مثيل على المسرح. وبالتالي ، سيكون متاحًا من أي مشهد في أي وقت.

يتم تخزين جميع مديري البرامج النصية (أحادية اللغة) في قاموس المديرين . المفتاح لكل مدير هو اسم فئة ذلك المدير. ربما يطرح الوافدون الجدد على البرمجة السؤال التالي: "باه ، ولكن ما هو هذا القاموس الذي يخزن MonoBehavior ، وجميع الفئات ترث من Singleton ؟". هذا سؤال جيد ، والإجابة عليه هي مفتاح تنفيذ مجمع تلقائي لمديري أي فئة.

في البرمجة ، هناك مفهوم التحويل من نوع البث إلى فئة أساسية. نظرًا لحقيقة أن جميع الطبقات في الوحدة ترث من MonoBehaviour ،يمكن تطبيقها على MonoBehabiour . لذلك ، يحتوي قاموس المديرين على كائنات من فئة MonoBehaviour فقط .

ضع في اعتبارك طرق فئة التجميع:

void addManager<T>(T newManager)

تسمى هذه الطريقة في طريقة Awake () لفئة Singleton . الوسيطة هي متغير ثابت لفئة المثيل . بعد ذلك ، يتم إنشاء مفتاح باسم الفئة التي ينتمي إليها المثيل ، وتتم إضافة المدير إلى القاموس.

T getManager<T>(string callback) where T: Singleton<T>

تأخذ الدالة كوسيطة سلسلة باسم الفئة من حيث يتم استدعاء الأسلوب. يتم ذلك حصريًا لتصحيح الأخطاء بشكل ملائم (تعرض وحدة التحكم الفئة من حيث تسمى الطريقة). مثال على استخدام هذه الطريقة في فئة AnotherMyClass :

public class AnotherMyClass: MonoBehaviour
	void Start()
	{
		string cb = GetType().ToString(); //     
		MyClass MC = ManagersAregator.getManager<MyClass >(cb);
	}

سيتم تعليق رسالة في وحدة التحكم: " Hu ** I، redo [AnotherMyClass] Manager -MyClass- الواردة."

void removeManager<T>()

حذف مدير من النوع T من القاموس إذا كان موجودًا في القاموس.

ملخص


في الواقع ، من بين الوظائف الثلاث لفئة العارض ، يحتاج المطور فقط إلى استخدام طريقة getManager . ميزة إضافية خاصة هي الرؤية الجيدة لرسائل التصحيح لجميع المناسبات. اختياريًا ، بالطبع ، يمكنك إيقاف تشغيلها. أعتقد أنه سيكون من الملائم للغاية أن نرى في أي نقطة زمنية ، وأي فئة تحاول الحصول على شيء وما تحاول الحصول عليه.

آمل أن تكون هذه المقالة مفيدة لك وأنك اكتشفت شيئًا مفيدًا لنفسك!

All Articles