c# – 为什么我的单身人士有两个不同的实例?

我使用以下模式在Unity中制作单例

public class BlobManager : MonoBehaviour  
{
    public static BlobManager instance {get; private set;}
    void Awake () 
    {
        if(instance != null && instance != this)
           Destroy(gameObject);

        instance = this;
        DontDestroyOnLoad(gameObject);
    }

    public void SomeFunction()
    {
       if (this != instance)
           Debug.Log("They're Different!")
    }
}

如SomeFunction()所示,它们总是不同.当我为BlobManager类本地设置一个值,而另一个使用静态var“instance”时,如下所示:

foo = "bar"; 
BlobManager.instance.foo = "foo";

在类中的断点上调试器中看到的foo的值将始终为“bar”.但是当其他类尝试访问同一个变量时,它将是“foo”.

我不确定如何查看Monodevelop中的内存地址,但我确定这个和this.instance会有不同的内存地址.
我的单身人士模式有问题吗?我也尝试了其他模式以及相同的结果.

最佳答案 在您的示例中,BlobManager实例化多次发生,但只有第一个实例保存在属性Instance中.

从MonoBehaviour派生意味着您可以将脚本附加到许多实例上.
Singleton必须具有私有构造函数,没有MonoBehaviour派生,您不必将此脚本附加到任何对象.如果需要将脚本附加到object,则应创建另一个派生自MonoBehaviour并控制单例的脚本

示例(未测试):

public class BlobManager
{
    static BlobManager _inst;
    public static BlobManager Instance {
    get
    {
        if (_inst == null)
            _inst = new BlobManager();
        return _inst;
    }
    }

    private BlobManager() 
    {

    }
}
点赞