特定シーンから強制的に起動するスクリプトを改造する

ワタクシが今関わっているプロジェクトはunityあるあるでsceneが山のようにあり、それを編集しているときに再生シーンを固定したいという願いがあった。
それを実現してくれたのがKan Kikuchiさんの [エディタ上で再生を開始するSceneを固定する【Unity】【エディタ拡張】](https://kan-kikuchi.hatenablog.com/entry/playModeStartScene)  だった。
全く大いに感謝したい話で、もう、これで **スタートシーンが固定できる** ので、めっちゃ便利に使わせてもらっていた…いたのだけど、 **面倒が一つあった** 。

それは僕が作っているsceneいくつかは、トップから動かすとわりとメニューの奥深くで、面倒くさいので単独起動できるように作ってあるのだ。
つまり通しのテストのために起動シーンは固定しておきたいが、テストの時には設定されているシーンを無視したい。
そして、いちいちnoneにするのはぶっちゃけ面倒くさい。
というわけでテストのときは起動シーンが固定されないように改造してしまえというわけで、以下に改造したコードを載せておきたい。
gitにあればプルリクなど遅らせれてもらうのだが…

```c#:settingStartSceneWindow.cs
//  SettingStartSceneWindow.cs
//  http://kan-kikuchi.hatenablog.com/entry/playModeStartScene
//
//  Created by kan.kikuchi on 2017.09.30.
//	modified 2021.10.22

using UnityEditor;
using UnityEditor.SceneManagement;
using UnityEngine;

public class SettingStartSceneWindow : EditorWindow{

  //設定したシーンのパスを保存するKEY
    private const string SAVE_KEY = "StartScenePathKey";
    private static readonly string IgnoreScene = "IgnoreScene";
    static bool IsWork {
        get {
            string value = EditorUserSettings.GetConfigValue(IgnoreScene);
            return !string.IsNullOrEmpty(value) && value.Equals("True");
        }
        set {
            EditorUserSettings.SetConfigValue(IgnoreScene, value.ToString());
        }
    }

    SceneAsset currentAsset=null;

    // メニューからウィンドウを表示
    [MenuItem("Window/SettingStartSceneWindow")]
    public static void Open() {
        SettingStartSceneWindow.GetWindow<SettingStartSceneWindow>(typeof(SettingStartSceneWindow));
    }

    // 初期化(ウィンドウを開いた時等に実行)
    private void OnEnable() {
        // 保存されている最初のシーンのパスがあれば、読み込んで設定
        string startScenePath = EditorUserSettings.GetConfigValue(SAVE_KEY);
        if(!string.IsNullOrEmpty(startScenePath)){
            //パスからシーンを取得、シーンがなければ警告表示
            SceneAsset sceneAsset = AssetDatabase.LoadAssetAtPath<SceneAsset>(startScenePath);
            if(sceneAsset == null) {
                Debug.LogWarning(startScenePath + "がありません！");
            } else {
                EditorSceneManager.playModeStartScene = sceneAsset;
                currentAsset = EditorSceneManager.playModeStartScene;
            }
        }
    }
  
    private void OnGUI() {

        //更新前のplayModeStartSceneに設定されてるシーンのパスを取得
        string beforeScenePath = "";
        if(EditorSceneManager.playModeStartScene != null){
            beforeScenePath = AssetDatabase.GetAssetPath(EditorSceneManager.playModeStartScene);
        }

        //GUIでシーンファイルを取得し、playModeStartSceneに設定する
        EditorSceneManager.playModeStartScene = (SceneAsset)EditorGUILayout.ObjectField(new GUIContent("Start Scene"), EditorSceneManager.playModeStartScene, typeof(SceneAsset), false);

        //更新後のplayModeStartSceneに設定されてるシーンのパスを取得
        string afterScenePath = "";
        if(EditorSceneManager.playModeStartScene != null){
            afterScenePath = AssetDatabase.GetAssetPath(EditorSceneManager.playModeStartScene);
        }
        IsWork = EditorGUILayout.ToggleLeft("設定をNONEにする", IsWork);

        //playModeStartSceneが変更されたらパスを保存
        if(beforeScenePath != afterScenePath){
            EditorUserSettings.SetConfigValue(SAVE_KEY, afterScenePath);
            currentAsset = EditorSceneManager.playModeStartScene;
        }
        if (IsWork==true) {
            EditorSceneManager.playModeStartScene=null; // 強制的にnullにする。
        } else {
            EditorSceneManager.playModeStartScene=currentAsset; // 保存されてるシーンにする。
        }
    }
}

```

オリジナルとの使い方の違いだけ書いておく。
下のように **設定をNONEにするチェックボックス** が追加されている。
![スクリーンショット 2021-10-20 220923.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96586/46439a47-1a43-3355-b151-273695e75f38.png)
で、これをチェックすると
![スクリーンショット 2021-10-20 220945.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96586/11e7c174-ca87-eedf-b5ed-737081a44739.png)
start sceneをnoneする、すなわち **現在編集中のシーンを再生する** という挙動になる。
なお、このチェックボックスは~~意図的に保存していないので、再生するたびにオフになる。気に入らない人は自分で改造して欲しい~~。

チェックしっぱなしになってbootシーン行きそびれるのがイヤで保存しなかったのだけど、あるシーンを編集していて、毎回チェックするのが面倒くさくなったので保存することにした。
やはり面倒くさがりであるｗ