【Unity】AnimationClipのMissingなパスを見つけて解決しやすくするエディタ拡張
昨日の応用で、アニメーションするオブジェクトでmissingになっているパスを発見し置換するエディタ拡張を作ってみました。
missingなAnimationClip
階層のあるアニメーションを作成した後、アニメーションを設定したオブジェクト名を変更すると、アニメーションの項目にmissingと表示され、アニメーションが正常に動作しなくなります。
例えば、Canvas/Image/Textという構造のアニメーションがあったとします。
それぞれのオブジェクトにはアニメーションが割り当てられており、CanvasはキャンバスのON/OFF、Image(背景)は半透明化、Labelは文字のIN/OUTのアニメーションが設定されています。
さて、Typoかリファクタリングの目的で、このアニメーションのCanvas/Image/LabelをCanvas/Background/Labelに変更してみます。
すると、Image以下のアニメーションへのパスがmissingとなり、Image以下のアニメーションが再生されなくなります。
さらに言えばエラーは特に表示されません。動かない場合、AnimationWindowにてAnimatorに登録されているアニメーションで動かなかったものを片っ端から確認する必要があります。*1
一応、Avaterを持つアニメーションの場合、Avaterが持つパスと一致しなかった場合warningを出してくれたと思いますが、残念ながら手付けでアニメーションを行って居た場合、オブジェクト名を変更するとこうなります。
なお、このパスによるmissingはルートオブジェクトには発生しません。コンポーネントさえ一致してれば、問題無く動作します。
missingなアニメーションを見つける
missingなアニメーションを見つける方法ですが、昨日の記事でGetCurveBindingsで確認する事が出来ます。つまり、
- GetCurveBindingsでアニメーションの持つパスを全て取得する
- Animatorが持つパスとBindingを比較する
- Bindingとパスが一致しない場合、missingになっている
という事です。この条件でAnimatorに登録されているAnimationClipのBindingをどんどん漁っていきます。
パスの比較はtransform.Findを使います。これならば、子オブジェクトしか見ないので一致するパスを別の親が持っていても誤検知する事はありません。
またGameObjectが非アクティブな場合も取得できる点、プレハブの階層でもを確認出来るので、中々に優秀です。
missingなパスを置換する
missingなパスを見つけたら、それを修正します。
やり方は文字列置換的にパスを直すアプローチにしました。色々と考えましたが、良いGUIなアイディアが浮かばなかったので。
例えばRoot/Image/TextがRoot/Background/Textに変化しているのであれば、Image/TextをBackground/Labelに直してやれば良いって感じです。
導入とソースコード
Editorフォルダを作成して、下のコードを配置します。
使い方
- メニュー/Assets/ReplaceAnimatorMissingPathを選択します。
- animatorにAnimatorコンポーネントの付いたオブジェクトを登録します
- missingになってるパス一覧が表示されるので、それと実際のパスを比較しながら間違っているパスの間違ってる部分を置換するようにreplace pathに記述します。パスの比較は目視で。
- Applyを押すとパスが更新されます。
感想
実際は、Hierarchyが変化したらパスを追従するとか、プロジェクト内のプレハブ・シーンに設定されたAnimatorを片っ端からチェックするってエディタ拡張を作った方が有用かも。
関連
*1:これが一番問題だと思う