Unity游戏框架设计之单例Mono
Unity游戏框架设计之单例 Mono
简单介绍
在编写 Unity 脚本的过程中,我们通常需要编写一些依赖于 MonBehaviour 生命周期且全局始终唯一的类,比如 EventManager、TaskManager、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)
{
Debug.LogWarning("必须先将组件添加到游戏对象上才能使用 Instance 实例。");
_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;
}
Debug.LogWarning(("禁止多次创建单例脚本。"));
Destroy(gameObject);
}
}
代码说明
(一)游戏中所有需要使用 Unity 生命周期的单例类必须继承 SingletonMono,特别是 XXXMananger 类。
(二)保证所有继承 SingletonMono 类的脚本在游戏中全局唯一。
(三)保证所有继承 SingletonMono 类的脚本不会随着场景的卸载而销毁。
后记
由于个人能力有限,文中不免存在疏漏,恳求大家斧正,一起交流,共同进步。
热门相关:哥哥,我们应该做秘密朋友吗 史上第一密探 我向斐少撒个娇 驭房之术 大唐扫把星