【问题标题】:Coroutine wait for method before going on协程在继续之前等待方法
【发布时间】:2020-02-01 01:18:29
【问题描述】:

我有一个协程,它下载视频,将其写入内存,然后播放。

IEnumerator DownloadVideo(string url) {
    UnityWebRequest www = UnityWebRequest.Get(url);
    yield return www.SendWebRequest();
    byte[] result = www.downloadHandler.data;
    File.WriteAllBytes(path, result);
    StartCoroutine(PlayVideo(path, 3));
}

IEnumerator PlayVideo(string url, float delayTime = 0) {
    yield return new WaitForSeconds(delayTime);
    player.url = url;        
    player.Prepare();        
    while (!player.isPrepared) yield return null;
    player.Play();
}

问题是我必须在PlayVideo协程中设置这个参数delayTime,因为File.WriteAllBytes(path, result)需要一段时间才能完成,如果我立即开始播放视频,它将无法正确播放。

问题很简单:在协程DownloadVideo中,如何才能等到File.WriteAllBytes(path, result)完成调用StartCoroutine(PlayVideo(path))

【问题讨论】:

  • 先等视频下载完毕。视频 id 下载完成后,启用播放视频
  • 顺便说一句,没有理由在协程中调用StartCoroutine。你可以yield return PlayVideo(...)

标签: c# unity3d coroutine


【解决方案1】:

您可以查看使用File.WriteAllBytesAsync(文档here)。

然后您可以拨打await File.WriteAllBytesAsync(path, result)。您还需要使您的 DownloadVideo 函数异步。基本上await 说,等到这个调用完成,直到我继续这个函数。

更多关于 C# 异步编程的细节可以在here找到。

【讨论】:

  • 恐怕Unity不包含WriteAllBytesAsync这个方法。
【解决方案2】:

我认为问题在于您没有关闭文件。

File.WriteAllBytes(path, result); 不是异步调用,因此它应该在转到下一行开始之前完成其工作,即开始 PlayVideo 协程。

我建议您使用 FileStream 并确保在调用 PlayVideo 协程之前处理流。

希望对你有帮助。

【讨论】:

    【解决方案3】:

    这种方法似乎奏效了:

    IEnumerator DownloadVideo(string url) {
        UnityWebRequest www = UnityWebRequest.Get(url);
        yield return www.SendWebRequest();
        byte[] result = www.downloadHandler.data;
        File.WriteAllBytes(path, result);
        yield return new WaitUntil(() => File.Exists(path));
        StartCoroutine(PlayVideo(path));
    }
    

    显然File.Exists(path) 只会在WriteAllBytes(path, result) 结束时返回true。

    【讨论】:

      【解决方案4】:

      File.WriteAllBytes 是一种同步方法,因此您的代码不存在问题。 File.WriteAllBytes 完成该行代码执行后不会花费额外的时间来完成。您可能有另一个进程锁定了文件,例如防病毒软件或备份软件。

      【讨论】:

      • 我也有同样的想法,但我最初找到的解决方案是延迟 VideoPlayer 的执行,但使用我提到的解决方法,它似乎可以正常工作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多