はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】UniRxを使って現在時刻をText(TextMeshProUGUI)に表示させる

f:id:hanaaaaaachiru:20190417202029g:plain

はじめに

今回はUniRxを使って現在時刻をテキストに表示させる記事になります!

現在時刻をテキストに表示せよと言われたら、Update()内で色々と処理をしていく方法がまず思いつくのではないでしょうか。

ただUniRxUpdateAsObservableを用いることで、Start()内で完結でき、クラスのフィールドを必要としません。

UniRxの練習にはもってこいな感じがしました。

ということでさっそくやっていきましょう。

実装コード

using UnityEngine;
using TMPro;            //TextMeshProUGUIを使うため
using UniRx;            //UniRxを使うため
using UniRx.Triggers;   //UpdateAsObservableを使うため
using System;           //DateTimeを使うため

public class CurrentTime : MonoBehaviour
{
    private void Start()
    {
        TextMeshProUGUI clockText = GetComponent<TextMeshProUGUI>();
        float prevSeconds = 0f;

        //UniRxのUpdateAsObservableを利用
        //Whereで前回の秒数と異なるときのみ表記している時間を更新する
        //Selectを使って現在時刻を射影
        this.UpdateAsObservable()
            .Where(_ => prevSeconds != DateTime.Now.Second)
            .Select(_ => DateTime.Now)
            .Subscribe(now => {
                clockText.text = now.ToLongTimeString();
                prevSeconds = now.Second;
            });
    }

}

おそらくさほど知識がなくても意外とすんなりコードが見えてくるかもしれません。
やっていることは単純で、秒数が異なっているかをチェックし、変わっていたら値を更新しています。

このスクリプトをTextMeshProUGUIコンポーネントがアタッチされたGameObject(テキストを表示する)にアタッチすれば動くはずです。

また別にTextMeshProUGUIでなくとも、普通のTextとかでも少しスクリプトを変えてあげれば大丈夫です。

さいごに

こうやってみると、本当にUniRxLinqは似ていますよね。
興味深い・・・。