Last active
January 19, 2021 21:48
-
-
Save kankikuchi/82ac130ff68882b90b1aa87c15076b5b to your computer and use it in GitHub Desktop.
Unityエディタを再生しているかとビルド設定されているか問わずにシーンをロードする拡張機能【Unity】【エディタ拡張】
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// EditorSceneLoader.cs | |
// http://kan-kikuchi.hatenablog.com/entry/EditorSceneLoader | |
// | |
// Created by kan.kikuchi on 2020.09.04. | |
using System; | |
using UnityEditor; | |
using UnityEditor.SceneManagement; | |
using UnityEngine; | |
using UnityEngine.SceneManagement; | |
using System.IO; | |
using System.Linq; | |
using System.Collections.Generic; | |
/// <summary> | |
/// Unityエディタ上で再生状態、ビルド設定状態を問わずシーンをロード出来るウィンドウ | |
/// </summary> | |
public class EditorSceneLoader : EditorWindow { | |
//スクロール位置 | |
private Vector2 _scrollPosition = Vector2.zero; | |
//「ビルドに設定されていないシーン」で表示する対象があるシーンのディレクトリのパス | |
private readonly string SCENE_DIRECTORY_PATH = ""; | |
//各シーンへのパス | |
private List<string> _settingScenePathList, _notSettingScenePathList; | |
//================================================================================= | |
//初期化 | |
//================================================================================= | |
//メニューからウィンドウを表示 | |
[MenuItem("Tools/EditorSceneLoader")] | |
public static void Open (){ | |
EditorSceneLoader.GetWindow (typeof(EditorSceneLoader)); | |
} | |
//ウィンドウを開いた時やシーン再生後等に実行される | |
private void OnEnable() { | |
//シーンのパス取得 | |
_settingScenePathList = EditorBuildSettings.scenes.Select(settingScene => settingScene.path).ToList<string>(); | |
_notSettingScenePathList = AssetDatabase.FindAssets("t:SceneAsset")//シーンのアセットのGUIDを全て取得 | |
.Select(AssetDatabase.GUIDToAssetPath)//GUIDからPathに変換 | |
.Where(path => !_settingScenePathList.Contains(path))//ビルドに設定されているシーンは除く | |
.Where(path => path.Contains(SCENE_DIRECTORY_PATH))//指定のディレクトに入ってるシーンのみ | |
.ToList<string>(); | |
} | |
//================================================================================= | |
//表示するGUIの設定 | |
//================================================================================= | |
private void OnGUI(){ | |
//描画範囲が足りなければスクロール出来るように | |
_scrollPosition = EditorGUILayout.BeginScrollView(_scrollPosition, GUI.skin.scrollView); | |
//現在開いてるシーンのリロードボタン | |
EditorGUILayout.LabelField("現在開いてるシーンのリロード"); | |
EditorGUILayout.BeginVertical(GUI.skin.box); | |
if (Application.isPlaying) { | |
if (GUILayout.Button("リロード")) { | |
var currentScenePath = SceneManager.GetActiveScene().path; | |
OpenScene(currentScenePath, _settingScenePathList.Contains(currentScenePath)); | |
} | |
} | |
else { | |
GUILayout.Label("リロード(Unity再生中のみ使えます)"); | |
} | |
EditorGUILayout.EndVertical(); | |
EditorGUILayout.Space(); | |
//ビルドに設定されているシーン | |
EditorGUILayout.LabelField("ビルドに設定されているシーン"); | |
EditorGUILayout.BeginVertical(GUI.skin.box); | |
ShowOpeningSceneGUI(_settingScenePathList, true); | |
EditorGUILayout.EndVertical(); | |
EditorGUILayout.Space(); | |
//ビルドに設定されていないシーン | |
EditorGUILayout.LabelField("ビルドに設定されていないシーン"); | |
EditorGUILayout.BeginVertical(GUI.skin.box); | |
ShowOpeningSceneGUI(_notSettingScenePathList, true); | |
EditorGUILayout.EndVertical(); | |
//スクロール箇所終了 | |
EditorGUILayout.EndScrollView(); | |
} | |
//シーンを開くためのGUIを表示 | |
private void ShowOpeningSceneGUI(List<string> scenePathList, bool isSettingBuild) { | |
foreach (var scenePath in scenePathList) { | |
var sceneName = Path.GetFileNameWithoutExtension(scenePath); | |
if (GUILayout.Button(sceneName)) { | |
OpenScene(scenePath, isSettingBuild); | |
} | |
} | |
} | |
//エディタを再生しているかどうかに合わせてシーンを開く | |
private void OpenScene(string scenePath, bool isSettingBuild) { | |
//シーンがあるかチェック | |
if (AssetDatabase.LoadAssetAtPath<SceneAsset>(scenePath) == null) { | |
Debug.LogError($"{scenePath}がありません"); | |
return; | |
} | |
//エディタを再生しているかいないかでロード処理を分ける | |
if (Application.isPlaying) { | |
//ビルドに設定されているシーンをプレイ中にロードする時(通常のゲーム時と同じロード処理にしたい等) | |
//if (isSettingBuild) { | |
//return; | |
//} | |
EditorSceneManager.LoadSceneInPlayMode(scenePath, new LoadSceneParameters(LoadSceneMode.Single)); | |
return; | |
} | |
//現在のシーンに変更があった場合、保存するか確認のウィンドウを出す(キャンセルされたら読み込みをしない) | |
if(!EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo()){ | |
return; | |
} | |
//シーン読み込み | |
EditorSceneManager.OpenScene (scenePath); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment