おもちゃラボ

Unityで遊びを作ってます

【Unity】シーンが遷移したことを検知する

あるシーンから別のシーンへ遷移するタイミングで何か処理を実行したい場合、シーンが遷移したことを検知する必要があります。Unity5.4からはシーン遷移にSceneManagerを使います。そして、このSceneMangerには「activeSceneChanged」「sceneLoaded」「sceneUnloaded」という3つのデリゲートが用意されています。

デリゲートとは特定のイベントが起こった場合に呼び出すメソッドを指定できる仕組みです。Unityではオブジェクト同士が衝突したときにはOnColliderEnterメソッドなどが自動的に呼ばれますが、このように既に決まったメソッドを呼び出すのではなく、プログラマが自由に呼ばれるメソッドを自由に決められる仕組みがデリゲートになります。

シーン遷移を検知するデリゲートと、登録したメソッドの呼ばれるタイミングは次のようになります。

デリゲート タイミング
activeSceneChanged アクティブなシーンが変更されたとき
sceneLoaded シーンが読み込まれたとき
sceneUnloaded シーンが破棄されたとき


これらのデリゲートの登録方法と、デリゲートの書き方は次のようになります。

ng System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class Test : MonoBehaviour {

    void Start()
    {
        SceneManager.activeSceneChanged += OnActiveSceneChanged;
        SceneManager.sceneLoaded              += OnSceneLoaded;
        SceneManager.sceneUnloaded          += OnSceneUnloaded;    
    }

    void OnActiveSceneChanged( Scene prevScene, Scene nextScene )
    {
        Debug.Log ( prevScene.name + "->"  + nextScene.name );
    }

    void OnSceneLoaded( Scene scene, LoadSceneMode mode )
    {
        Debug.Log ( scene.name + " scene loaded");
    }

    void OnSceneUnloaded( Scene scene )
    {
        Debug.Log ( scene.name + " scene unloaded");
    }
}

Startメソッドの中で デリゲートに呼び出すメソッドを登録しています。Startメソッドに続く3つのメソッドがデリゲートになります。デリゲートの名前は自由に決めてOKですが、戻り値と引数の型は決まっているので注意して下さい。