回答編集履歴

1

コメントを受けて追記

2016/10/10 09:42

投稿

sakura_hana
sakura_hana

スコア11427

test CHANGED
@@ -19,3 +19,105 @@
19
19
  コルーチンと元記事で紹介されているInvokeも試してみましたが、0.04秒程のラグが発生しました。
20
20
 
21
21
  そもそも[float自体にも誤差](https://blogs.msdn.microsoft.com/jpvsblog/2014/10/28/93/)がありますし、0.01秒以下の単位での時間合わせは難しいものと思います。
22
+
23
+
24
+
25
+ ---
26
+
27
+
28
+
29
+ コルーチン・Invokeを使用する場合、「コルーチンかInvokeで開始・終了フラグを管理する」「Updateで時間表示機能を作る(開始・終了フラグを監視する。終了時は端数になるので無理矢理きっちりした数字にしてしまう)」の2つを組み合わせれば出来るかと思います。
30
+
31
+
32
+
33
+ ただ、改めて考えると描画はフレームレートのタイミングでしか更新されないので、全てUpdateで行っても時間の精度で言えば大した違いは出ないように思います。
34
+
35
+ (例えば5秒後きっちりにコルーチンを止めたとしても、画面上にそれが表示されるのは「次のフレーム」なので、そこでも微細な誤差が出ます)
36
+
37
+ 一応全てUpdateで処理したバージョンのスクリプトを置いておきます。
38
+
39
+ ```C#
40
+
41
+ bool timerflag = false;
42
+
43
+ float timercount = 0.0f;
44
+
45
+ float totalTimerCount = 0.0f;
46
+
47
+
48
+
49
+
50
+
51
+ void Update()
52
+
53
+ {
54
+
55
+ if (Input.GetKey(KeyCode.T) & !(timerflag)) {
56
+
57
+ timercount = 0.0f;
58
+
59
+ totalTimerCount = 0.0f;
60
+
61
+ timerflag = true;
62
+
63
+ }
64
+
65
+ if (timerflag) {
66
+
67
+ timerMethod (5.0f, 10.0f);
68
+
69
+ }
70
+
71
+ }
72
+
73
+
74
+
75
+ void timerMethod(float limit, float totalLimit){
76
+
77
+ timercount += Time.deltaTime;
78
+
79
+ totalTimerCount += Time.deltaTime;
80
+
81
+
82
+
83
+ //毎回時間を表示する。少なくとも小数第2位までは表示する。
84
+
85
+ Debug.Log (timercount);
86
+
87
+ Debug.Log (totalTimerCount);
88
+
89
+
90
+
91
+ if (timercount >= limit) {
92
+
93
+ //定期実行処理。
94
+
95
+ Debug.Log ("定期実行処理" + timercount);
96
+
97
+ timercount = 0.0f;
98
+
99
+ }
100
+
101
+
102
+
103
+ if (totalTimerCount >= totalLimit) {
104
+
105
+ Debug.Log ("タイマー終了"+ totalTimerCount);
106
+
107
+ //終了時のtotalTimerCountはきっちりした値ではないので、
108
+
109
+ //表示する際はきっちりした値(totalLimit)を表示して、
110
+
111
+ //さもきっちり終わったかのように見せかけるとよい
112
+
113
+ timerflag = false;
114
+
115
+ }
116
+
117
+
118
+
119
+ //誤差は60fpsなら0.01666…秒、30fpsなら0.333…秒(実機動作時の現在のfpsの影響を受けます)
120
+
121
+ }
122
+
123
+ ```