[英]Static instance does not work like I expect
我正在对使用 Unity 构建的游戏的状态进行一些测试,使用如下内容:
脚本 1
public class ControladorEstados : MonoBehaviour {
private static ControladorEstados controladorEstados = null;
//public bool pause { get; set;} = false; //¿ usa c# 4?
private bool pause;
public bool Pause {
get { return pause; }
set { pause = value; }
}
private bool gameOver;
public bool GameOver {
get { return gameOver; }
set { gameOver = value; }
}
//protected ControladorEstados () {}
private ControladorEstados () {}
void Start () {
pause = false;
gameOver = false;
}
void Update () {
Debug.Log("Update");
if (gameOver == true) {
Debug.Log("GameOver Game");
}
if (pause) {
Debug.Log("Pause Game");
}
}
public static ControladorEstados getInstancia () {
if (controladorEstados == null) {
controladorEstados = new ControladorEstados ();
}
return controladorEstados;
}
}
脚本 2
..//
private ControladorEstados controladorEstados = null;
void Awake() {
rb = GetComponent<Rigidbody>();
controladorEstados = ControladorEstados.getInstancia ();
}
void Start() {
}
void Update () {
// test
gameOver ();
}
private void gameOver (){
controladorEstados.GameOver = true;
Debug.Log("test gameOver () " + controladorEstados.GameOver);
}
}
在test gameOver ()
日志中,我可以看到该变量设置为true
,但是脚本ControladorEstados
在进行更新时没有按预期工作。 它没有按预期工作。
我已经把Debug.Log("Update");
查看它是否正在运行Update
,并且它正在运行,但是当它为true
时它不会分支到if
语句中。
我没有 C# 或 Unity 方面的经验,尽管问这个问题对我来说似乎很尴尬,但我已经研究了一段时间,我没有看到错误。 此外,我使用的是 Linux 版本,我不知道这是否可能是错误的一部分。
更新:
我刚刚添加了此代码更改:
void Update () {
Debug.Log("Update" + gameOver);
if (gameOver == true) {
Debug.Log("GameOver Game");
}
..//
它的输出是False
所以我可以看到它没有改变。 在脚本 2 中它是真的,但在脚本 1 中它是假的。 请给我一些关于我做错了什么的想法。
我解决了
脚本 1
void Awake () {
//controladorEstados = new ControladorEstados ();
if (controladorEstados == null) {
controladorEstados = this;
}
}
..//
public static ControladorEstados getInstancia () {
return controladorEstados;
}
根据 Peter Duniho 的响应,我创建了上面的代码,您可以看到更改,我也知道使用Script Execution Order来使用其中的一个命令。
我不知道这是否是最好的方法,但它似乎有效,我发布它以防有人帮助解决类似的问题。
如果没有一个可靠地重现问题的好的、最小的、完整的和可验证的代码示例,就不可能确定您需要更改什么来解决问题。
但是,很明显您正在处理ControladorEstados
两个不同实例。 运行(因此对于该Unity3d被调用的一个实例ControladorEstados.Update()
方法)是不是正在被引用的同一个实例controladorEstados
在任何类,你所描述为“脚本2”的变量。
在您的ControladorEstados.getInstancia()
方法中,您不应创建ControladorEstados
的新实例。 相反,您需要做两件事:
ControladorEstados
类时,例如在Start()
方法中,在ControladorEstados
类中设置ControladorEstados.controladorEstados
。getInstancia()
。 请注意,以上只是您可以用来解决问题的最少步骤。 在所有的可能性,有一个更好的方式来查询Unity3d API,允许“脚本2”检索的实例ControladorEstados
要(如返回当前,正确的控制器实例从一个场景,或类似的东西)。 但是如果没有更完整的代码示例,就不可能确切地说更好的方法会是什么样子。
您的方法不完全是 Unity 方式。 您基本上是将单例与 MonoBehaviour 混合在一起。
请记住,Unity 是组件驱动的。 如果您想要扩展 MonoBehaviour 的对象的单个实例,只需创建一个始终在场景中的对象(如 GameManager)并向其添加ControladorEstados
。
然后,您可以在需要使用它而不是使用单例的脚本中从那里引用它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.