1. Qiita
  2. 投稿
  3. Unity

Editor拡張 SceneInBuild内でActiveでないものを除外する メモ

  • 0
    いいね
  • 0
    コメント

    下記ページを参考に作成
    http://baba-s.hatenablog.com/entry/2015/04/10/101720

    追記:11月30日
     Jenkinsのバッチモードからだと正しく反映されなかったので書き直し

    ■Jenkinsからのバッチモード
     ビルド手順の追加で"「Invoke Unity3d Editor」"を選択
     「Unity3d installation name」にUnity
     「Editor command line argument」に
     -batchmode -executeMethod SceneInBuildRefresh.Refresh -nographics -projectPath "${WORKSPACE}/プロジェクト名" -quit を追加

    ■理由
     AssetBundle対応のため、Sceneファイルが削除されSceneInBuildが更新されていない
     そのため下記処理をいれた。

    ■やっている事
     1.Resources内のフォルダ削除された後のAssetDatabaseから
       Assets/Resourceフォルダにあるシーンをすべて引っ張ってくる

     2.EditorBuildSettingは更新されていないので
       EditorBuildSettingのシーンリストを取得する。

     3.EditorBuildSettingのシーンリストの順番を維持したまま
       AssetDatabaseから検索して、まだSceneInBuildに含める必要のあるシーンリストを再構築する。

    using UnityEditor;
    using UnityEngine;
    using System.Linq;
    using System.Collections.Generic;
    
    public static class SceneInBuildRefresh  {
    
        /// <summary>
        /// SceneInBuild内を再構成
        /// </summary>
        [MenuItem("Assets/SceneInBuildRefresh")]
        public static void Refresh()
        {
            AssetDatabase.Refresh();
            List<string> pathList = new List<string>();
    
            // AssetDatabaseを使用してAssets/Resources以下のシーンを列挙してリストを作成
            foreach (var guid in AssetDatabase.FindAssets("t:Scene"))
            {
                string path = AssetDatabase.GUIDToAssetPath(guid);
    
                if (path.Contains("Assets/Resources") == true)
                {
                    string sceneName = System.IO.Path.GetFileNameWithoutExtension(path);
                    Debug.Log("path=" + path);
                    pathList.Add(path);
                }
            }
    
            // 更新用シーンリスト
            List<EditorBuildSettingsScene> sceneList = new List<EditorBuildSettingsScene>();
    
            // Editor上のシーンリスト
            var editorSceneList = EditorBuildSettings.scenes.Select(scene => scene.path).ToList();
    
            // シーンは順番が関係するので現在シーンの羅列から検索
            foreach(var editorScene in editorSceneList)
            {
                if(pathList.Exists(sceneName => editorScene.Contains(sceneName) == true))
                {
                    Debug.Log("scenePath=" + editorScene);
                    sceneList.Add(new EditorBuildSettingsScene(editorScene, true));
                }
            }
    
            EditorBuildSettings.scenes = sceneList.ToArray();
    
            AssetDatabase.Refresh();
        }
    }