J'ai une coroutine qui télécharge une vidéo, l'écrit dans la mémoire, puis joue.
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(); }
4 Réponses :
Vous pouvez regarder à l'aide d'utiliser alors vous pouvez appeler Plus de détails sur la programmation asynchrone dans C # peut être trouvé Ici . P> fichier.wriretelbytesasync code> (documentation ICI ). P>
attendre fichier.writeteLlbytesasync (chemin, résultat) code>. Vous devrez également faire votre
downloadvideo code> fonction asynchrone. Essentiellement le
attendre code> dit, attendez que cet appel soit terminé jusqu'à ce que je passe dans cette fonction. P>
J'ai peur que l'unité n'inclut pas la méthode WriteAllbytesAsasync code>.
Je pense que le problème est que vous ne fermez pas le fichier. P>
Je vous recommanderais d'utiliser Filtream et assurez-vous de disposer du flux avant d'appeler le J'espère que ça vous aide. P> FILE.WRITREALELBYtes (chemin, résultat); code> n'est pas un appel ASYNC, il devrait donc terminer son travail avant d'aller à la ligne suivante qui commence
playvideo code> COROUTINE. < / p>
playvideo code> coroutine. P>
Cette approche semble fonctionner: apparemment fichier.exists (chemin) code> ne reviendra que true lorsque
WriteAllbytes (chemin, résultat) < / code> est terminé. p> p>
FILE.WRITREALELBYTES est une méthode synchrone, ce n'est donc pas un problème avec votre code. File.writeAllbytes ne prend pas de temps supplémentaire pour terminer lorsque cette ligne de code est effectuée en cours d'exécution. Il est probable que vous ayez un autre processus de verrouillage du fichier comme un antivirus ou un logiciel de sauvegarde. P>
Je pensais la même chose, mais la solution que j'ai trouvée initialement devait retarder l'exécution de la vidéoLayer, mais avec le contexte que j'ai mentionné, il semble fonctionner correctement.
Attendez simplement que la vidéo soit téléchargée en premier. Lorsque l'ID vidéo téléchargée, activez la vidéo de lecture.
BTW, il n'y a aucune raison d'appeler
startcoroutine code> à partir d'une coroutine. Vous pouvez simplement
RENDU RENDUVIDEO (...) CODE>