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)
————————————————

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

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 在Unity中,实现单例模式的方式与其他编程语言中基本相同。以下是一个简单的例子: ```c# public class Singleton : MonoBehaviour { private static Singleton instance; private void Awake() { if (instance != null && instance != this) { Destroy(gameObject); } else { instance = this; DontDestroyOnLoad(gameObject); } } public static Singleton Instance { get { return instance; } } } ``` 在这个例子中,我们使用了一个静态变量`instance`来存储单例对象。在`Awake`方法中,我们检查是否已经存在单例对象,如果存在则销毁当前对象,否则将当前对象赋值给`instance`并且使用`DontDestroyOnLoad`方法使其在场景切换时不被销毁。同时,我们通过一个静态属性`Instance`来获取单例对象。 在需要使用单例对象的地方,我们可以直接使用`Singleton.Instance`来获取该对象。 ### 回答2: Unity单例模式是一种设计模式,用于确保一个只有一个实例,并提供一个全局访问点以便在整个项目中使用。 在Unity中,我们经常需要在不同的脚本之间共享数据或者控制某个对象的行为,这时候就可以使用单例模式。使用单例模式可以保证只有一个实例存在,并且可以通过静态方法或属性来访问该实例。 在实现Unity单例模式时,通常会使用一个私有的静态字段来存储该实例,并提供一个公共的静态属性或方法来获取该实例。在获取实例时,首先判断该实例是否已经存在,如果已经存在则直接返回该实例,否则创建一个新实例并返回。这样就可以确保只有一个实例存在,并且可以在需要的地方方便地使用。 例如,我们可以创建一个GameManager,并使用单例模式来确保只有一个GameManager实例存在。代码示例: ```csharp public class GameManager : MonoBehaviour { private static GameManager instance; private void Awake() { if (instance != null) { Destroy(gameObject); } else { instance = this; DontDestroyOnLoad(gameObject); } } public static GameManager Instance { get { return instance; } } // 其他方法和属性 } ``` 在上述代码中,通过Awake方法来判断实例是否存在,如果存在则销毁当前实例,否则将当前实例赋值给静态的instance字段,并使用DontDestroyOnLoad方法来保证在场景切换时不被销毁。通过Instance属性可以在其他脚本中方便地访问GameManager实例。 使用Unity单例模式可以方便地管理和访问全局的对象和数据,但需要注意的是,过度使用单例模式可能会导致代码的耦合性增加,降低代码的可读性和可维护性,因此在使用时需要权衡利弊。 ### 回答3: Unity中的单例模式是一种常用的设计模式,用于确保某个在游戏运行过程中只能被实例化一次。 在Unity中,我们通常会把一些需要在多个脚本中共享数据和功能的设计为单例。这样可以保证在整个游戏中只有一个实例存在,并且其他脚本可以方便地访问这个实例。 实现单例模式需要以下步骤: 1. 首先,我们需要在该中定义一个私有的静态变量,用来保存的唯一实例。这个变量的型应该是本身。 2. 接下来,我们定义一个公有的静态方法,用来获取该实例。在这个方法中,我们需要判断该实例是否已经存在,如果不存在就创建一个新的实例,并将其保存到上面定义的变量中。如果已经存在,则直接返回该实例。 3. 最后,我们需要将该的构造函数标记为私有,以防止在其他地方创建实例。 实现单例模式后,其他脚本只需要通过调用该的公有静态方法即可获取到实例,然后就可以使用这个实例提供的功能和数据了。这样可以避免在游戏中重复创建实例,节省内存开销。 总之,Unity单例模式是一种非常有用的设计模式,能够确保在游戏中某个只能被实例化一次,并且可以方便地在其他脚本中访问这个实例

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极致人生-010

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值