gpt4 book ai didi

c# - 为什么我的单例有两个不同的实例?

转载 作者:行者123 更新时间:2023-11-30 12:25:58 27 4
gpt4 key购买 nike

我使用以下模式在 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 设置一个值,并为使用静态变量“实例”设置另一个值时,如下所示:

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

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

我不确定如何查看 Monodevelop 中的内存地址,但我确定 thisthis.instance 会有不同的内存地址。我的单例模式有问题吗?我也尝试过其他模式,结果相同。

最佳答案

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

派生自 MonoBehaviour 意味着您可以将脚本附加到处理许多实例的许多对象。Singleton 必须有私有(private)构造函数,没有 MonoBehaviour 派生,并且您不能将此脚本附加到任何对象。如果您需要将脚本附加到对象,您应该创建另一个派生自 MonoBehaviour 并控制单例的脚本

示例(未测试):

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

private BlobManager()
{

}
}

关于c# - 为什么我的单例有两个不同的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30205680/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com