静态实例不像我所期望的那样工作

我正在做一些使用Unity构build的游戏状态的testing,使用如下所示:

脚本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 ()日志中,我可以看到variables设置为true ,但脚本ControladorEstados不能像我期望的那样进行更新。 它没有按预期工作。

我已经把Debug.Log("Update"); 看看它是否正在运行Update ,并且正在运行,但是if它是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; } 

随着彼得Duniho的响应我创build上面的代码,您可以看到的变化,我也知道使用脚本执行命令要使用其中的命令。

我不知道这是不是最好的方法,但似乎工作,我张贴它,以防有人帮助类似的东西。

如果没有一个好的,最小的,完整的和可验证的代码示例 ,可以可靠地再现问题,不可能肯定地说你需要改变以解决问题。

但是,显然你正在处理两个不同的ControladorEstados实例。 正在运行的实例(以及Unity3d调用ControladorEstados.Update()方法的那个实例)与您在“脚本2”中描述的任何类中的controladorEstados变量引用变量不同。

在你的ControladorEstados.getInstancia()方法中,你不应该创建一个ControladorEstados的新实例。 相反,你需要做两件事:

  1. ControladorEstados类中创建ControladorEstados ,例如在Start()方法中。
  2. 确保您描述为“脚本2”的类不在调用getInstancia()之前,直到第1步发生。

请注意,以上只是解决问题的最简单步骤。 很有可能,有一种更好的方式来查询Unity3d API以允许“脚本2”检索所需ControladorEstados实例(例如,从场景中返回当前正确的控制器实例或类似的东西)。 但是,如果没有一个更完整的代码示例,就无法确切地说明更好的方法是什么样的。

你的方法不完全是统一的方式。 你基本上把单身和MonoBehaviour混合起来。

请记住,Unity是组件驱动的。 如果你想要一个扩展了MonoBehaviour的对象的实例,只需要创建一个总是在场景中的对象(比如GameManager)并且添加ControladorEstados

然后,您可以在脚本中从那里引用它,而不是使用单例。