MRが楽しい

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

UniRxのFromEventを使ってイベントをObservableに変換する

本日はUniRxの小ネタ枠です。
UniRxのFromEventを使ってイベントをObservableに変換する方法です。

前提条件

UniRxの環境構築手順は以下の記事を参照ください。
bluebirdofoz.hatenablog.com

FromEvent

FromEventはイベントをObservableに変換します。

Observable.FromEvent(h => _onAction += h, h => _onAction -= h);

サンプルスクリプト

FromEventを使ってイベントをObservableに変換するサンプルスクリプトを作成しました。
複数の引数を受け取りたい場合はタプルを使って引数をまとめます。
・FromEventTest.cs

using System;
using UniRx;
using UnityEngine;

public class FromEventTest : MonoBehaviour
{
    private static Action _onAction;
    
    private static Action<string> _onActionWithParam;
    
    private static Action<(int, string)> _onActionWithTuple;
    
    // Start is called before the first frame update
    async void Start()
    {
        // 引数無しパターン
        var observable = UniRx.Observable.FromEvent(
            h => _onAction += h,
            h => _onAction -= h
        );
        
        // 5秒後にonActionイベントを実行する
        Observable.Timer(TimeSpan.FromSeconds(5))
            .Subscribe(_ => _onAction?.Invoke())
            .AddTo(this);
        
        // イベントが発行されるまで待機する
        await observable.First();
        
        Debug.Log("イベントが発行されました");
        
        // 引数ありパターン
        var observableWithParam = UniRx.Observable.FromEvent<string>(
            h => _onActionWithParam += h,
            h => _onActionWithParam -= h
        );
        
        // 5秒後にonActionWithParamイベントを実行する
        Observable.Timer(TimeSpan.FromSeconds(5))
            .Subscribe(_ => _onActionWithParam?.Invoke("パラメータ"))
            .AddTo(this);
        
        // イベントが発行されるまで待機する
        var param = await observableWithParam.First();
        
        Debug.Log($"イベントが発行されました: {param}");
        
        // 引数複数パターン
        // タプルを使って複数の引数を受け取る
        var observableWithTuple = UniRx.Observable.FromEvent<(int, string)>(
            h => _onActionWithTuple += h,
            h => _onActionWithTuple -= h
        );
        
        // 5秒後にonActionWithTupleイベントを実行する
        Observable.Timer(TimeSpan.FromSeconds(5))
            .Subscribe(_ => _onActionWithTuple?.Invoke((1, "複数パラメータ")))
            .AddTo(this);
        
        // イベントが発行されるまで待機する
        var tuple = await observableWithTuple.First();
        
        Debug.Log($"イベントが発行されました: {tuple.Item1}, {tuple.Item2}");
    }
}

以下の通り、イベントをObservableに変換して受け取ることができました。