0
votes

Coroutin attend la méthode avant de partir

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();
}


2 commentaires

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 à partir d'une coroutine. Vous pouvez simplement RENDU RENDUVIDEO (...)


4 Réponses :


0
votes

Vous pouvez regarder à l'aide d'utiliser fichier.wriretelbytesasync (documentation ICI ).

alors vous pouvez appeler attendre fichier.writeteLlbytesasync (chemin, résultat) . Vous devrez également faire votre downloadvideo fonction asynchrone. Essentiellement le attendre dit, attendez que cet appel soit terminé jusqu'à ce que je passe dans cette fonction.

Plus de détails sur la programmation asynchrone dans C # peut être trouvé Ici .


1 commentaires

J'ai peur que l'unité n'inclut pas la méthode WriteAllbytesAsasync .



0
votes

Je pense que le problème est que vous ne fermez pas le fichier.

FILE.WRITREALELBYtes (chemin, résultat); n'est pas un appel ASYNC, il devrait donc terminer son travail avant d'aller à la ligne suivante qui commence playvideo COROUTINE. < / p>

Je vous recommanderais d'utiliser Filtream et assurez-vous de disposer du flux avant d'appeler le playvideo coroutine.

J'espère que ça vous aide.


0 commentaires

0
votes

Cette approche semble fonctionner: xxx

apparemment fichier.exists (chemin) ne reviendra que true lorsque WriteAllbytes (chemin, résultat) < / code> est terminé.


0 commentaires

0
votes

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.


1 commentaires

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.