我使用以下模式在 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 中的内存地址,但我确定 this
和 this.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/