Unityエディタ専用API「AssetDatabase」解説資料


1. 概要

  • AssetDatabase は UnityEditor 名前空間に属する、エディタ上でアセット管理を行うための API 群です。
  • シーンやビルドには含まれず、開発時のエディタ拡張や バッチ処理 に限定して利用可能。
  • 主に「プロジェクトウィンドウにあるアセット」をパス指定で読み書き・インポート・削除・移動・再インポートする機能を提供。

2. 主な機能と代表的メソッド

機能カテゴリメソッド例説明
アセット読み込みLoadAssetAtPath<T>(string path)指定パスのアセットを指定型で取得
アセット作成・登録CreateAsset(Object asset, string path)新規アセットファイルをプロジェクトに作成
アセット削除DeleteAsset(string path)プロジェクトからアセットを削除(メタファイルも同時に)
アセット移動MoveAsset(string oldPath, string newPath)アセットのファイルパスを変更
再インポート・更新ImportAsset(string path)指定アセットを再インポート
ラベル操作SetLabels(Object asset, string[] labels)GetLabels(Object asset)アセットに対するラベルの設定・取得
パス・GUID 取得・検索GUIDFromAssetPath(string path)AssetPathToGUID(string path)FindAssets(string filter, string[] searchInFolders)GUID ⇔ パス変換、条件に応じたアセット検索

3. 使用場面

  1. エディタ拡張ツール
    • カスタムウィンドウやメニューからプロジェクト内のアセットを操作
    • 例:大量のマテリアルに一括でシェーダーを適用するバッチ
  2. カスタムインスペクタ
    • インスペクタ上で別アセットを参照・編集できる UI を実装
  3. ビルド前処理/後処理
    • ビルド設定に応じたアセット移動や最適化処理
  4. 自動テスト・バリデーション
    • アセット構造の整合性チェックや基準外ファイルの検出

4. 利用時の制限事項

  • 実行環境
    • エディタ(非 Play モード) のみ使用可能。
    • Play モード中は一部操作が制限される(例:再インポート不可など)。
    • ビルド済みアプリでは全く使えない。
  • 名前空間
    • UnityEditor が含まれるため、必ず #if UNITY_EDITOR ガードを付与し、ビルド時に除外。
  • パフォーマンス
    • 大量のアセット操作はエディタの応答性に影響を与えるため、適度に遅延やユーザー確認ダイアログを挟む。

5. 基本的な使用例

#if UNITY_EDITOR
using UnityEditor;
using UnityEngine;

public static class AssetDatabaseSample
{
    [MenuItem("Tools/Optimize Textures")]
    public static void OptimizeTextures()
    {
        // プロジェクト内のすべてのテクスチャを検索
        string[] guids = AssetDatabase.FindAssets("t:Texture2D", new[] { "Assets/Textures" });
        foreach (var guid in guids)
        {
            string path = AssetDatabase.GUIDToAssetPath(guid);
            Texture2D tex = AssetDatabase.LoadAssetAtPath<Texture2D>(path);
            if (tex != null)
            {
                // 例:インポート設定の変更
                var importer = AssetImporter.GetAtPath(path) as TextureImporter;
                importer.textureCompression = TextureImporterCompression.Compressed;
                importer.SaveAndReimport();
            }
        }
        Debug.Log($"Processed {guids.Length} textures.");
    }
}
#endif
  1. メニューから起動
    • Unity 上部メニューの Tools > Optimize Textures を選択。
    • 選択すると、スクリプト内のバッチ処理が実行されます。
  2. 動作内容の確認
    • Assets/Textures フォルダ内の全テクスチャを列挙し、インポート設定を Compressed に変更して再インポート。
    • 実行後、コンソールに次のように出力されたら正常に動作しています
Processed XX textures.
  1. カスタマイズ例
// 例: 
Assets/Textures → Assets/MyDirectory
string[] guids = AssetDatabase.FindAssets("t:Texture2D", new[] { "Assets/MyDirectory" });
  1. 他アセットへの適用
    • マテリアル処理なら “t:Material"、プレハブ処理なら “t:Prefab" に変更。
  2. 追加処理の挟み込み
    • ループ内に任意の処理(例:サイズチェック、ログ出力など)を追記可能。

6. 実行時の代替手段

手法利用シーン主な API
Resources フォルダ小規模・簡易ロードResources.Load<T>(path)
Addressables柔軟な動的配信・依存管理Addressables.LoadAssetAsync<T>(address)
AssetBundle大規模コンテンツ配信AssetBundle.LoadFromFile(path) / LoadAsset<T>()

7. ベストプラクティス

  1. エディタ専用コードは分離
    • Editor フォルダに配置し、ビルド時に自動除外。
  2. 大量処理時はプログレス表示
    • EditorUtility.DisplayProgressBar / ClearProgressBar でユーザーにフィードバック。
  3. エラー・例外処理
    • ファイルパスが誤っている場合のログ出力や、復旧処理を実装。
  4. 最小限のアセット変更に留める
    • 不要なインポートや再インポートを避け、編集時間を短縮。

8. まとめ

  • AssetDatabase はエディタ拡張において強力かつ必須の機能を提供。
  • 開発効率を向上させる一方、実行環境では使用不可 という制限を正しく理解することが重要。
  • 実行時には ResourcesAddressablesAssetBundle など、用途に応じた仕組みを使い分けましょう。

