OnLevelWasLoadedは非推奨になりましたとさ

久しぶりのUnityも気づいたらUnity5.3からUnity5.4になってました。そしたら
OnLevelWasLoaded()が使えなくなってたのでそのと解決策(代替案)

OnLevelWasLoaded()って何さ?

Unity魔法のメソッド団の1人でSceneが呼ばれたときに1回だけ実行されるメソッドです。引数にはScene番号が渡されて特定のSceneごとにアクションを変えたりできました。

void OnLevelWasLoaded(int index){
     if(index==1) print("Sceneの1番目に登録される奴");
}

個人的には最近使い始めて結構気に入ってたのですが、Unity5.4系からは非推奨になりました。上記のソースコード書いて実行すると・・・・OnLevelWasLoaded

“消えたわけ”ではない

さっきほどの実行結果は以下の通り

OnLevelWasLoaded was found on hoge.
This message has been deprecated and will be removed in a later version of Unity. Add a delegate to SceneManager.sceneLoaded instead to get notifications after scene loading has completed

要約

OnLevelWasLoadedはhoge(ファイル名)に発見されました。 このメッセージ(メソッド)は廃止されており、Unityのそれ以降のバージョン(Unity 5.5~)では削除されます。シーンの読み込みが完了した後に通知を受け取るのは、代わりにSceneManager.sceneLoadedデリゲートを追加します。

散々非推奨になったといってもますが、「OnLevelWasLoaded()」が非推奨になっただけで「Sceneが読み込まれたときに呼び出す」という機能は消えてません。このような背景には、Unityの従来のScene読み込みが非推奨になりSceneManagementに移行したのが絡んできてると思われます。SceneManagementになったことで、Scene遷移関係も細かく弄れる様になったので悪いことだけではないとおもいます。

//従来 ~Unity5.2
public class hoge : MonoBehaviour {
  void Start(){
      Application.LoadLevel(String SceneName);
  }
}

//今の方法 Unity5.3~
using UnityEngine.SceneManagement;
public class hoge : MonoBehaviour {
  void Start(){
      SceneManager.LoadScene(String SceneName);
  }
}

解決策

警告文どおりSceneManager.sceneLoadedにイベントとして登録すれば解決します。以下ソースコードと実行結果

using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;

public class hoge : MonoBehaviour {

  void Awake () {
        SceneManager.sceneLoaded += sample;
  }

    void sample(Scene scenename,LoadSceneMode SceneMode) {
        print("今のSceneの名前="+scenename.name);
    }
}

Now_the_Scene

今回は実行した時に、sceneの名前がほしかったのでStartではなくAwakeを使用しました。
SceneManager.sceneLoadedでsceneの読み込み判定をとると従来のと違って、sceneの名前でも判定をとれるので便利ですね

デリゲートとは・・・・

今回出てきたデリゲートですがこいつ何者?と思った人もいると思います。
デリゲートとはざっくりいえば関数を代入できる変数です。
+=で追加、-=で削除します。

最後に

しばらく放置しててすみませんでした。これからはゆるりと更新を再開したいと思います。最近はUnityよりC#についていろいろ学びたいと思ってるので、C#記事とかも書くかもしれません。

参考サイト様

Unity Web Forum OnLevelWasLoaded deprecation

Unity Documentation MonoBehaviour.OnLevelWasLoaded(int)

Unity Documantation イベント関数の実行順序

Unity Web Forum How to use SceneManager.onSceneLoaded ?

Microsoft Developer Network デリゲート

C#デリゲートってなんぞや

Lonely Mobiler Unity C#でデリゲートを使用する

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中