質問: false; } } ```
回答: ■何故コルーチンを使ってはいけないか 元記事の方にもありますが、 > > 正しく記載することを忘れてしまうことで大混乱に陥ったり、そもそも何の目的で使うか見えなくなりがち > > > これが理由です。 よく理解しないまま使うとコルーチンが無限増殖したり、永遠に回り続けることで負荷を上昇させます。それを防ぐ為、簡単な処理はUpdateで済ませましょう、或いは別の処理を使いましょうということです。 ■時間ぴったりに何かを実行させる 厳密には不可能です。 コルーチンと元記事で紹介されているInvokeも試してみましたが、0.04秒程のラグが発生しました。 そもそもfloat自体にも誤差がありますし、0.01秒以下の単位での時間合わせは難しいものと思います。 コルーチン・Invokeを使用する場合、「コルーチンかInvokeで開始・終了フラグを管理する」「Updateで時間表示機能を作る(開始・終了フラグを監視する。終了時は端数になるので無理矢理きっちりした数字にしてしまう)」の2つを組み合わせれば出来るかと思います。 ただ、改めて考えると描画はフレームレートのタイミングでしか更新されないので、全てUpdateで行っても時間の精度で言えば大した違いは出ないように思います。 (例えば5秒後きっちりにコルーチンを止めたとしても、画面上にそれが表示されるのは「次のフレーム」なので、そこでも微細な誤差が出ます) 一応全てUpdateで処理したバージョンのスクリプトを置いておきます。 ``` bool timerflag = false; float timercount = 0.0f; float totalTimerCount = 0.0f; void Update() { if (Input.GetKey(KeyCode.T) & !(timerflag)) { timercount = 0.0f; totalTimerCount = 0.0f; timerflag = true; } if (timerflag) { timerMethod (5.0f, 10.0f); } } void timerMethod(float limit, float totalLimit){ timercount += Time.deltaTime; totalTimerCount += Time.deltaTime; //毎回時間を表示する。少なくとも小数第2位までは表示する。 Debug.Log (timercount); Debug.Log (totalTimerCount); if (timercount >= limit) { //定期実行処理。 Debug.Log ("定期実行処理" + timercount); timercount = 0.0f; } if (totalTimerCount >= totalLimit) { Debug.Log ("タイマー終了"+ totalTimerCount); //終了時のtotalTimerCountはきっちりした値ではないので、 //表示する際はきっちりした値(totalLimit)を表示して、 //さもきっちり終わったかのように見せかけるとよい timerflag = false; } //誤差は60fpsなら0.01666...秒、30fpsなら0.333...秒(実機動作時の現在のfpsの影響を受けます) } ```