【问题标题】:Loading Grid using coroutines - wait until finish,使用协程加载 Grid - 等到完成,
【发布时间】:2015-08-11 13:21:07
【问题描述】:

我场景中的一个脚本涉及创建一个立方体网格。这个过程确实需要相当长的时间,我一直在尝试实现它,而不会导致 Unity 变得无响应。

目前的代码 - 有效 - 您可以在生成网格时进行观察。但是,场景中的其他脚本同时执行它们的任务并导致异常(它们正在访问网格上尚未创建的图块)。

下面的脚本是唯一具有“唤醒”功能的脚本 - 在第一个脚本完成唤醒之前,其他脚本正在执行“更新”和“OnGUI”。

 GridGenerator.cs

public GameObject[,] tiles = new GameObject[Constants.BOARD_WIDTH, Constants.BOARD_HEIGHT]; 
   // Run a double loop to create each tile.
    void Awake () 
    {
        StartCoroutine(doSetup());
    }

    IEnumerator doSetup()
    {
        yield return StartCoroutine (loadLevel());
        DoOtherStuff();
    }

    IEnumerator loadLevel()
    {   
        for (int i = 0; i < Constants.BOARD_WIDTH; i++)             
        {
            for (int j = 0; j < Constants.BOARD_HEIGHT; j++) 
            {
                tiles[i,j] = newTile();
                yield return(0);
            }
        }
    }

如何让 doOtherStuff() 方法等到协程完成?

我尝试了一个布尔切换(冻结统一) 我试过使用锁(没用)

或者有更有效的方法吗?

编辑:生成网格后,代码成功完成 OtherStuff()。 doOtherStuff() 的一部分是将网格的引用传递给单独的类。 尝试在 Update 方法中访问网格时,单独的类会引发异常。这表明,在 GridGenerator.cs 中的 Awake 完成之前调用了 update 方法。

【问题讨论】:

  • 所以其他东西正在寻找瓷砖,有没有一种方法可以让他们在寻找瓷砖时知道它们是否已经生成并且是否可用?可能需要提供更多代码来显示其他例程如何存储/访问图块
  • 是的,这是一个解决方案 - 检查以确保首先生成图块。但是将涉及向所有需要瓷砖的地方添加额外的条件......啊,瓷砖存储在游戏对象的多维数组中。更新了主帖 - 谢谢。

标签: c# unity3d coroutine


【解决方案1】:

最简单的方法是在另一个协程中启动你的协程,这样你就可以屈服于它:

void Awake () 
{
    StartCoroutine(doSetup());
}

IEnumerator doSetup ()
{
    yield return StartCoroutine(createGrid()); // will yield until createGrid is finished
    doOtherStuff();   
}

IEnumerator createGrid()
{   
        for (int i = 0; i < Constants.BOARD_WIDTH; i++)             
        {
            for (int j = 0; j < Constants.BOARD_HEIGHT; j++) 
            {
                // Instantiate a new tile 
                yield return(0);
            }
        }
    }
}

【讨论】:

  • 您好,感谢您的回复,这在某种程度上有效 忽略日志,它工作正常并生成网格。但是,它仍然在生成网格之前退出 Awake 功能,因此其他一些脚本正在记录异常。它比以前的情况要好得多(就像在生成网格中途崩溃之前一样)。关于如何阻止它退出唤醒方法直到网格完成的任何想法?
  • Awake 方法不能是协程,因此不能让步给另一个协程。您要么必须重构以处理异步网格创建,要么只是同步进行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
相关资源
最近更新 更多