我使用以下模式在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()
{
}
}