はじめに
今回はUniRxを使って現在時刻をテキストに表示させる記事になります!
現在時刻をテキストに表示せよと言われたら、Update()
内で色々と処理をしていく方法がまず思いつくのではないでしょうか。
ただUniRx
のUpdateAsObservable
を用いることで、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
とかでも少しスクリプトを変えてあげれば大丈夫です。
さいごに
こうやってみると、本当にUniRx
とLinq
は似ていますよね。
興味深い・・・。