###前提・実現したいこと
タイマーでコルーチンを使ってはいけないのでしょうか?
この記事の、「1. 簡単なタイマー機能にyieldやcoroutineを使用しないこと」では、
タイマーにコルーチンを使ってはいけないと書かれているようですが、その理由が書かれていない為、
使ってはいけない理由がわかりません。コルーチンを使うと何か不具合が生じるのでしょうか?
この記事の末尾の『「何秒後にこういうことをしたい」といったように、
1フレームを超えた処理でコルーチンを使用しないといけないところで自分の理解が止まっていて...』の、
「1フレームを超えた処理でコルーチンを使用しないといけないところ」の文章が理解できません。
単純に、「フレームをまたぐ処理はコルーチンを使用しないといけない」と言っているのでしょうか?
本題ですが、下記のような仕様のタイマーを作りたいと思っています。
①指定キーを押したタイミングでタイマーがスタート。 ②毎回、時間を表示する。整数でなく、少なくとも小数第2位までは表示する(今回はDebug.Logを出力)。 ③指定時間間隔ごとに定期処理が実行される(今回はDebug.Logを出力)。 ④指定した時間経過後、タイマーを終了として、終了処理を行う(今回はDebug.Logを出力)。 ⑤上記の処理をなるべく、メソッド化。指定時間間隔と終了時間を引数で渡す。
冒頭のコルーチンを使ってはいけないらしい情報があった為、
上記仕様のタイマーをUpdate()で作ってみました。
しかし、③、④の処理が、時間ピッタリに行うことができません(詳細は試したことのコードのコメント)。
上記仕様のタイマーの作り方のご教授をお願いいたします。
また、コルーチンを使って作る場合、冒頭の件に関しても教えていただきたいです。
###試したこと
C#
1bool timerflag = false; 2float timercount = 0; 3 4 5 void Update() 6 { 7 if (Input.GetKey(KeyCode.T) & !(timerflag)) { 8 timercount = 0; 9 timerflag = true; 10 } 11 if (timerflag) { 12 timerMethod (0.5f, 10); 13 } 14 } 15 16 void timerMethod(float interval, int limit){ 17 timercount += Time.deltaTime; 18 //毎回時間を表示する。少なくとも小数第2位までは表示する。 19 Debug.Log (timercount); 20 21 //この条件では、引っ掛からない可能性が高い。 22 //また、if文内をMathf.Floorを使って、timercountを0.5xxx...から0.5に書き換えても、 23 //複数回引っかかる可能性がある。例:0.5123のとき、0.5とみなされ引っかかり、 24 //0.52431でも0.5とみなされ引っかかる。 25 //そもそも、0.5123のとき、0.5とみなすのではなく、 26 //0.5000...0という時間ピッタリのときに引っ掛けたい。 27 if (timercount % interval == 0) { 28 //定期実行処理。 29 Debug.Log ("定期実行処理" + timercount); 30 } 31 32 //この条件では、指定時間ピッタリに終了させることはできない可能性が高い。 33 //10.000...0で引っかからない。 34 //Mathf.Floorを使えば、10になるが、そもそもそれでは本当の10.000...0の時間に 35 //引っ掛かるわけではない。 36 if (timercount == limit) { 37 Debug.Log ("タイマー終了"); 38 timerflag = false; 39 } 40 }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2016/10/10 08:56
退会済みユーザー
2016/10/10 13:25