Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 协同路由在继续之前等待方法_C#_Unity3d_Coroutine - Fatal编程技术网

C# 协同路由在继续之前等待方法

C# 协同路由在继续之前等待方法,c#,unity3d,coroutine,C#,Unity3d,Coroutine,我有一个协同程序,可以下载视频,将其写入内存,然后播放 IEnumerator DownloadVideo(string url) { UnityWebRequest www = UnityWebRequest.Get(url); yield return www.SendWebRequest(); byte[] result = www.downloadHandler.data; File.WriteAllBytes(path, result); Sta

我有一个协同程序,可以下载视频,将其写入内存,然后播放

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
corroutine中设置此参数
delayTime
,因为
File.writealBytes(path,result)
需要一段时间才能完成,如果我立即开始播放视频,它将无法正确播放


问题很简单:在协同程序
下载视频中
,如何等到
文件.writealBytes(路径,结果)
完成调用
开始例程(播放视频(路径))

您可以研究使用
文件.writealBytes同步
(文档)

然后可以调用
wait File.writealByteAsSync(路径、结果)
。您还需要使
下载视频
功能异步。本质上,
await
表示,等待直到调用完成,直到我在此函数中向前移动


有关C#异步编程的更多详细信息,请参见。

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

File.writealBytes(路径、结果)
不是异步调用,因此它应该在转到下一行开始
PlayVideo
coroutine之前完成其工作

我建议您在调用
PlayVideo
coroutine之前使用并确保处理流


我希望它能有所帮助。

这种方法似乎很有效:

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)
只有在
writealBytes(path,result)
结束时才会返回true。

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

恐怕Unity不包括方法
WriteAllByteAsync
。请先等待视频下载。当视频id完成下载,然后启用播放视频BTW时,就没有理由从协同程序中调用
startcroutine
。您只需
返回PlayVideo(…)
我也这么认为,但我最初找到的解决方案是延迟视频播放器的执行,但通过我提到的解决方法,它似乎可以正常工作。