我正在做一些使用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
的新实例。 相反,你需要做两件事:
ControladorEstados
类中创建ControladorEstados
,例如在Start()
方法中。 getInstancia()
之前,直到第1步发生。 请注意,以上只是解决问题的最简单步骤。 很有可能,有一种更好的方式来查询Unity3d API以允许“脚本2”检索所需的ControladorEstados
实例(例如,从场景中返回当前正确的控制器实例或类似的东西)。 但是,如果没有一个更完整的代码示例,就无法确切地说明更好的方法是什么样的。
你的方法不完全是统一的方式。 你基本上把单身和MonoBehaviour混合起来。
请记住,Unity是组件驱动的。 如果你想要一个扩展了MonoBehaviour的对象的实例,只需要创建一个总是在场景中的对象(比如GameManager)并且添加ControladorEstados
。
然后,您可以在脚本中从那里引用它,而不是使用单例。