unity 单例模式(实例详解)

文章目录


在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 有以下几点意义:

  1. 防止外部直接创建实例:由于构造函数是受保护的(protected),所以其他类无法通过 new SingletonClass() 的方式直接实例化该类。这样确保了只有单例类自己内部才能创建实例。

  2. 允许子类继承:尽管外部不能直接实例化,但这个构造函数对子类仍然是可见的。这意味着如果将来需要基于 SingletonClass 创建派生类,子类可以通过 base() 调用基类的构造函数进行初始化。

  3. 符合单例设计原则:在单例模式中,我们希望控制类的实例化过程,以确保在整个应用程序中只有一个实例存在。通过将构造函数设为 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)
————————————————

​最后我们放松一下眼睛
在这里插入图片描述

相关推荐

  1. Unity 模式

    2024-01-23 11:02:05       11 阅读
  2. 模式详解

    2024-01-23 11:02:05       39 阅读
  3. 模式详解

    2024-01-23 11:02:05       19 阅读
  4. 模式详解

    2024-01-23 11:02:05       13 阅读
  5. C++模式详解

    2024-01-23 11:02:05       25 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-23 11:02:05       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-23 11:02:05       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-23 11:02:05       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-23 11:02:05       20 阅读

热门阅读

  1. 什么是DDoS

    2024-01-23 11:02:05       30 阅读
  2. LeetCode59 螺旋矩阵 II

    2024-01-23 11:02:05       34 阅读
  3. LeetCode 46. 全排列

    2024-01-23 11:02:05       38 阅读
  4. Hive 数仓及数仓设计方案

    2024-01-23 11:02:05       33 阅读
  5. openssl3.2/test/certs - 006 - trust variants: +anyEKU -anyEKU

    2024-01-23 11:02:05       34 阅读
  6. Rust 智能指针

    2024-01-23 11:02:05       30 阅读
  7. 深入理解Rust语句和表达式

    2024-01-23 11:02:05       37 阅读
  8. 【MySQL】了解索引的第一步

    2024-01-23 11:02:05       32 阅读
  9. IDEA的快捷键

    2024-01-23 11:02:05       34 阅读
  10. 哈希--128. 最长连续序列/medium 理解度C

    2024-01-23 11:02:05       32 阅读