我正在使用以下类似工具对使用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()方法中。
  • 确保您描述为“脚本2”的类在发生步骤#1之后才调用getInstancia()

  • 请注意,以上只是解决问题的最起码的步骤。很有可能,有一种更好的方法来查询Unity3d API,以允许“脚本2”检索所需的ControladorEstados实例(例如,从场景中返回当前正确的 Controller 实例等)。但是,如果没有更完整的代码示例,就无法确切地说出这种更好的方法是什么样子。

    10-05 20:09