我正在使用以下类似工具对使用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
的同时,并且它正在运行,但是当它是if
时,它并没有分支到true
语句中。我没有C#或Unity的经验,尽管我问这个问题似乎很尴尬,但是我已经有一段时间了,但是我没有看到错误。此外,我使用的是Linux版本,我不知道这是否可能是错误的一部分。
更新:
我刚刚添加了以下代码更改:
void Update () {
Debug.Log("Update" + gameOver);
if (gameOver == true) {
Debug.Log("GameOver Game");
}
..//
它的输出是
False
,因此我可以看到它没有变化。在脚本2中为true,但在脚本1中为false。请给我一些关于我做错了什么的想法。我解决了
脚本1
void Awake () {
//controladorEstados = new ControladorEstados ();
if (controladorEstados == null) {
controladorEstados = this;
}
}
..//
public static ControladorEstados getInstancia () {
return controladorEstados;
}
在Peter Duniho的响应下,我创建了上面的代码,您可以看到所做的更改,并且我也知道脚本执行顺序的使用要在其中使用顺序。
我不知道这是否是最好的方法,但是它似乎有效,如果有人帮助解决类似问题,我会发布它。
最佳答案
没有a good, Minimal, Complete, and Verifiable code example可以可靠地重现该问题,就无法确定要解决该问题需要确定的内容。
但是,很明显,您正在处理ControladorEstados
的两个不同实例。正在运行的实例(因此Unity3d正在为其调用ControladorEstados.Update()
方法的实例)与controladorEstados
变量在您描述为“脚本2”的任何类中引用的实例都不相同。
在ControladorEstados.getInstancia()
方法中,您不应该创建ControladorEstados
的新实例。相反,您需要做两件事:
ControladorEstados.controladorEstados
类中设置ControladorEstados
,例如在Start()
方法中。 getInstancia()
。 请注意,以上只是解决问题的最起码的步骤。很有可能,有一种更好的方法来查询Unity3d API,以允许“脚本2”检索所需的
ControladorEstados
实例(例如,从场景中返回当前正确的 Controller 实例等)。但是,如果没有更完整的代码示例,就无法确切地说出这种更好的方法是什么样子。