【Unity】ビルド時に特定のアセットを配置させる「AssetDatabase.MoveAsset」版

DEVELOP, Unity

Unity 2018 か 2019 あたりから Directory.Move を使わなくてもAssets 以下のファイル操作が可能になりました。AssetDatabase.MoveAsset を使えば わざわざ プロジェクトのディレクトリを取得してパスを連結する必要もなくなります。

サンプルコード

以下スクリプトをEditorフォルダへ放り込めばビルド前、後に走る様になります。Editor/Temporary フォルダは作成済みの状態で実行します。

using System;
using System.IO;
using UnityEditor;
using UnityEditor.Build;
using UnityEditor.Build.Reporting;
using UnityEngine;
  
namespace Editor
{
    /// <summary>
    /// ビルドプロセス
    /// </summary>
    public class ResourceBuildProcessor : IPreprocessBuildWithReport, IPostprocessBuildWithReport
    {
        //移動元のディレクトリパス
        private static string[] SRC_DIRECTORY_LIST =
        {
            "Assets/Resources/Movie",
        };
 
        // 移動先のディレクトリパス
        private static string[] DST_DIRECTORY_LIST =
        {
            "Assets/Editor/Temporary/Movie",
        };
        private static int DIRECTORY_NUM = SRC_DIRECTORY_LIST.Length;
 
        /// ビルド前処理
        public void OnPreprocessBuild(BuildReport _report)
        {
            for (int ii = 0; ii < DIRECTORY_NUM; ii++)
            {
                var srcPath = SRC_DIRECTORY_LIST[ii];
                var dstPath = DST_DIRECTORY_LIST[ii];
                // フォルダ移動。
                var result = AssetDatabase.MoveAsset(srcPath, dstPath);
                AssetDatabase.Refresh();
            }
        }
 
        /// ビルド後処理
        public void OnPostprocessBuild(BuildReport _report)
        {
            for (int ii = 0; ii < DIRECTORY_NUM; ii++)
            {
                var srcPath = DST_DIRECTORY_LIST[ii];
                var dstPath = SRC_DIRECTORY_LIST[ii];
 
                // フォルダ移動。
                AssetDatabase.MoveAsset(srcPath, dstPath);
                AssetDatabase.Refresh();
            }
        }
 
        ///  実行順
        public int callbackOrder { get { return 0; } }
    }
}

Posted by kazupon