2017-10-12 4 views
0

UnityでWebGLゲームを作った。いくつかの計算はすべてのフレームで必要なわけではないので、私はそれらをコルーチンに入れます。しかし、ゲームがバックグラウンドにあるとき、コルーチンは通常よりも遅く動作し、さらに5〜10秒待つ。アプリケーションにフォーカスがないとき、または別のタブにあるときにWaitForSecondsが機能しなくなる

たとえば、兵士が私に向かって走り、私は彼らを殺して弾丸を発射します。彼らが範囲内に入ると、彼らもまた発砲し始める。私は敵がコルーチンの範囲内にいるかどうかを調べた。私がブラウザ上で他のタブを表示すると、いくつかの敵が通常以上に近づき、いくつかの敵はゲーム画面を通過します。これは、ゲームをunplayableにします。

コルーチンが正しく機能するようにする方法はありますか、すべての計算方法を更新する必要がありますか?

例のコードは次のとおりです。

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

私のアドバイス:これにコルーチンを使用しないでください。 – Draco18s

+0

コルーチンの敵の範囲をどのようにチェックしますか?それを示すコードをいくつか教えていただけますか? 'update()'関数はコルーチンが 'Update()'に変わってしまうのと同じことは全く同じではありません – armnotstrong

+0

プレーヤーの設定で "run in background"をチェックしましたか? – Cenkisabi

答えて

1

コルーチンは "奇妙な" 演技されていません。 WaitForSecondsの使用は私がこの質問のタイトルを変更した理由です。 WaitForSeconds yield命令は、待ち時間またはタイマーをに設定する場合に使用します。Unityにフォーカスがない場合や別のタブにある場合は、がカウントされます。フォーカスがあるとき、またはWebGLを使用しているときにタブに戻るときに再開します。

逆の場合は、待機時間またはタイマーをに続行する場合に使用します。には、アプリケーションにフォーカスがない場合でも、別のタブであっても正常に続行されます。それはスケーリングされていない関数を使用して機能します。あなたの場合、WaitForSecondsRealtimeイールド命令を使用する必要があります。

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

残念ながら、これも私の問題を解決しません。私はそれがtimescaleが1とは異なるときに特定の時間を待つために使用されると思います。 –

+0

あなたはおそらく別のことをしているでしょう。 [This](https://pastebin.com/ei9G1UkW)は私のテストコードです。それを試してみてください。別のタブに移動して戻ると、タイマーがカウントされます。今度は、WaitForSecondsに置き換えてください。別のタブに移動して戻ると、カウントが停止するはずです。 – Programmer

+0

私はあなたのコードをmozilla Firefoxブラウザでテストしました。結果は同じです。数秒後には、速度が低下するか完全に停止します。私は10〜20秒間何度も待っていたが、約1〜2秒しか過ぎなかったので。 –

関連する問題