Unity:少し特殊なストップウォッチアプリ制作日記_3:計測ボタンの実装

・今回の課題

 Unityの再生と一時停止で時間を計測して、指定のフレームレートで表示を切り替えるところまで完成した。これをUnityのエディター上のボタンではなく、実際の画面中にボタンを用意してスタート・ストップそしてリセットが出来るようにする。

スクリーンショット 2021-07-25 232508

 画面下に2つのボタンをUIで追加した。右のSTART/STOPのボタンはトグルボタン、左のLAP/RESETボタンは通常のボタンだ。

・実装

 START/STOPボタンは「停止中」と「計測中」の二つの状態を持っていてボタンを押す度に切り替わる。トグルボタンがこの機能にマッチするので選択した。トグルボタンのコンポーネントにボタンのON/OFF状態を表す”isOn”という変数があり、このTrue/Falseを時間を集計しているメインのスクリプトに伝え、計測中の間だけTime.deltaTimeを加算するようにすればSTART/STOPの機能を実装できる。

 次にLAP/RESETボタンで、これは時間を計測中に押した場合はラップタイムの記録を取り、停止中に押した時は集計した時間のリセットになる。
 その処理の判断はメインのスクリプト中で行うので、このボタンは「今ボタンが押された!」という情報を伝えるだけでよい。なのでこちらは通常のボタンで実装する。
 メインのスクリプト中にボタンが押された瞬間(フレーム)だけtrueが書き込まれるような変数を1つ用意すればことが足りる。この変数は初期状態がfalseになっていて、ボタンが押されるとtrueに書き換えられる。測定中だったらラップタイム計測の処理を、停止中だったら集計された時間を0に戻す処理が行われ、終わった後にこの変数をfalseに戻してやればまた次のフレームからボタン入力の待ち状態になる。
 ただ今日の段階ではラップタイムの計測はまだ実装していない。やることが多くて面倒そうだなというのは判る。

・おまけの実装

 こうしてフレームでの時間計測が可能になったわけなのだけれど、〇秒+〇フレームと表示されるよりそのフレームの値が1秒のうちのどれくらいなのか、パッと見ただけで判別できるようになっていた方が有用だろう。なので計測時間の横にその表示を追加した。

スクリーンショット 2021-07-25 234656

 この丸い画像をUIのイメージで追加して、イメージコンポーネントにある設定を”Radial 360”という円弧状に塗りつぶす方法へ変更する。あとは”fillAmount”という変数に計測時間の小数点以下の時間を渡してやれば円グラフの表示でおおよそのフレーム感覚が判別できるようになる。

・余談

 これまでコンポーネントを取得するのに、インスペクター上でオブジェクトを取得して、コード内でそのオブジェクトからGetComponentしていたのだけれど、初めからコンポーネントのタイプを指定してインスペクターに出しておけば、そのオブジェクトを放り込んだ際に何もしなくても直にお目当てのコンポーネントを取得できることを知りましたわ。
 例えば↓みたいなオブジェクトから直接スクリプトを取得するとかね。

スクリーンショット 2021-07-26 001516


この記事が気に入ったらサポートをしてみませんか?