アセットをスクリプトから作る
1 2 3 4 5 6 7 8 9 10 11 12 |
public override void OnInspectorGUI() { if (GUILayout.Button("createAsset")) { string path = AssetDatabase.CreateFolder("Assets", "myAsset"); AssetDatabase.CreateAsset( CreateInstance<TargetClass>() , AssetDatabase.GUIDToAssetPath(path)+"/"+"filename.asset"); AssetDatabase.Refresh(); } } |
GUILayout.Buttonは押されたときにtrueを返します。
Assetのフォルダやファイルを作るときはAssetDatabaseクラスを使います。
Asset自体をインスタンス化するときは、CreateInstanceを使います。コンストラクタを使ってnew TargetClass()とかはしない。というかUnityにかかわらず、開発環境では、開発環境用のオブジェクト(MonoBehaiviourとか)をインスタンス化するときは専用のクラスを使うもの?
AssetDatacase.CreateAssetで2番目の引数にファイル名まで含めたパスを入力。
ファイル名の拡張子は.assetにする。
作ったら、AssetDatabase.Refresh()を呼び出したほうがよさそう。
例を参考にすれば、大体うまくいくと思いますが。例をそのままにするとボタンを押すたびにフォルダが作られることになってしまうので、CreateFolderはいらない。
ちなみに、
選択中のアセットまでのファイルパスを取得する。
string path = AssetDatabase.GUIDToAssetPath(Selection.assetGUIDs[0]);
Selection.asseetGUIDsは複数選択されていた時に、全部のオブジェクトのGUIDを返すもの、だと思ってます。検証してませんけど。
ディレクトリを作るー同じ名前があったら、ファイル名の後に+1された数字がついた新しいディレクトリが作られる。
ファイルを作るー同じ名前があったら、上書きされる。
失敗したこと:
C# のSystemライブラリ(ライブラリっていうんだっけ? アセンブリ? ASP?)のDirectoryクラスを使ってしまったこと。ディレクトリを作れたけど、ディレクトリ名が被ったときの処理とかが面倒だった。
AssetDatabase.CreateFolderの存在に気づかなかった。
エディタ拡張をしてアセットをスクリプトから作るときはこんな感じでできます。
最後にserializedObject.ApplyModifiedProperties()も忘れないほうがいいと思います。
基本はこんな感じだと思います。
- EditorGUILayout.PropertyFieldでインスペクタ―の入力エリアを簡単につくれる。
- GUILayoutとか使えばいい感じにできる。
- AssetDatabaseを使ってアセットを作ったりフォルダを作ったり。
というか、自分でエディタ拡張したときに気づかなかったけど、色々もっと簡単にできた。この記事書くときに色んなサイト見てたら発見してしまった。本当に遠回りした気分。
上のリンク先からの引用:「このようなケースはほとんどなく、どうしても必要な場合を除いては、このコマンドを使用すべきではありません。」
色んなリファレンスにこういう文言がある気がするけど、ちゃんと忠告を聞いて、ほかに手段がないか探すべきだったかなぁ、なんて思ったりもしました。
自分で考えすぎてもいけないのかも、なんて思ったり。考えずにググるべきですか。
次は、スクリプトからアセットを作ったときに、そのアセットにデータをセットしたり。これが、やっぱりややこしいような。