当前位置: 首页 > news >正文

Unity | 工具类:单例总结

目录

一、常规单例

二、Unity单例

1. MonoBehaviour单例

2.Simple单例


一、常规单例

        常规的单例模式是指在普通类中实现单例模式的方式,而不依赖于任何框架或引擎。这种单例模式在许多编程语言中都非常常见,其主要特点是:

  1. 单例类有一个私有的静态变量来保存唯一实例
  2. 提供一个公有的静态方法(通常是 Instance 方法)来获取唯一实例
  3. 将构造函数定义为私有,防止外部创建新的实例
public class Singleton
{
    // 用来保存唯一的实例
    private static Singleton instance = null;
    // 确保线程安全的锁对象
    private static readonly object lockObj = new object();

    // 私有构造函数,防止实例化
    private Singleton()
    {
    }

    // 获取唯一实例的公有静态方法
    public static Singleton Instance
    {
        get
        {
            // 双重检查锁定(double-checked locking)
            if (instance == null)
            {
                lock (lockObj)
                {
                    if (instance == null)
                    {
                        instance = new Singleton();
                    }
                }
            }
            return instance;
        }
    }

    // 单例类中的方法示例
    public void DoSomething()
    {
        Console.WriteLine("Singleton instance is doing something.");
    }
}

二、Unity单例

1. MonoBehaviour单例

        适合在需要动态创建单例对象的场合,并能处理场景切换等复杂情况。

优点:

  1. 懒加载Instance属性只有在第一次访问时才会创建实例,这有助于减少不必要的开销。
  2. DontDestroyOnLoad:使用DontDestroyOnLoad保证实例在在场景切换时不被销毁。
  3. 防止重复创建单例:在销毁时设置mIsDestroying标记,防止对已销毁单例进行重复创建。

缺点:

  1. GameObject创建管理:它通过new GameObject().AddComponent<MonoBehaviourSingleton>()的方式创建实例,这在某些情况下过于灵活,可能导致难以管理和调试。
  2. 静态变量的潜在问题:如果游戏中对于对象销毁和创建的逻辑非常复杂,可能会因为静态变量状态互相干扰造成潜在的问题。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MonoBehaviourSingleton : MonoBehaviour
{
    static bool mIsDestroying;               //判断销毁的静态变量
    static MonoBehaviourSingleton mInstance;
    public static MonoBehaviourSingleton Instance
    {
        get
        {

            if (mInstance == null)
            {
                if (mIsDestroying)
                {
                    Debug.LogWarning("[MonoBehaviourSingleton] Instance '" + typeof(MonoBehaviourSingleton) +
                                     "' already destroyed. Returning null.");
                    return null;     //如果已销毁则跳出,防止嵌套调用
                }
                mInstance = new GameObject("[MonoBehaviourSingleton]").AddComponent<MonoBehaviourSingleton>();
                DontDestroyOnLoad(mInstance.gameObject);  //创建实例并设置为DontDestroyOnLoad
            }
            return mInstance;
        }
    }

    public void Test()
    {
        Debug.Log("Test");
    }
    void OnDestroy()
    {
        mIsDestroying = true;  //销毁时将标记变量设置为true,防止对已销毁单例进行重复创建
    }
}

2.Simple单例

        更直观简单,但需要确保对象在场景中存在且被正确管理,不适合频繁切换场景的情况。

优点:

  1. 更容易管理:不用手动创建GameObject,更多依赖于Unity编辑器来管理单例对象的创建。
  2. 避免重复实例:通过比较instancethis,可以确保在同一场景中只存在一个实例。

缺点:

  1. 缺乏灵活性:不能像前一种方法那样灵活创建实例,必须确保在场景中包含该组件对应的对象。
  2. 潜在的实例丢失问题:如果SimpleSingleton对象不在初始场景中,可能会引发问题,如果有依赖该单例的其他代码在实例初始化之前执行,会出现空引用错误。
using UnityEngine;

public class SimpleSingleton : MonoBehaviour
{
    private static SimpleSingleton instance;

    public static SimpleSingleton Instance
    {
        get
        {
            if (instance == null)
            {
                Debug.LogError("Singleton instance has not been set. Make sure the singleton is properly instantiated.");
            }
            return instance;
        }
    }

    protected virtual void Awake()
    {
        if (instance == null)
        {
            instance = this;
            DontDestroyOnLoad(gameObject);
        }
        else if (instance != this)
        {
            Destroy(gameObject);
        }
    }

    public void Test()
    {
        Debug.Log("Test");
    }
}

相关文章:

  • Windows安装MySQL5.7.26教程图解
  • LeetCode 解题思路 20(Hot 100)
  • 再学:合约继承 、抽象合约 solidity接口、库、事件 合约重入攻击
  • C语言论递归函数及其本质
  • 【FAQ】HarmonyOS SDK 闭源开放能力 —Map Kit(6)
  • 中兴B860AV3.2-T/B860AV3.1-T2_S905L3-B_2+8G_安卓9.0_先线刷+后卡刷固件-完美修复反复重启瑕疵
  • Linux--内核进程O(1)调度队列
  • 20分钟上手DeepSeek开发:SpringBoot + Vue2快速构建AI对话系统
  • 画册相册图库摄影画廊H5开源版开发
  • 论文阅读:SCI 1区 RADAR: Robust AI-Text Detection via Adversarial Learning
  • TypeScript + Vue:类风格组件如何引领前端新潮流?
  • 植物知识分享论坛毕设
  • Python基础语法全解析:从入门到实践
  • Qt中打开windows的cmd窗口并显示
  • Git 使用SSH登陆
  • 工厂方法模式和抽象工厂模式详解
  • 【从零开始学习计算机科学与技术】计算机网络(六)传输层
  • 调整iptables规则,解决无法ssh连接服务器的问题
  • Linux中安装Git
  • Javascript 日期相关计算
  • 美国新泽西客运公司遭遇罢工:40年来首次,35万人受影响
  • 上海比常年平均时间提前12天入夏,明天最高气温可达33℃
  • 就规范涉企行政执法专项行动有关问题,司法部发布解答
  • “16+8”“生酮饮食”,网红减肥法究竟靠谱吗?
  • 定制基因编辑疗法治愈罕见遗传病患儿
  • 证监会发布《上市公司募集资金监管规则》,6月15日起施行