如何等待协程结束再执行主线程

WT2049 2020-10-11 09:47:56


我希望红框的协程执行完毕后再执行下面的
Debug.Log("done2");
...全文
27364 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
WT2049 2020-10-28
  • 打赏
  • 举报
回复
引用 5 楼 Tony_Bean 的回复:
还是不太清楚你的需求。 假如你是需要执行协程时“暂停”主线程,那可以明确的告诉你不可能,因为协程是依赖主线程的每一帧执行的,本质上来说仍然是主线程的一部分。 假如是用线程的方式做到阻塞主线程,那么协程里yield return 里的内容就不能使用,因为主线程卡死了其他东西都不会执行,这个是unity里开发麻烦的地方。 另外我认为异步执行使用回调是一种挺好用的手法,至少我想不出更加简洁且简单的手法了,不太理解你为什么会认为这是把代码写进去了。
只能认为无解。后面再用协程技术不是我想要的,这个技术本身我也会用,我是寻求这套技术之外的解决方法
WT2049 2020-10-22
  • 打赏
  • 举报
回复
引用 2 楼 Tony_Bean 的回复:
想在协程结束之后执行的话最简单的就是放到协程里去,假如考虑到复用性(调用统一协程但是不同地方想要不同的结束后执行内容),可以协程传一个action参,结束的时候Invoke一下。

public void DoSomething1()
{
    StartCoroutine(NewCoroutine(()=>{Debug.Log("Done2");}));
}

public void DoSomething2()
{
    StartCoroutine(NewCoroutine(()=>{Debug.Log("Done3");}));
}

IEnumerator NewCoroutine(Action onComplete)
{
    yield return null;
    Debug.Log("Done1");
    onComplete?.Invoke();
}
就像这样.
这个相当于把主线程代码写进协程里面,不是我想要的
Tony_Bean 2020-10-22
  • 打赏
  • 举报
回复
刚才又检查了一下言论,发现你可能是想要1L说的那种方式执行

 private void Start()
    {
        StartCoroutine(DoSomething1());
    }

    private IEnumerator DoSomething1()
    {
        Debug.Log("Do Something1");

        yield return  DoSomething2();

        Debug.Log("Done 2");
    }

    private IEnumerator DoSomething2()
    {
        Debug.Log("Do Something2");

        yield return new WaitForSeconds(1);

        Debug.Log("Done 1");
    }
debug顺序是:Do Something1,Do Something2,Done 1,Done 2 这样做的前提是你正常执行的代码也要放到协程里去,但是由于第一个yield return之前的代码会直接顺序执行,所以可以将第一个yield return之前的代码当做主线程代码用。
Tony_Bean 2020-10-22
  • 打赏
  • 举报
回复
还是不太清楚你的需求。 假如你是需要执行协程时“暂停”主线程,那可以明确的告诉你不可能,因为协程是依赖主线程的每一帧执行的,本质上来说仍然是主线程的一部分。 假如是用线程的方式做到阻塞主线程,那么协程里yield return 里的内容就不能使用,因为主线程卡死了其他东西都不会执行,这个是unity里开发麻烦的地方。 另外我认为异步执行使用回调是一种挺好用的手法,至少我想不出更加简洁且简单的手法了,不太理解你为什么会认为这是把代码写进去了。
hirocon 2020-10-21
  • 打赏
  • 举报
回复
太强了!!!!!
Tony_Bean 2020-10-20
  • 打赏
  • 举报
回复
想在协程结束之后执行的话最简单的就是放到协程里去,假如考虑到复用性(调用统一协程但是不同地方想要不同的结束后执行内容),可以协程传一个action参,结束的时候Invoke一下。

public void DoSomething1()
{
    StartCoroutine(NewCoroutine(()=>{Debug.Log("Done2");}));
}

public void DoSomething2()
{
    StartCoroutine(NewCoroutine(()=>{Debug.Log("Done3");}));
}

IEnumerator NewCoroutine(Action onComplete)
{
    yield return null;
    Debug.Log("Done1");
    onComplete?.Invoke();
}
就像这样.
hirocon 2020-10-20
  • 打赏
  • 举报
回复
最简单的办法是把Debug.Log("done2")写到协程里去。要不然就得给你要执行的方法前加yield return,但后者必须这个方法是一个协程方法才行。

2,584

社区成员

发帖
与我相关
我的任务
社区描述
Unity3D相关内容讨论专区
游戏unity 技术论坛(原bbs)
社区管理员
  • Unity3D
  • 芝麻粒儿
  • 「已注销」
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

Unity3D社区公告:

  1. 社区致力于解决各种Unity3D相关的“疑难杂症”。
  2. 社区不允许发布与Unity3D或相关技术无关内容。
  3. 社区版主邀请各位一道为打造优秀社区不懈努力。

试试用AI创作助手写篇文章吧