3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Unity】シーンの読み込みイベントをIObservableにする【UniRx】

Posted at

はじめに

SceneManager.sceneLoadedIObservableにしようと思ったら型パズルで苦戦したのでメモ1

コード

ObservableSceneEvent.cs
using System;
using UnityEngine.Events;
using UnityEngine.SceneManagement;

namespace UniRx
{
    public static class ObservableSceneEvent
    {
        public static IObservable<Tuple<Scene, Scene>> ActiveSceneChangedAsObservable()
        {
            return Observable.FromEvent<UnityAction<Scene, Scene>, Tuple<Scene, Scene>>(
                h => (x, y) => h(Tuple.Create(x, y)),
                h => SceneManager.activeSceneChanged += h,
                h => SceneManager.activeSceneChanged -= h
            );
        }

        public static IObservable<Tuple<Scene, LoadSceneMode>> SceneLoadedAsObservable()
        {
            return Observable.FromEvent<UnityAction<Scene, LoadSceneMode>, Tuple<Scene, LoadSceneMode>>(
                h => (x, y) => h(Tuple.Create(x, y)),
                h => SceneManager.sceneLoaded += h,
                h => SceneManager.sceneLoaded -= h
            );
        }

        public static IObservable<Scene> SceneUnloadedAsObservable()
        {
            return Observable.FromEvent<UnityAction<Scene>, Scene>(
                h => h.Invoke,
                h => SceneManager.sceneUnloaded += h,
                h => SceneManager.sceneUnloaded -= h
            );
        }
    }
}

各イベントがstaticなせいで拡張メソッドとして実装できないので、苦肉の策でstaticなObservableSceneEventクラスを実装。

SceneManagerを完全にラップするObservableSceneManagerクラスの実装も考えたけどUnityのAPIが変わるごとにメンテナンスするのが面倒だったのでこの形に落ち着いた。

C#7以上を使ってる場合はTupleを適当に書き換えてください(参考:タプル)。

参考

  1. FromEvent()はたまにしか書かないので全然覚えられない😂

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?