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

时间:2017-01-11 23:46:34

标签: c# linux unity3d unity5

我正在对使用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的回应中,我创建了上面的代码,您可以看到更改,我也知道使用脚本执行顺序在其中使用订单。

我不知道它是否是最好的方式,但它似乎有效,我发布它以防有人帮助类似的东西。

2 个答案:

答案 0 :(得分:2)

如果没有a good, Minimal, Complete, and Verifiable code example可靠地重现问题,就无法确定您需要更改什么来解决问题。

但是,很清楚你正在处理ControladorEstados的两个不同实例。正在运行的实例(以及Unity3d调用ControladorEstados.Update()方法的实例)在任何类中由controladorEstados变量引用的同一实例你描述为&#34;脚本2&#34;

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

  1. ControladorEstados.controladorEstados课程中设置ControladorEstados,例如Start()getInstancia()方法中。
  2. 确保您描述为&#34;脚本2&#34; 的课程在步骤#1发生之前不会致电ControladorEstados
  3. 请注意,上述内容只是解决问题所能采取的最小步骤。很有可能,有一种更好的方法来查询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

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