【Unity】プロジェクト内のScriptableObjectを見つける方法
エディタ拡張でエディタ機能を拡張している際、データを保存したくなる事が多々あります。そこでScriptableObjectが大活躍する(ハズ)なのですが、プロジェクト内の「特定のフォルダに格納」といった扱いは微妙にイケていない気がします。
凄く手っ取り早い方法はプロジェクト内にある全てのファイルに対して文字列検索をかけファイルを見つけ出す方法なのですが、もっとスマートな方法があったので紹介します。
プロジェクト内の検索
Unityにはプロジェクト内のアセットを検索する機能があります。例えば「t:sprite」と検索すれば、プロジェクト内のスプライトを全検索出来ます。
型の他にもラベルや名称、指定のパス以下といった形で検索できるので、まぁソコソコ便利です。
AssetDatabase.FindAssets
この機能ですが、スクリプトから動かすことが出来ます。AssetDatabase.FindAssetsがその機能で、ココで指定すると「特定のフォルダ以下」の「指定の検索条件」でプロジェクト内を検索することが出来ます。
ここで面白いのが、ScriptableObjectの場合は「t:ScriptableObjectの型名」でインスタンスが検索にヒットするという点です。(Prefabの場合、t:prefabもしくはt:GameObjectで取得する。つまり、プレハブの持ってる型はこんな感じでは取れない)
別にAssetDatabase.FindAssetsが特別という訳ではなくプロジェクトウィンドウでも同様に見つかるのですが、とにかく「型名でインスタンスを見つけられる」という点から、「プロジェクト内の何処にあってもインスタンスを見つけられる」という機能に繋がります。
実際にやってみる
実際にやってみます。
ScriptableObjectを作る
まずはScriptableObjectを作り、インスタンスを作成します。以前は面倒なコードが必要な作業でしたが、今は大分楽に作れます。
コンパイルが通れば、アセットのメニューにScriptableObjectの型と同じ項目が追加されるので、それを選択してインスタンスを作ります。
インスタンスは適当な名前にし、適当なパスに置きます。
プロジェクトウィンドウで見つけられる事を確認する
コードを書く前にプロジェクトウィンドウで作ったインスタンスを見つけられる事を確認します。
「t:MyScriptableObject」とプロジェクトウィンドウ上の検索バーに記入すると、先ほど作ったインスタンスが表示されます。
「t:」を抜くと、コードが検索にヒットします。いとおかし
ちなみに、クラスが継承している場合は継承元のクラスを入力すると継承先のインスタンスもヒットします。例えばScriptableObjectと検索してもヒットします。使えるのはクラスのみで、インターフェースは無理です。
エディタ拡張にてScriptableObjectのインスタンスを見つけ出す
最後にScriptableObjectのインスタンスを見つけ出します。
AssetDatabase.FindAssetsはオブジェクトやパスではなくGUIDを返すので、実際にデータを取得するには以下のような変換が必要です。
- AssetDatabase.FindAssetsでGUIDを取得
- AssetDatabase.GUIDToAssetPathでGUIDからパスへ変換
- AssetDatabase .LoadAssetAtPathにてオブジェクトを取得
処理の流れ的にはこんな感じです。メニュー>Assets>FindMyScriptableObjectを実行すれば、プロジェクト内にあるインスタンスを見つけてくれます。