読者です 読者をやめる 読者になる 読者になる

テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

【Unity】プロジェクト内のScriptableObjectを見つける方法

ScriptableObject Unity エディタ拡張・エディタ機能 アセット・ファイル管理

エディタ拡張でエディタ機能を拡張している際、データを保存したくなる事が多々あります。そこでScriptableObjectが大活躍する(ハズ)なのですが、プロジェクト内の「特定のフォルダに格納」といった扱いは微妙にイケていない気がします。

凄く手っ取り早い方法はプロジェクト内にある全てのファイルに対して文字列検索をかけファイルを見つけ出す方法なのですが、もっとスマートな方法があったので紹介します。

プロジェクト内の検索

Unityにはプロジェクト内のアセットを検索する機能があります。例えば「t:sprite」と検索すれば、プロジェクト内のスプライトを全検索出来ます。

f:id:tsubaki_t1:20160308223203j:plain

型の他にもラベルや名称、指定のパス以下といった形で検索できるので、まぁソコソコ便利です。

tsubakit1.hateblo.jp

docs.unity3d.com

AssetDatabase.FindAssets

この機能ですが、スクリプトから動かすことが出来ます。AssetDatabase.FindAssetsがその機能で、ココで指定すると「特定のフォルダ以下」の「指定の検索条件」でプロジェクト内を検索することが出来ます。

ここで面白いのが、ScriptableObjectの場合は「t:ScriptableObjectの型名」でインスタンスが検索にヒットするという点です。(Prefabの場合、t:prefabもしくはt:GameObjectで取得する。つまり、プレハブの持ってる型はこんな感じでは取れない)

f:id:tsubaki_t1:20160308224445j:plain
別にAssetDatabase.FindAssetsが特別という訳ではなくプロジェクトウィンドウでも同様に見つかるのですが、とにかく「型名でインスタンスを見つけられる」という点から、「プロジェクト内の何処にあってもインスタンスを見つけられる」という機能に繋がります。

実際にやってみる

実際にやってみます。

ScriptableObjectを作る

まずはScriptableObjectを作り、インスタンスを作成します。以前は面倒なコードが必要な作業でしたが、今は大分楽に作れます。

gist.github.com

コンパイルが通れば、アセットのメニューにScriptableObjectの型と同じ項目が追加されるので、それを選択してインスタンスを作ります。

f:id:tsubaki_t1:20160308224919j:plain

インスタンスは適当な名前にし、適当なパスに置きます。

f:id:tsubaki_t1:20160308224955j:plain

プロジェクトウィンドウで見つけられる事を確認する

コードを書く前にプロジェクトウィンドウで作ったインスタンスを見つけられる事を確認します。

「t:MyScriptableObject」とプロジェクトウィンドウ上の検索バーに記入すると、先ほど作ったインスタンスが表示されます。

f:id:tsubaki_t1:20160308225347j:plain

「t:」を抜くと、コードが検索にヒットします。いとおかし

f:id:tsubaki_t1:20160308225409j:plain

ちなみに、クラスが継承している場合は継承元のクラスを入力すると継承先のインスタンスもヒットします。例えばScriptableObjectと検索してもヒットします。使えるのはクラスのみで、インターフェースは無理です。

f:id:tsubaki_t1:20160308225645j:plain

エディタ拡張にてScriptableObjectのインスタンスを見つけ出す

最後にScriptableObjectのインスタンスを見つけ出します。

AssetDatabase.FindAssetsはオブジェクトやパスではなくGUIDを返すので、実際にデータを取得するには以下のような変換が必要です。

  1. AssetDatabase.FindAssetsでGUIDを取得
  2. AssetDatabase.GUIDToAssetPathでGUIDからパスへ変換
  3.  AssetDatabase .LoadAssetAtPathにてオブジェクトを取得

処理の流れ的にはこんな感じです。メニュー>Assets>FindMyScriptableObjectを実行すれば、プロジェクト内にあるインスタンスを見つけてくれます。

gist.github.com

f:id:tsubaki_t1:20160308230605j:plain

関連

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp

qiita.com

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp