Unity・3DCG技術ブログ

TAもどきによるUnity・3DCGに関する記事をアップします。

Unityシーン遷移時にパラメータを渡せるようにしてみる

Unityシーン遷移時に引数(パラメータ)を渡したい時ってあると思います。 インターフェイスを実装したら引数が渡されてくれれば便利かなと思ったので実装してみます。

環境

  • Unity2018.3.0b6
  • Windows10

コード

このようなインターフェイスを定義します。

using UnityEngine;
using UnityEngine.EventSystems;

public interface ISceneWasLoaded : IEventSystemHandler
{
    void OnSceneWasLoaded(object argument);
}

引数を指定できるバージョンの LoadSceneWithArg というメソッドを作成します。

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using UnityEngine.SceneManagement;

public static class SceneManagerEx
{
    static public void LoadSceneWithArg(
         string sceneName,
         object argument,
         LoadSceneMode mode)
    {
        UnityAction<Scene, LoadSceneMode> sceneLoaded = default;
        Action removeHandler = () =>
        {
            SceneManager.sceneLoaded -= sceneLoaded;
        };

        sceneLoaded = (loadedScene, sceneMode) =>
        {
            removeHandler();
            foreach (var root in loadedScene.GetRootGameObjects())
            {
                ExecuteEvents.Execute<ISceneWasLoaded>(root, null, (receiver, e) => receiver.OnSceneWasLoaded(argument));
            }
        };

        SceneManager.sceneLoaded += sceneLoaded;
        SceneManager.LoadScene(sceneName, mode);
    }
}

遷移先のシーンでISceneWasLoadedインターフェイスを実装して、引数をとれるようにします。

public class HogeScene : MonoBehaviour, ISceneWasLoaded
{
    public void OnSceneWasLoaded(object argument)
    {
        Debug.Log("OnSceneWasLoaded.");
    }
}
SceneManagerEx.LoadSceneWithArg("HogeScene", new Hoge(), LoadSceneMode.Additive);

遷移後のHogeSceneにて OnSceneWasLoadedが呼ばれます。