(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]

特定のシーンだけ別のシーンから再生されるようにする【Unity】【エディタ拡張】


このエントリーをはてなブックマークに追加


この記事でのバージョン
Unity 2018.4.1f1


はじめに

今回は「このシーンで再生ボタンを押したら、違うシーンを再生してほしい!」

みたいなちょっとトリッキーな話。


以前に、どのシーンからでも再生を開始するシーンを固定するという記事は書きましたが、




これの特定のシーンVerといった具合で、イメージとしては以下のような感じ。

f:id:kan_kikuchi:20190716080453g:plain


ちなみに、「再生出来ないようにしたい」という場合は以下の記事を参照のこと。

f:id:kan_kikuchi:20190715060906g:plain


なお、記事中の画像は以下のアセットを使っております。





ScenePlayBlocker

早速ですが、別のシーンから再生するようにするクラスAnotherScenePlayerのプログラムです。


using UnityEngine;
 
 #if UNITY_EDITOR
 using UnityEditor;
 using UnityEditor.SceneManagement;
 #endif
 
 /// <summary>
 /// 別のシーンから再生するようにする
 /// </summary>
 [ExecuteInEditMode]//ExecuteInEditModeを付ける事でOnValidateやOnDestroyが再生していなくても実行されるようになる
 public class AnotherScenePlayer : MonoBehaviour{
   #if UNITY_EDITOR
 
   //再生する別のシーン(nullのままにすると、現状のシーンがそのまま再生される)
   [SerializeField]
   private SceneAsset _anotherScene = null;
 
   //=================================================================================
   //初期化、破棄
   //=================================================================================
   
   //有効になった時(シーンを開いた時)や、Inspectorで変数(_anotherScene)を変更した時に実行
   private void OnValidate() {
     //最初に再生するシーンを登録
     EditorSceneManager.playModeStartScene = _anotherScene;
   }

   //削除された時(シーンを閉じた時)に実行
   private void OnDestroy() {
     //最初に再生するシーンを削除(他のシーンを再生した時に再生シーンが変わらないように)
     EditorSceneManager.playModeStartScene = null;
   }
 
   #endif
 }


これをシーン内のオブジェクトにAddし、Another Sceneシーンを登録すると、

f:id:kan_kikuchi:20190716075449j:plain


そのシーンから再生が開始されるようになります。(他のシーンに影響はない)

f:id:kan_kikuchi:20190716080453g:plain


一応、プログラムについて解説をしてみると、以下のような感じでかなり単純です。

  1. ExecuteInEditModeの属性を付けて、OnValidateとOnDestroyを再生してない時にも実行されるように
  2. EditorSceneManager.playModeStartSceneで最初に再生するシーンを指定


ちなみにEditorApplication.playModeStateChanged

EditorSceneManager.playModeStartSceneについては以下の記事を参照のこと。




なお、シーンをパスで指定してロードしたい場合は、AssetDatabase.LoadAssetAtPathを使います。

//最初に再生するシーンを登録
EditorSceneManager.playModeStartScene = AssetDatabase.LoadAssetAtPath<SceneAsset>("Assets/Scenes/Scene3.unity");
f:id:kan_kikuchi:20190716074757j:plain