首页 > 解决方案 > C#中MakeSingleTon和MakeInstance有什么区别

问题描述

MakeSingleTon:

void Awake()
{
    MakeSingleTon();
}


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

制作实例:

void Awake()
{
    MakeInstance();
}

void OnDisable()
{
    instance = null;
}

void MakeInstance()
{
    if (instance == null)
    {
        instance = this;
    }
}

我刚刚学会了 C# 编码,我不知道和之间有什么区别MakeInstanceMakeSingleTon我认为它们是一样的,因为对于我的一些实验,它们具有相同的功能......

那么,它们之间有什么区别或者它们是一样的呢?

标签: c#unity3d

解决方案


您可以像这样重写您的“单例”代码:

    if(instance == null)
    {
        instance = this;
        DontDestroyOnLoad(gameObject);
    }
    else
    {
        Destroy(gameObject);
    }

将代码更改为看起来与您的单实例代码相似,您现在可以看到两者都有效地做同样的事情。唯一的区别是如果已经存在另一个实例,Singleton 会自动销毁自己。

通常,Singleton 用于只应创建一次并应在游戏的整个生命周期中持续存在的逻辑。如果创建了另一个实例,它应该立即销毁自己以避免争用。“得分经理”之类的东西就是一个很好的例子。IE 如果场景发生变化并且新场景尝试创建新的乐谱管理器,您不希望您的乐谱重置。

除非您经常更改场景并且需要在多个场景中保留您的实例,否则我建议您只使用 Single Instance 而不是 Singleton。

您只能在层次结构中的根对象上调用 DontDestroyOnLoad,因此您只能在根对象上添加 Singleton 脚本。您可以使层次结构中的任何对象成为单个实例。


推荐阅读