Skip to content

Instantly share code, notes, and snippets.

@kankikuchi
Created June 17, 2017 21:08
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/8f21de0479f12ded2dbdd94d9c2c96a6 to your computer and use it in GitHub Desktop.
Save kankikuchi/8f21de0479f12ded2dbdd94d9c2c96a6 to your computer and use it in GitHub Desktop.
ビルド直前にシーンを自動で設定をしようとしてみた【Unity】【エディタ拡張】2
// 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