【问题标题】:Debug Log messages not appearing before execution of big chunk of code, only after this is finished, using Update()调试日志消息在执行大块代码之前不出现,仅在完成后使用 Update()
【发布时间】:2016-09-27 20:16:25
【问题描述】:

每当使用Update()方法时如下:

void Update() {
    if (Input.GetMouseButtonDown(0) && useRandomSeed) {
        Debug.Log("Generating New Map...");
        GenerateMap();
        Debug.Log("New Map Generated!");
    }
}

控制台的输出将同时(视觉上)推出第一条消息和第二条消息。而GenerateMap() 首先执行。 GenerateMap() 是一个需要一段时间才能返回的方法。

预期结果:

  • 打印第一条调试消息。
  • 代码已执行。
  • 打印第二条调试消息。

发生了什么:

  • 代码已执行。
  • (按顺序)打印第一条和第二条调试消息。

我试过这样做:

void Update() {
    if (Input.GetMouseButtonDown(0) && useRandomSeed && !mapGenPending) {
        Debug.Log("Generating New Map...");
        mapGenPending = true;
    } else if (mapGenPending) {
        GenerateMap();
        Debug.Log("New Map Generated!");
        mapGenPending = false;
    }
}

但这仍然导致了第二种情况。我认为 Unity 可能不关心每个周期 Update() 中某些代码的顺序,但即使是 2 个周期也不足以让消息按顺序在控制台中打印。

最终,如何防止这种情况发生,以按预期获得订单?

【问题讨论】:

  • 这看起来很奇怪。我从来没有遇到过这种情况。您能否也添加您在问题中得到的输出?

标签: c# debugging unity3d


【解决方案1】:

尝试使用协程进行程序,例如:

public IEnumerator LoadMap(){
        Debug.Log("Generating New Map...");
        GenerateMap();            
        while(generated==false){
             yield return new WaitForSeconds(0.1f);
        }
        Debug.Log("New Map Generated!");
}

更新时:

void Update(){
       if (Input.GetMouseButtonDown(0)){
              StartCoroutine(LoadMap());
       }
} 

在你的课堂上:

private bool generated = false;

在您的 GenerateMap 方法上:

public void GenerateMap(){
//
//
//
//
     generated=true;
}

这样,New Map Generated! 消息将在生成的从 false 变为 true 时出现。

【讨论】:

  • 这不起作用,由于某种原因,只有在地图生成完成时才会出现第一条调试消息。因此,协程内外发生的任何调试日志消息都将(大致)同时输出,而不是在进程之前一个,进程之后一个。
  • 你能用其中的协程更新代码吗?我认为你误解了一些东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
相关资源
最近更新 更多