2017-10-12 29 views
0

J'ai créé un jeu WebGL avec Unity. Certains calculs ne sont pas nécessaires pour chaque image, je les ai donc mis dans une coroutine. Mais quand le jeu est en arrière-plan, les coroutines fonctionnent plus lentement que la normale et attendent 5 à 10 secondes de plus. Par exemple, les soldats accourent vers moi et je leur tire des balles pour les tuer. Quand ils arrivent à portée, ils commencent à tirer aussi. J'ai vérifié si l'ennemi est à portée de coroutine. Quand je vais d'autres onglets sur le navigateur, certains ennemis se rapproche de la normale et certains viennent et passe l'écran de jeu. Cela rend le jeu injouable.WaitForSeconds cesse de fonctionner lorsque l'application n'est pas active ou dans un autre onglet

Existe-t-il un moyen de faire fonctionner correctement les coroutines ou dois-je mettre chaque calcul à jour pour la mettre à jour?

Exemple de code est:

private IEnumerator ActionDeciderCoroutine() 
{ 
    while (true) 
    { 
     DoAction(); 
     yield return new WaitForSeconds(Constants.ENEMY_THINKING_TIME); 
    } 
} 
+0

Mon conseil: n'utilisez pas de coroutines pour cela. – Draco18s

+0

comment vérifiez-vous la portée de l'ennemi en coroutine? pourriez-vous nous donner un code pour le montrer? La fonction 'Update()' fait à peu près la même chose que la coroutine change en 'Update()' ne devrait pas être différente – armnotstrong

+0

Avez-vous coché "exécuter en arrière-plan" sur les paramètres du lecteur? – Cenkisabi

Répondre

1

Coroutine ne pas agir "étrangement". L'utilisation de WaitForSeconds est le problème, c'est pourquoi j'ai changé le titre de cette question. L'instruction WaitForSeconds yield est utilisée lorsque vous voulez que l'attente ou le temporisateur s'arrête en comptant lorsque Unity n'a pas de focus ou dans un autre onglet. Il reprendra lorsqu'il y a un focus ou lorsque vous revenez à l'onglet si vous utilisez WebGL.

Le contraire est WaitForSecondsRealtime qui est utilisé lorsque vous voulez que l'attente ou d'une minuterie pour continuer normalement, même si l'application n'a pas le focus ou même quand dans un autre onglet. Il utilise non mis à l'échelle pour fonctionner. Dans votre cas, vous devez utiliser l'instruction de rendement WaitForSecondsRealtime.

private IEnumerator ActionDeciderCoroutine() 
{ 
    while (true) 
    { 
     DoAction(); 
     yield return new WaitForSecondsRealtime(Constants.ENEMY_THINKING_TIME); 
    } 
} 
+0

Malheureusement, cela ne résout pas mon problème. Je suppose qu'il est utilisé pour attendre un certain temps lorsque l'échelle de temps est différente d'un. –

+0

Vous faites probablement autre chose. [This] (https://pastebin.com/ei9G1UkW) est mon code de test. Essayez-le. Vous verrez le compte à rebours lorsque vous allez dans un autre onglet et revenez. Maintenant, remplacez-le par 'WaitForSeconds'. Il devrait cesser de compter quand vous allez dans un autre onglet et revenez. – Programmer

+0

J'ai testé votre code sur le navigateur mozilla firefox. Et le résultat est le même. Soit il ralentit ou s'arrête complètement après quelques secondes. Parce que j'ai attendu 10-20 secondes plusieurs fois mais seulement environ 1-2 secondes passées. –