Kuwapp's Blog

Android と Flutter やってます

【Unity】AssetDatabaseでアセットを操る!

AssetDatabaseとは

AssetDatabaseはプロジェクトのアセットにアクセスできる API です。アセットを見つけてロードするメソッドがあり、さらにアセットを作成、削除、修正できるメソッド等々があります。
〜略〜
Unity はアセットファイルのメタデータを保持するため、絶対にファイルシステムを使用して作成、移動、削除をするべきではありません。

http://docs-jp.unity3d.com/Documentation/Manual/AssetDatabase.html

アセットフォルダのファイルをスクリプトから読み込んだり、削除したりできるようです。
エディタ拡張でアセットを読み込んでシーンに配置とか、特定のアセットを一括で削除したりとかいろいろできそう。
C#でFileクラス使っても良いんでないの?と思っていましたが、単純にファイル移動してもメタデータは移動しないから問題あるんですね。

Assetの読み込み

Texture2D texture = AssetDatabase.LoadAssetAtPath("Assets/Texture.png", typeof(Texture2D)) as Texture2D;
TextAsset text = AssetDatabase.LoadAssetAtPath("Assets/Text.asset", typeof(TextAsset)) as TextAsset;

LoadAssetAtPathを使用します。
上記はテクスチャとテキストアセットを読み込む例
以下の2点に注意が必要です。
・Resrouces.Loadと違ってファイルの拡張子までつける
・パスはAssetsから指定する

Assetの作成

Material material = new Material (Shader.Find("Specular"));
AssetDatabase.CreateAsset(material, "Assets/MyMaterial.mat");
AssetDatabase.Refresh();

CreateAssetを使用します。
アセットを作成してもRefreshしないと反映されないか、反映に時間がかかるので注意

Assetの削除

//ゴミ箱へ移動
AssetDatabase.MoveAssetToTrash("Assets/material.mat");
//完全に削除
AssetDatabase.DeleteAsset("Assets/material.mat");

MoveAssetToTrashとDeleteAssetはどちらもAssetフォルダ内からは削除しますが
前者はゴミ箱に残るのに対し後者はゴミ箱にも残らず削除されます。

Assetのファイル名変更

AssetDatabase.RenameAsset("Assets/text.asset", "MyText");

RenameAssetを使用します。
2つめの引数はパスではなく拡張子を除いたファイル名です。
拡張子も変更できると勘違いして2番目の引数に拡張子を含めて3時間はまりました泣

Assetの変更時の注意

ScriptableObject myAsset = AssetDatabase.LoadAssetAtPath ("Assets/myasset.asset", typeof(ScriptableObject)) as ScriptableObject;
//scriptableObjectに変更を加える

例えば上記のようにScriptableObjectを取得し
データを書き換えるなど手を加えることがあると思います。
が、このコードだけだと多分実行時に行った処理は消えます。

ScriptableObject myAsset = AssetDatabase.LoadAssetAtPath ("Assets/myasset.asset", typeof(ScriptableObject)) as ScriptableObject;
//scriptableObjectにテクスチャを貼ったり変更を加える
EditorUtility.SetDirty (myAsset);

変更後はEditorUtility.SetDirtyを呼ぶ必要があります。
非常にはまりました。


他にもいろいろ機能はありますが、リファレンスで確認できます。

Unity - Scripting API: AssetDatabase