0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Unityのシーン遷移をR3のイベントで受け取りたい

Last updated at Posted at 2025-12-01

はじめに

Unityのシーン遷移のObservableが欲しくなりました。

EveryUpdate のノリで使いたい。

この記事ではR3のEveryUpdate のノリで使えるシーン遷移Observableの作り方を紹介します。

シーン遷移イベント

SceneManager.activeSceneChangedというActiveシーンが切り替わったときに発火するstaticのEventがありました(公式ScriptReference)。引数は前のシーン(prev)と次のシーン(next)が渡されます。

Observableにする

以下のSceneChangeObservable.csactiveSceneChangedをObservableにする関数を書きました。staticクラスなので、ゲームオブジェクトにアタッチする必要もありません。

SceneChangeObservable.cs
using System.Threading;
using UnityEngine.SceneManagement;
using R3;
using UnityEngine.Events;

public static class SceneChangeObservable
{
    public static Observable<(Scene prev, Scene next)> OnActiveSceneChangedAsObservable()
    {
        return OnActiveSceneChangedAsObservable(CancellationToken.None);
    }

    public static Observable<(Scene prev, Scene next)> OnActiveSceneChangedAsObservable(
        CancellationToken cancellationToken)
    {
        return Observable.FromEvent<UnityAction<Scene, Scene>, (Scene, Scene)>(
                h => (p, n) => h((p, n)),
                h => SceneManager.activeSceneChanged += h,
                h => SceneManager.activeSceneChanged -= h)
            .TakeUntil(cancellationToken);
    }
}

使い方

とりあえずR3を入れてください。

A, B, C の3つのシーンを用意してボタンを押すとABC というふうにシーン遷移するようにします。

image.png

ボタンは以下のSceneChangeButton.csをつけてよしなにしてください。ProjectSettingにシーンを登録すればnextNameに遷移したいシーンをインスペクターから設定できます。

SceneChangeButton.cs
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using R3;

public class SceneChangeButton : MonoBehaviour
{
    [SerializeField] private string nextName;
    
    private Button _button;
    
    private void Start()
    {
        _button = GetComponent<Button>();
        _button.OnClickAsObservable()
            .Subscribe(_ => SceneManager.LoadScene(nextName))
            .AddTo(this);
    }
}

シーンAに空のオブジェクトを配置して以下のSceneChangeEventSubscriber.csをつけてシーン遷移イベントを受け取ります。EveryUpdate のノリで使えます。

ちなみにDontDestroyOnLoadしないとイベントを受け取れません。

SceneChangeEventSubscriber.cs
using UnityEngine;
using R3;
using UnityEngine.SceneManagement;

public class SceneChangeEventSubscriber : MonoBehaviour
{
    private void Start()
    {
        SceneChangeObservable.OnActiveSceneChangedAsObservable()
            .Subscribe(tuple =>
            {
                Debug.Log($"Scene changed to {tuple.next.name}");
            })
            .AddTo(this);
        
        DontDestroyOnLoad(gameObject);
    }
}

実行

ボタンを押してシーンを切り替えるとSceneChangeEventSubscriber.csでログが出てきます。

image.png

まとめ

この記事ではR3のEveryUpdate のノリで使えるシーン遷移Observableの作り方を紹介しました。Unityパッケージ化したい。

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?