Created
June 17, 2017 21:08
-
-
Save kankikuchi/8f21de0479f12ded2dbdd94d9c2c96a6 to your computer and use it in GitHub Desktop.
ビルド直前にシーンを自動で設定をしようとしてみた【Unity】【エディタ拡張】2
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
// ScenesInBuildUpdater.cs | |
// http://kan-kikuchi.hatenablog.com/entry/ScenesInBuildUpdater2 | |
// | |
// Created by kan.kikuchi on 2017.06.13. | |
using UnityEngine; | |
using UnityEditor; | |
using System.Collections.Generic; | |
using System.Linq; | |
/// <summary> | |
/// ビルドするシーンを自動で設定するクラス | |
/// </summary> | |
public class ScenesInBuildUpdater : AssetPostprocessor{ | |
//ビルドに設定するシーンが入ったディレクトリへのパス | |
private const string BUILD_DIRECTORY_PATH = "Assets/Scenes/Build"; | |
//デバッグ用シーンが入ったディレクトリへのパス | |
#if DEBUG_BUILD | |
private const string DEBUG_BUILD_DIRECTORY_PATH = "Assets/Scenes/DebugBuild"; | |
#endif | |
//================================================================================= | |
//検知 | |
//================================================================================= | |
//Assets内のファイルが更新、削除などされたときに呼ばれる | |
private static void OnPostprocessAllAssets (string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths){ | |
List<string[]> assetsList = new List<string[]> (){ | |
importedAssets, deletedAssets, movedAssets, movedFromAssetPaths | |
}; | |
List<string> targetDirectoryNameList = new List<string> (){ | |
BUILD_DIRECTORY_PATH, "ProjectSettings" | |
}; | |
//変更されたファイルに指定ディレクトリ内のものが含まれている時はビルドするシーンを更新 | |
if(ExistsDirectoryInAssets(assetsList, targetDirectoryNameList)){ | |
UpdateScenesInBuild (); | |
} | |
} | |
//入力されたassetsの中に、ディレクトリのパスがdirectoryNameの物はあるか | |
protected static bool ExistsDirectoryInAssets(List<string[]> assetsList, List<string> targetDirectoryNameList){ | |
return assetsList | |
.Any (assets => assets //入力されたassetsListに以下の条件を満たすか要素が含まれているか判定 | |
.Select (asset => System.IO.Path.GetDirectoryName (asset)) //assetsに含まれているファイルのディレクトリ名だけをリストにして取得 | |
.Intersect (targetDirectoryNameList) //上記のリストと入力されたディレクトリ名のリストの一致している物のリストを取得 | |
.Count () > 0); //一致している物があるか | |
} | |
//================================================================================= | |
//作成 | |
//================================================================================= | |
//ビルドするシーンの更新 | |
[MenuItem("Tools/Update/Scenes In Build")] | |
private static void UpdateScenesInBuild(){ | |
//追加するシーンのリスト作成、追加 | |
List<EditorBuildSettingsScene> sceneList = new List<EditorBuildSettingsScene> (); | |
#if DEBUG_BUILD | |
sceneList.AddRange(GetSceneList(DEBUG_BUILD_DIRECTORY_PATH)); | |
#endif | |
sceneList.AddRange(GetSceneList(BUILD_DIRECTORY_PATH)); | |
//ビルドするシーンを設定 | |
EditorBuildSettings.scenes = sceneList.ToArray(); | |
Debug.Log("ビルドするシーンを更新"); | |
} | |
//指定したディレクトリに含まれるシーンのリストを取得する | |
private static List<EditorBuildSettingsScene> GetSceneList(string directoryPath){ | |
//Sceneファイルを全て取得、名前とパスで辞書作成 | |
List<string> pathList = new List<string>(); | |
string firstScenePath = ""; | |
foreach (var guid in AssetDatabase.FindAssets("t:Scene")) { | |
string path = AssetDatabase.GUIDToAssetPath (guid); | |
string sceneName = System.IO.Path.GetFileNameWithoutExtension (path); | |
//指定ディレクトリ以外に入っているシーンはスルー | |
if(!path.Contains(directoryPath)){ | |
continue; | |
} | |
//シーン名が被っている時はエラーを表示 | |
if (pathList.Contains (sceneName)) { | |
Debug.LogError (sceneName + " というシーン名が重複しています"); | |
} | |
//親ディレクトリがFirstならば最初のシーンに設定(するためにパスをfirstScenePathに入れる) | |
else if (System.IO.Path.GetFileName (System.IO.Path.GetDirectoryName (path)) == "First") { | |
//二つ以上入ってる場合はエラー | |
if(!string.IsNullOrEmpty(firstScenePath)){ | |
Debug.LogError ("Firstディレクトリに複数のシーンが入っています"); | |
} | |
firstScenePath = path; | |
} | |
//パスをリストに追加 | |
else{ | |
pathList.Add(path); | |
} | |
} | |
//追加するシーンのリスト作成、追加 | |
List<EditorBuildSettingsScene> sceneList = new List<EditorBuildSettingsScene> (); | |
if(!string.IsNullOrEmpty(firstScenePath)){ | |
sceneList.Add (new EditorBuildSettingsScene(firstScenePath, true)); | |
} | |
foreach (string path in pathList) { | |
sceneList.Add( new EditorBuildSettingsScene(path, true)); | |
} | |
return sceneList; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment