我正在对使用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 中确实如此,但在脚本1 中它是错误的。请告诉我一些关于我做错事的想法。
我解决了
脚本1
void Awake () {
//controladorEstados = new ControladorEstados ();
if (controladorEstados == null) {
controladorEstados = this;
}
}
..//
public static ControladorEstados getInstancia () {
return controladorEstados;
}
在Peter Duniho的回应中,我创建了上面的代码,您可以看到更改,我也知道使用脚本执行顺序在其中使用订单。
我不知道它是否是最好的方式,但它似乎有效,我发布它以防有人帮助类似的东西。
答案 0 :(得分:2)
如果没有a good, Minimal, Complete, and Verifiable code example可靠地重现问题,就无法确定您需要更改什么来解决问题。
但是,很清楚你正在处理ControladorEstados
的两个不同实例。正在运行的实例(以及Unity3d调用ControladorEstados.Update()
方法的实例)不在任何类中由controladorEstados
变量引用的同一实例你描述为&#34;脚本2&#34; 。
在ControladorEstados.getInstancia()
方法中,您不应该创建ControladorEstados
的新实例。相反,你需要做两件事:
ControladorEstados.controladorEstados
课程中设置ControladorEstados
,例如Start()
在getInstancia()
方法中。ControladorEstados
。请注意,上述内容只是解决问题所能采取的最小步骤。很有可能,有一种更好的方法来查询Unity3d API,以允许&#34;脚本2&#34; 检索 for row in soup('table', {'class': 'stat-table'})[0].tbody('tr'):
IndexError: list index out of range
的实例你想要的(例如从场景返回当前的,正确的控制器实例,或类似的东西)。但是,如果没有更完整的代码示例,那么就不可能确切地说出更好的方法是什么样的。
答案 1 :(得分:0)
你的方法并不完全是Unity方式。你基本上是将单身人士与MonoBehaviour混合在一起。
请记住Unity是由组件驱动的。如果您想要一个扩展MonoBehaviour的对象的单个实例,只需创建一个始终在场景中的对象(如GameManager)并向其添加ControladorEstados
。
然后,您可以从脚本中引用它,您需要使用它而不是使用单例。