憑りつかれる
帰宅したらゲーム制作しようブログのネタを考えよう、と心に誓うのに、帰宅後は何故かPSのコントローラーを握り、狭間の地を彷徨っている皆さんこんにちは。前作のダークソウルではゲーム内で「ソウルに憑りつかれる」というセリフがよく使われていましたが、まさにエルデンリグに憑りつかれている状態なのかもしれない。
DOCounter
DOTweenのPro版(有料版)には無料版には無い便利な機能が幾つかあり、その中の一つにDOCounterというAPIがあります。
これはTextMeshProでint型によるカウンターが実装できるAPIで、例えばSTGのスコアや、RPGの経験値等の値が変わる際のアニメーションを作るときに有用なAPIです。
現在の値=10000から新しい値=30000に変わるアニメーション
上のソースコードで分かるように任意の時間で値を変化させられるので、変更したい値=変更する時間とすればカウントアップ(ダウン)タイマーとしても使えるかと思ったのですが、そのような使い方をしたい場合はちょっとだけ注意が必要なようです。
カウントアップ(ダウン)タイマー
経過時間や制限時間を表示させるタイマーを作る場合、1秒間で数字が1加算(減算)されれば良いので、0→60に変化させたい場合は動作時間に60.0fを指定すれば良い(EasingはLiner)という事になります。
では、実際にどうなるか見てみましょう。比較としてFixedUpdateでTime.deltatimeから計算した経過時間を上に表示します。
う~ん、明らかにカウントが早いです。実際の時間より0.5秒ぐらい早いタイミングでカウントがアップされています。
恐らくDOCounter内では時間の経過をFloat型で計算しつつ、TextMeshProにInt型で引き渡す際に四捨五入して引き渡しているのでしょう。
試しにDOVirtualを使ってInt型の数字を同じようにカウントアップさせて比較しましたが結果はどちらも同じタイミングでカウントアップされます。
どちらも0.5秒ぐらい早い
まぁ、DOVirtualはFloat型でも数字を変更できるのでFloat型でカウントアップさせてInt型にキャストすれば正確にカウントアップタイマーとして動作します。
こうすれば・・
DOVirtualを使ったほうは正しくカウントアップされます。ではDoCounterではどうするか・・・
対処法はなし
元も子もない結論ですが、、DOCounterは残念ながら指定できる数字はInt型固定なのでDOViratualのような対処はできません。
暫定的にSetDelayで0.5秒開始を遅延させる対処を取れば表示の問題は解決します。
が、OnCompleteのコールバックでタイマーの終了を検知して処理をしたい場合はDelayを設定した分、完了タイミングがずれてしまうので根本的な解決法にはなりません。
DOCounterはタイマーとして使用するのでなく、時間経過とは関係のない値の表示に使用した方が良いと思います。