文章目录
在Unity中,单例模式是一种常用的编程设计模式,用于确保在整个应用程序生命周期中,只有一个类的实例存在。这样可以保证数据的全局唯一性和共享性,例如游戏场景中的资源管理器、游戏控制器、事件管理器等。
以下是一个简单的C#实现Unity中单例模式的例子:
public class SingletonClass : MonoBehaviour
{
private static SingletonClass _instance;
public static SingletonClass Instance
{
get
{
if (_instance == null)
{
// 如果实例不存在,则查找场景中已有的SingletonClass组件并将其设置为_instance
_instance = FindObjectOfType<SingletonClass>();
// 如果没有找到实例,创建一个新的GameObject挂载SingletonClass脚本并设置为_instance
if (_instance == null)
{
var singletonObject = new GameObject();
_instance = singletonObject.AddComponent<SingletonClass>();
singletonObject.name = nameof(SingletonClass);
DontDestroyOnLoad(singletonObject); // 保持单例在整个应用生命周期内不被销毁
}
}
return _instance;
}
}
protected SingletonClass() {}
private void Awake()
{
// 如果_instance尚未初始化,并且当前对象不是_instance(即第一次Awake调用)
if (_instance == null && this != _instance)
{
// 设置当前对象为_instance
_instance = this;
// 防止切换场景时该单例对象被销毁
DontDestroyOnLoad(gameObject);
}
else if (this != _instance) // 若_instance已存在但不是当前对象,则销毁多余的实例
{
Destroy(gameObject);
}
}
}
在C#中,protected SingletonClass() {}
这个构造函数的作用是限制类的实例化方式。在这个单例模式实现中,将构造函数设为 protected
有以下几点意义:
-
防止外部直接创建实例:由于构造函数是受保护的(protected),所以其他类无法通过
new SingletonClass()
的方式直接实例化该类。这样确保了只有单例类自己内部才能创建实例。 -
允许子类继承:尽管外部不能直接实例化,但这个构造函数对子类仍然是可见的。这意味着如果将来需要基于
SingletonClass
创建派生类,子类可以通过base()
调用基类的构造函数进行初始化。 -
符合单例设计原则:在单例模式中,我们希望控制类的实例化过程,以确保在整个应用程序中只有一个实例存在。通过将构造函数设为 protected,并提供一个公共静态属性或方法来获取单例实例,可以确保这一目标得以实现。
因此,在上面的Unity单例模式实现中,protected SingletonClass() {}
构造函数是为了配合单例模式的实现策略,限制实例化权限,保证全局唯一性。
在上述代码中,SingletonClass
类遵循单例模式原则,确保无论何时何地访问 SingletonClass.Instance
,返回的都是同一个实例。同时,为了防止场景切换时该单例对象被销毁,我们使用了 DontDestroyOnLoad
方法。
python推荐学习汇总连接:
50个开发必备的Python经典脚本(1-10)
50个开发必备的Python经典脚本(11-20)
50个开发必备的Python经典脚本(21-30)
50个开发必备的Python经典脚本(31-40)
50个开发必备的Python经典脚本(41-50)
————————————————
最后我们放松一下眼睛