【问题标题】:Coroutine doesn't work in Unity协程在 Unity 中不起作用
【发布时间】:2017-07-05 14:56:42
【问题描述】:

我需要在 Unity 中制作屏幕截图。我用了下一个方法:

public void Capture(){
    StartCoroutine(CaptureScreenshot());
}

private IEnumerator CaptureScreenshot(){
    GameObject canvas = GameObject.Find("Canvas");
    canvas.SetActive(false); // hide all buttons
    yield return new WaitForEndOfFrame();

    string timestamp = DateTime.Now.ToString("dd_MMMM_hh_mm_ss_tt");
    Application.CaptureScreenshot("screenshot" + timestamp + ".png");
    Debug.Log("Screenshot was captured.");
    yield return new WaitForEndOfFrame();

    canvas.SetActive(true); // restore all buttons
    yield return null;
}

当我调用Capture() 时,画布会隐藏,但既不截屏也不记录文本。

这段代码有什么问题?感谢您的回复。

【问题讨论】:

  • 协程是在画布上的游戏对象上运行的吗?
  • @ScottChamberlain 是的
  • 禁用画布会使每个孩子都处于非活动状态......

标签: c# unity3d coroutine


【解决方案1】:

因为当您执行canvas.SetActive(false); 时,您的脚本正在画布中的对象上运行,这也会禁用脚本,从而阻止协程从yield return new WaitForEndOfFrame(); 继续。

将脚本移动到不在画布上的游戏对象,它应该可以解决问题。

【讨论】:

    【解决方案2】:

    你也可以这样做。

    foreach(Transform t in GameObject.Find("Canvas").transform)
    {
     if(transform.gameObject.name != t.gameObject.name)
     t.gameObject.SetActive(false);
    }
    

    请务必使用

    重新启用它们
    foreach(Transform t in GameObject.Find("Canvas").transform)
        {
    
         t.gameObject.SetActive(true);
        }
    

    【讨论】:

    • 您应该解释代码所做的不是禁用画布,而是禁用画布上的所有游戏对象,脚本所在的对象除外。 (注意,如果脚本位于嵌套对象中,这不会解决问题,因为您仍在禁用脚本的父级)
    • Max Play 在 cmets 中已经解释过了,话虽如此,如果 OP 不想移动脚本,我提供了一个替代方案。 @ScottChamberlain
    猜你喜欢
    • 1970-01-01
    • 2021-03-07
    • 2020-09-04
    • 2019-12-27
    • 2015-08-06
    • 1970-01-01
    • 2018-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多