Unity遊戲框架設計之單例Mono
簡單介紹
在編寫 Unity 指令碼的過程中,我們通常需要編寫一些依賴於 MonBehaviour 生命週期且全域性始終唯一的類,比如 EventManager、MessageManager、ResourceManager 和 UIManager 等等。
我們可以基於單例模式,設計出名為 SingletonMono 的單例類,然後讓擁有上述特性的類繼承於 SingletonMono 單例類,來保證這些類在遊戲執行過程中始終唯一。
一般的指令碼必須依賴於某個場景中的某個遊戲物件。而在遊戲執行的過程中,我們可能頻繁的切換 Scene,而這可能導致我們在切換場景的過程中,不小心將 SingletonMono 單例類銷燬,從而造成錯誤。因此我們需要將指令碼依賴的遊戲物件放到 DontDestroyOnLoad() 中,來保證場景切換不會導致 SingletonMono 單例類的銷燬。
程式碼設計
public abstract class SingletonMono<T> : MonoBehaviour where T : MonoBehaviour
{
private static T _instance;
public static T Instance
{
get
{
if (_instance == null)
{
_instance = FindObjectOfType<T>();
if (_instance == null)
{
GameObject gameObject = new GameObject();
DontDestroyOnLoad(gameObject);
gameObject.name = typeof(T).Name;
_instance = gameObject.AddComponent<T>();
}
}
return _instance;
}
}
protected virtual void Awake()
{
if (_instance == null)
{
DontDestroyOnLoad(gameObject);
_instance = this as T;
return;
}
Destroy(gameObject);
}
}
程式碼說明
(一)保證所有繼承 SingletonMono 類的指令碼在遊戲中全域性唯一。
(二)保證所有繼承 SingletonMono 類的指令碼不會隨著場景的解除安裝而銷燬。
(三)遊戲中所有需要使用 Unity 生命週期的單例類必須繼承 SingletonMono,特別是 XXXMananger 類。
後記
由於個人能力有限,文中不免存在疏漏之處,懇求大家斧正,一起交流,共同進步。