MRが楽しい

MRやVRについて学習したことを書き残す

UniRxを使って一定間隔で処理を行う

本日は UniRx の小ネタ枠です。
UniRxを使って一定間隔で処理を行う手順を記事にします。
f:id:bluebirdofoz:20210226024409j:plain

UniRxを使って一定間隔で処理を行う

UniRx を使って一定間隔で処理を行いたい場合、Interval または Timer のファクトリメソッドを利用します。
reactivex.io
reactivex.io

Interval メソッドは実行間隔の指定のみで動作しますが、Subscribe直後には実行されず、一度待機してから実行されます。
Subscribe 直後から即座に実行したい場合は Timer メソッドを使用して待機時間を 0 で指定します。

サンプルスクリプト

以下のサンプルスクリプトを作成してみました。
・UniRxIntervalTest.cs

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

// UniRxの参照
using UniRx;

public class UniRxIntervalTest : MonoBehaviour
{
    // 起動時処理
    void Start()
    {
        Debug.Log("Time : " + Time.time + ", Main ThreadID:" + System.Threading.Thread.CurrentThread.ManagedThreadId);

        // 10秒ごとに実行(Timerかつ第一引数に 0 指定の場合、Subscribe後に即座に1回目の処理が実行される)
        Observable.Timer(System.TimeSpan.Zero, System.TimeSpan.FromSeconds(10))
            .Subscribe(x =>
            {
                Debug.Log("Timer Time : " + Time.time + ", No : " + x.ToString() +
                    ", ThreadID : " + System.Threading.Thread.CurrentThread.ManagedThreadId);
            }
            ).AddTo(this);

        // 10秒ごとに実行(Intervalの場合、Subscribe後に待機時間を待機してから1回目の処理が実行される)
        Observable.Interval(System.TimeSpan.FromSeconds(10))
            .Subscribe(x =>
            {
                Debug.Log("Interval Time : " + Time.time + ", No : " + x.ToString() +
                    ", ThreadID : " + System.Threading.Thread.CurrentThread.ManagedThreadId);
            }
            ).AddTo(this);
    }
}

f:id:bluebirdofoz:20210226024432j:plain

シーンの空オブジェクトにスクリプトをアタッチします。
f:id:bluebirdofoz:20210226024445j:plain

シーンを実行して動作を確認します。
以下の通り、指定の時間間隔で処理が実行されます。
f:id:bluebirdofoz:20210226024454j:plain