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

テラシュールブログ

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

【Unity】AnimationClipのMissingなパスを見つけて解決しやすくするエディタ拡張

f:id:tsubaki_t1:20160126003924j:plain

昨日の応用で、アニメーションするオブジェクトでmissingになっているパスを発見し置換するエディタ拡張を作ってみました。

missingなAnimationClip

階層のあるアニメーションを作成した後、アニメーションを設定したオブジェクト名を変更すると、アニメーションの項目にmissingと表示され、アニメーションが正常に動作しなくなります。

例えば、Canvas/Image/Textという構造のアニメーションがあったとします。
それぞれのオブジェクトにはアニメーションが割り当てられており、CanvasはキャンバスのON/OFF、Image(背景)は半透明化、Labelは文字のIN/OUTのアニメーションが設定されています。

f:id:tsubaki_t1:20160126004456j:plain

さて、Typoリファクタリングの目的で、このアニメーションのCanvas/Image/LabelをCanvas/Background/Labelに変更してみます。

すると、Image以下のアニメーションへのパスがmissingとなり、Image以下のアニメーションが再生されなくなります

f:id:tsubaki_t1:20160126013424g:plain

さらに言えばエラーは特に表示されません。動かない場合、AnimationWindowにてAnimatorに登録されているアニメーションで動かなかったものを片っ端から確認する必要があります。*1

一応、Avaterを持つアニメーションの場合、Avaterが持つパスと一致しなかった場合warningを出してくれたと思いますが、残念ながら手付けでアニメーションを行って居た場合、オブジェクト名を変更するとこうなります。

なお、このパスによるmissingはルートオブジェクトには発生しませんコンポーネントさえ一致してれば、問題無く動作します。

missingなアニメーションを見つける

missingなアニメーションを見つける方法ですが、昨日の記事でGetCurveBindingsで確認する事が出来ます。つまり、

  • GetCurveBindingsでアニメーションの持つパスを全て取得する
  • Animatorが持つパスとBindingを比較する
  • Bindingとパスが一致しない場合、missingになっている

という事です。この条件でAnimatorに登録されているAnimationClipのBindingをどんどん漁っていきます。

f:id:tsubaki_t1:20160126005832j:plain

パスの比較はtransform.Findを使います。これならば、子オブジェクトしか見ないので一致するパスを別の親が持っていても誤検知する事はありません。
またGameObjectが非アクティブな場合も取得できる点、プレハブの階層でもを確認出来るので、中々に優秀です。

f:id:tsubaki_t1:20160126005519j:plain

missingなパスを置換する

missingなパスを見つけたら、それを修正します。
やり方は文字列置換的にパスを直すアプローチにしました。色々と考えましたが、良いGUIなアイディアが浮かばなかったので。
例えばRoot/Image/TextがRoot/Background/Textに変化しているのであれば、Image/TextをBackground/Labelに直してやれば良いって感じです。

f:id:tsubaki_t1:20160126010809j:plain

導入とソースコード

Editorフォルダを作成して、下のコードを配置します。

gist.github.com

f:id:tsubaki_t1:20160126011156j:plain

使い方

  1. メニュー/Assets/ReplaceAnimatorMissingPathを選択します。
  2. animatorにAnimatorコンポーネントの付いたオブジェクトを登録します
  3. missingになってるパス一覧が表示されるので、それと実際のパスを比較しながら間違っているパスの間違ってる部分を置換するようにreplace pathに記述します。パスの比較は目視で。
  4. Applyを押すとパスが更新されます。

f:id:tsubaki_t1:20160126013738g:plain

感想

実際は、Hierarchyが変化したらパスを追従するとか、プロジェクト内のプレハブ・シーンに設定されたAnimatorを片っ端からチェックするってエディタ拡張を作った方が有用かも。

関連

tsubakit1.hateblo.jp

 
 

*1:これが一番問題だと思う