Unity:少し特殊なストップウォッチアプリ制作日記_1:秒数を計る

・何を作ろうか

 24フレーム、30、60といったフレーム単位で時間を計れるストップウォッチを作ろうと思った。
 ゲームの仕事で絵コンテ的なものを描く瞬間が時々あって、脳内カットの時間をストップウォッチで計るわけだが、その時間をわざわざフレーム数に換算するのが何気に面倒だった。
 アプリストアで検索をしてもそれらしいアプリは全くヒットしない。だがさらに調べてみるとアニメーター用に秒間24フレームで計測できるストップウォッチはPC版が存在するようだ。
http://www.janica.jp/products/24k_stopwatch/index.html
(実際にダウンロードしてWindows10上で動作は確認)
 以前はiOS対応のアプリ版もあったようなのだけどどうやら現在はもう動かず、配信もされていないらしい。
 需要というものは確かにあったらしいが、アプリ版が消えたということはそれ程多くの需要があるわけでもないようだ。ただそれでも自分にはこういう「フレームで計測できるストップウォッチ」が欲しい瞬間があったのでUnityの練習がてら作ってみることにした。ゲームではなくツールなので完成形が最初から見えている。というのが作りやすそうに思えたからだ。

・最初の実装

 Unity自体は普段仕事でも使い慣れたツールだが、仕事でUnityを使う場面はほぼ他のソフトで作成した絵素材やモデル・モーションをプロジェクトに追加する操作であったり、ゲームの実装用に決められた処理を行うなどばかりで、Unity上でアートに関わる作業というのはそれほど無い。レベル(=ステージ/マップ)構築、エフェクト作成、シェーダー・ポストプロセスの設定、デモシーンの作成、UIの配置やアニメーション作成……いや思ったより意外とあったわ。もちろん自分1人で全部やるわけではないが。
 とはいえ肝心のスクリプティングに関しては……以前わずかに触れたことはあるものの綺麗さっぱり頭から消えていた。……ので、まず適当なチュートリアルを済ませつつ

【Unity,C#】時間をカウントしたい!
https://asamagames.com/2019/06/30/%E3%80%90unityc%E3%80%91%E6%99%82%E9%96%93%E3%82%92%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%97%E3%81%9F%E3%81%84%EF%BC%81/

UnityのTime.deltaTimeを使ってミリ秒を計測する
https://saigonotoride.hatenablog.com/entry/2017/10/01/152704

これらの記事を入口にまずスタートと一時停止で普通に時間を計測できるところまでを作った。

・実装の内容

 スクリプトはHierarchyの一番下にあるGameObjectに付いていて、そのスクリプトから別階層のUIテキストに時間を表示させている。とても単純だ。

 UIのcanvasが2つに分けられているのは、UnityではUIに何か1つでも変更が入るとcanvas単位でまるっと再計算が入る(しかもそれなりに重いらしい)的なことを聞いていたので「変化のない壁紙の一枚絵」と「切り替わるボタン・数字」でcanvasを分けている。
 毎フレームすべての絵素材が意味もなく処理されるのは良くないだろうことはさすがにスクリプト1年生の自分でも想像がつくが、処理にどれくらいの差が生まれるのかは正直なところ判らない。ひょっとしたらこの程度の要素数ならば、分けるほうが余計な負荷を生み出してるかもしれない。でもやっておく。気分で。わからん、何もわからん。

 canvasの中は階層の順番が表示の優先に関係するが、canvas同士の表示順は階層の並び順ではなくComponent中のSortOrderという値で優先順位を付ける。まずはここまで。

スクリーンショット 2021-07-17 192456

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class TimeCount : MonoBehaviour
{
   private float time;
   //表示するテキストオブジェクトを取得。
   //publicで放り込むことでテキストオブジェクトをFindしたりGetComponentする必要がない。
   public Text text;

   // Start is called before the first frame update
   void Start()
   {
       time = 0f;
   }

   // Update is called once per frame
   void Update()
   {
       //毎フレームの経過時間を取得
       time += Time.deltaTime;
       //表示用のテキスト形式の時間を用意
       string timeText;
       timeText = time.ToString();
       text.text = timeText;
   }
}

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