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. 使用場面
- エディタ拡張ツール
- カスタムウィンドウやメニューからプロジェクト内のアセットを操作
- 例:大量のマテリアルに一括でシェーダーを適用するバッチ
- カスタムインスペクタ
- インスペクタ上で別アセットを参照・編集できる UI を実装
- ビルド前処理/後処理
- ビルド設定に応じたアセット移動や最適化処理
- 自動テスト・バリデーション
- アセット構造の整合性チェックや基準外ファイルの検出
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
- メニューから起動
- Unity 上部メニューの Tools > Optimize Textures を選択。
- 選択すると、スクリプト内のバッチ処理が実行されます。
- 動作内容の確認
- Assets/Textures フォルダ内の全テクスチャを列挙し、インポート設定を Compressed に変更して再インポート。
- 実行後、コンソールに次のように出力されたら正常に動作しています
Processed XX textures.
- カスタマイズ例
// 例:
Assets/Textures → Assets/MyDirectory
string[] guids = AssetDatabase.FindAssets("t:Texture2D", new[] { "Assets/MyDirectory" });
- 他アセットへの適用
- マテリアル処理なら “t:Material"、プレハブ処理なら “t:Prefab" に変更。
- 追加処理の挟み込み
- ループ内に任意の処理(例:サイズチェック、ログ出力など)を追記可能。
6. 実行時の代替手段
手法 | 利用シーン | 主な API |
---|---|---|
Resources フォルダ | 小規模・簡易ロード | Resources.Load<T>(path) |
Addressables | 柔軟な動的配信・依存管理 | Addressables.LoadAssetAsync<T>(address) |
AssetBundle | 大規模コンテンツ配信 | AssetBundle.LoadFromFile(path) / LoadAsset<T>() |
7. ベストプラクティス
- エディタ専用コードは分離
Editor
フォルダに配置し、ビルド時に自動除外。
- 大量処理時はプログレス表示
EditorUtility.DisplayProgressBar
/ClearProgressBar
でユーザーにフィードバック。
- エラー・例外処理
- ファイルパスが誤っている場合のログ出力や、復旧処理を実装。
- 最小限のアセット変更に留める
- 不要なインポートや再インポートを避け、編集時間を短縮。
8. まとめ
- AssetDatabase はエディタ拡張において強力かつ必須の機能を提供。
- 開発効率を向上させる一方、実行環境では使用不可 という制限を正しく理解することが重要。
- 実行時には Resources/Addressables/AssetBundle など、用途に応じた仕組みを使い分けましょう。
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. ウィンドウを開く
- Unity エディタ上部メニューからWindow > Asset Browser を選択。
- 「Asset Browser」ウィンドウが表示される。
2. フォルダパスの指定とリフレッシュ
- ウィンドウ上部の “Folder Path” テキストフィールドに、検索対象フォルダのパスを入力。
- 例:Assets/Textures
- 右側の Refresh ボタンをクリック。
- 指定フォルダ内の Texture2D アセットを再取得し、下段リストに表示します。
3. アセット一覧の操作
- スクロール領域 にテクスチャ名のボタンがリストアップされます。
- 名前をクリックすると、そのテクスチャが selectedAsset に設定されます。
- 大量にある場合は、スクロールバーやキーボードの PageUp/PageDown で一覧を移動可能。
4. プレビュー表示
- 左ペインで名前をクリック後、下部の “Preview:” セクションに切り替わります。
- ObjectField に選択中のテクスチャが表示され、実際の見え方を確認できます。
- 別のテクスチャを選ぶと、プレビューもリアルタイムに更新。
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 描画
- フォルダパスの入力フィールドとリフレッシュボタン
BeginScrollView
でアセット名リストを表示- ボタン押下で
selectedAsset
を更新 ObjectField
でプレビュー表示
- AssetDatabase API の活用
FindAssets
→ GUID 配列取得GUIDToAssetPath
→ パス変換LoadAssetAtPath
→ 型指定でアセット取得
ディスカッション
コメント一覧
まだ、コメントがありません