シーンを自動で「Scenes In Build」に追加・削除する方法

2020年11月20日
「Scenes In Buld」を自動で更新

この記事では、Unityでシーンを自動で「Scenes In Build」に追加・削除するエディタ拡張の作り方について説明します。

作り方

AssetPostprocessorクラスを継承する

AssetPostprocessorクラスを継承したクラスを作ります。

using UnityEditor;

public sealed class ScenePostprocessor : AssetPostprocessor 
{
}

定数を宣言する

関数の実装に必要な定数を宣言します。

private const string BUILD_DIRECTORY_PATH = "Assets/Scenes/Build";
private const string SCENE_FILE_EXTENSION = ".unity";

シーンを追加・削除する関数を定義する

ここで新たなusingディレクティブが必要となるため、下記のコードを一番上の行に追加します。

using System.Linq;
using System.Collections.Generic;

そして、シーンを追加・削除をする関数をそれぞれ定義します。

シーンを追加する関数

private static void AddScenes( 
    List<EditorBuildSettingsScene>  scene_list, 
    string[]                        imported_asset_paths, 
    string[]                        asset_paths_after_moving 
) {
    var adding_scenes = imported_asset_paths
        .Concat ( asset_paths_after_moving )
        .Where  ( asset_path        => asset_path.EndsWith( SCENE_FILE_EXTENSION ) )
        .Where  ( scene_file_path   => scene_file_path.StartsWith( BUILD_DIRECTORY_PATH ) )
        .Where  ( scene_file_path   => !scene_list.Any( scene => scene.path == scene_file_path ) )
        .Select ( scene_file_path   => new EditorBuildSettingsScene( scene_file_path, true ) )
    ;

    scene_list.AddRange( adding_scenes );
}

シーンを削除する関数

private static void RemoveScenes( 
    List<EditorBuildSettingsScene>  scene_list, 
    string[]                        deleted_asset_paths, 
    string[]                        asset_paths_after_moving
) {
    var moved_scene_files_out_of_build = asset_paths_after_moving
        .Where( asset_path      => asset_path.EndsWith( SCENE_FILE_EXTENSION ) )
        .Where( scene_file_path => !scene_file_path.StartsWith( BUILD_DIRECTORY_PATH ) )
    ;

    scene_list.RemoveAll( scene => deleted_asset_paths.Contains( scene.path ) );
    scene_list.RemoveAll( scene => moved_scene_files_out_of_build.Contains( scene.path ) );
}

OnPostprocessAllAssets関数を定義する

定義した関数を使用してOnPostprocessAllAssets関数を定義します。これでエディタ拡張のプログラムは完成です。

private static void OnPostprocessAllAssets(
    string[] imported_asset_paths, 
    string[] deleted_asset_paths, 
    string[] asset_paths_after_moving, 
    string[] asset_paths_before_moving 
) {
    var scene_list = EditorBuildSettings.scenes.ToList();

    AddScenes   ( scene_list, imported_asset_paths  , asset_paths_after_moving );
    RemoveScenes( scene_list, deleted_asset_paths   , asset_paths_after_moving );

    EditorBuildSettings.scenes = scene_list.ToArray();
}

使い方

「Scenes In Buld」を自動で更新

上記のプログラムを作成した後に「Assets/Scenes/Build」( フォルダ )内でシーンを作成するか、そのフォルダ内にシーンを移動すると、「Scenes in Build」へシーンが追加されます。

また、「Assets/Scenes/Build」内のシーンを削除する、あるいはそのフォルダ外へシーンを移動すると、「Scenes in Build」からシーンが削除されます。

完成したプログラム

参考ページ