9. UI を伴うエディタ拡張サンプルの実装・解説

タイトル: アセットブラウザ EditorWindow

概要: 指定フォルダ内のテクスチャ一覧を表示し、選択したアセットをプレビュー表示する EditorWindow を作成します。AssetDatabase API を利用し、動的にアセットを取得・表示します。

#if UNITY_EDITOR
using UnityEditor;
using UnityEngine;
using System.Collections.Generic;

public class AssetBrowserWindow : EditorWindow
{
    private string searchFolder = "Assets/Textures";
    private Vector2 scrollPos;
    private List<Texture2D> assets = new List<Texture2D>();
    private Texture2D selectedAsset;

    [MenuItem("Window/Asset Browser")]
    public static void ShowWindow()
    {
        GetWindow<AssetBrowserWindow>("Asset Browser");
    }

    private void OnEnable()
    {
        RefreshAssets();
    }

    private void OnGUI()
    {
        EditorGUILayout.LabelField("Asset Browser", EditorStyles.boldLabel);

        // フォルダパス入力とリフレッシュ
        EditorGUILayout.BeginHorizontal();
        searchFolder = EditorGUILayout.TextField("Folder Path", searchFolder);
        if (GUILayout.Button("Refresh", GUILayout.Width(70)))
            RefreshAssets();
        EditorGUILayout.EndHorizontal();

        // アセット一覧
        scrollPos = EditorGUILayout.BeginScrollView(scrollPos, GUILayout.Height(200));
        foreach (var tex in assets)
        {
            if (GUILayout.Button(tex.name, GUILayout.Height(20)))
                selectedAsset = tex;
        }
        EditorGUILayout.EndScrollView();

        // 選択プレビュー
        GUILayout.Space(10);
        if (selectedAsset != null)
        {
            EditorGUILayout.LabelField("Preview:", EditorStyles.boldLabel);
            EditorGUILayout.ObjectField(selectedAsset, typeof(Texture2D), false, GUILayout.Height(100));
        }
    }

    private void RefreshAssets()
    {
        assets.Clear();
        // 指定フォルダ内のGUIDを取得
        string[] guids = AssetDatabase.FindAssets("t:Texture2D", new[] { searchFolder });
        foreach (var guid in guids)
        {
            string path = AssetDatabase.GUIDToAssetPath(guid);
            var tex = AssetDatabase.LoadAssetAtPath<Texture2D>(path);
            if (tex != null)
                assets.Add(tex);
        }
    }
}
#endif

以下の手順で AssetBrowserWindow を使い、プロジェクト内テクスチャを一覧・プレビューできます。


1. ウィンドウを開く

  1. Unity エディタ上部メニューからWindow > Asset Browser を選択。
  2. 「Asset Browser」ウィンドウが表示される。

2. フォルダパスの指定とリフレッシュ

  1. ウィンドウ上部の “Folder Path” テキストフィールドに、検索対象フォルダのパスを入力。
    • 例:Assets/Textures
  2. 右側の Refresh ボタンをクリック。
    • 指定フォルダ内の Texture2D アセットを再取得し、下段リストに表示します。

3. アセット一覧の操作

  • スクロール領域 にテクスチャ名のボタンがリストアップされます。
  • 名前をクリックすると、そのテクスチャが selectedAsset に設定されます。
  • 大量にある場合は、スクロールバーやキーボードの PageUp/PageDown で一覧を移動可能。

4. プレビュー表示

  1. 左ペインで名前をクリック後、下部の “Preview:” セクションに切り替わります。
  2. ObjectField に選択中のテクスチャが表示され、実際の見え方を確認できます。
  3. 別のテクスチャを選ぶと、プレビューもリアルタイムに更新。

5. 応用ポイント

  • フォルダ変更
    • テキストフィールドのパスを変え、別フォルダ(例:Assets/Textures/Wood)内だけを対象にする。
  • フィルタ拡張
    • スクリプトを改造し、FindAssets(“t:Texture2D filterName", …) の第1引数にキーワードを追加。
  • ドラッグ&ドロップ対応
    • OnGUI 内で DragAndDrop API を使い、フォルダパスにファイルをドロップして自動設定することも可能。
  • 他アセット対応
    • t:Prefab や t:ScriptableObject に変更すれば、ほかの型のアセット一覧ウィンドウに応用できます。

6. トラブルシューティング

  • 何も表示されない
    • パスが誤っている可能性。大文字小文字やスペースを再確認してください。
  • Play モードで動かない
    • AssetDatabase はエディタ専用のため、Play モード中は更新が反映されない場合があります。
  • エラーが出る
    • スクリプトは必ず #if UNITY_EDITOR … #endif で囲んでエディタビルドから除外してください。

解説

  • EditorWindow の作成
    • EditorWindow を継承し、[MenuItem] でメニュー登録。
  • OnEnable で初期化
    • ウィンドウ有効化時に RefreshAssets() を呼び出し、一覧を取得。
  • OnGUI で UI 描画
    1. フォルダパスの入力フィールドとリフレッシュボタン
    2. BeginScrollView でアセット名リストを表示
    3. ボタン押下で selectedAsset を更新
    4. ObjectField でプレビュー表示
  • AssetDatabase API の活用
    • FindAssets → GUID 配列取得
    • GUIDToAssetPath → パス変換
    • LoadAssetAtPath → 型指定でアセット取得

Unity

Posted by hidepon