Unity用のストップウォッチみたいなものを作ってみた

はいどーもこんばんは、車輪の再発明をしている主夫希望の男です。
本日はUnity用(と言いつつUnityは表示のために使用しているだけですが)のストップウォッチを作ってみたので公開してみたいと思います。

最初に

重要なことなので最初に書いておきますが、ストップウォッチ機能が欲しいだけならSystem.Diagnostics.Stopwatchを使ったほうがいいですw
僕はプログラミングの練習で作ってみただけです。
そのうちSystem.Diagnostics.Stopwatchで上位互換のもの作ってみようかしらん。

また、Android環境ではDateTime.Nowがバグる(.Net4.X系のみ?)ようなので、時刻の取得時はお気をつけください。
具体的にはAndroid環境ではUTC時間になっちゃうんですね。
なのでストップウォッチとしての機能的には問題ないのですが、開始時間を取得するメソッドを実行するとUTC時間が返ってきちゃいます。

とりあえずDL

ごたくはええから見せろや!
という方用にパッケージを用意しています。
https://github.com/Tsumio/tsumio-timer/raw/master/tsumio-timer.unitypackage

GitHubにはコードも全て置いています。
https://github.com/Tsumio/tsumio-timer
Unityのプロジェクトを置くの初なので、「これは公開したらマズイですよ!」みたいなのあったら教えてください。
消しますたぶん。

あ、C#6.0の文法を使っているので、ConfigurationからScripting Runtime Versionは4.6にしといてください。

機能の解説

パッケージをDLしてインポートしてもらってから、Scenesフォルダに入っているシーンを開いてみてください。
ザ・ストップウォッチって感じのシーンが出てくると思います。

「E記録開始」は「指定時間分だけストップウォッチが進んだら、登録しておいたイベントを実行する」という機能です。
この場合は3秒後にログ画面に文字を表示しているだけです。

次にScriptsフォルダを見てください。
TimeManagerとかいうふざけたフォルダ名のフォルダがありますが、これは適当に名前変えてもらったほうがいいかもしれませんw
で、この中にTimeRecorderGo.csがあると思います。
このファイル内でストップウォッチの機能がまとめられています。

1.インスタンスを作成する

ITimeRecorder _recorder = new TimeRecorder();
なお、オーバーロードとして
TimeRecorder(TimeSpan firingTime, Action action)
もあります。
firingTime時間後にactionを実行します。

2.Updateメソッド内でUpdateを呼ぶ

_recorder.Update();

3.呼びたい機能を呼ぶ

・Start→記録開始
・Pause→一時停止
・Resume→一時停止したものを再開
・Destory→記録の破棄で完全に停止

ちなみにですが、TimeRecorder.csファイルがメインのクラスとなります。
中身で何をやっているのか気になる方はこちらをどうぞ。
ただ一時停止の作り方で悩んでコードが結構ゴチャゴチャしています。
一時停止を作るまでは結構お気に入りのコードだったんですけどね……。

ちなみにですが、TimeRecorder.csで使っているクラスは全てUnityの機能に依存していないので、Unity以外でも使えますよ。

終わりに

最初にも書いたとおり、ストップウォッチの機能が欲しいだけならSystem.Diagnostics.Stopwatchを利用するのがよいと思います。
ステートパターンやC#の書き方に慣れるために色々と試しましたよ。
ほなそんな感じでまた。

フォローする