Skip to content

Instantly share code, notes, and snippets.

@kankikuchi
Last active January 19, 2021 21:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kankikuchi/82ac130ff68882b90b1aa87c15076b5b to your computer and use it in GitHub Desktop.
Save kankikuchi/82ac130ff68882b90b1aa87c15076b5b to your computer and use it in GitHub Desktop.
Unityエディタを再生しているかとビルド設定されているか問わずにシーンをロードする拡張機能【Unity】【エディタ拡張】
// 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