使う人はよく使うであろうAnimationClip。 プロダクトを作りこんでいくとGameObject階層に変更が入りAnimationClipの参照が外れ、
このようにMissing!
という表示に焦り、色々試行錯誤するも、最終的に、、、
っていう感じになった経験が何度かあります。
最悪作り直し....
今までお前に費やしてきた時間を返してくれという絶望感に襲われます。
過去の過ちを繰り返さないために
以下の作業を実行するとAnimationClip内のアニメーション対象参照が外れて
しまいます。
AnimatorがAddComponentされたGameObject配下の階層構造を変更する
AnimatorがAddComponentされたGameObject配下のGameObject名を変更する
Animationブラウザで直接GameObjectの参照名を変更する
一つ一つ説明していきます。
図のようなGameObject構成で、
このような感じでRoot
にAnimatorをAddComponentし、アニメーションをさせています。
AnimatorにはAnimationClipTestAnimation.anim
を1つだけセットしています。
1. AnimatorがAddComponentされたGameObject配下の階層構造を変更する
このようにGrandSon
をChild
の子階層に移動すると、、、
このようにGrandSon
がMissing!
になりアニメーションできなくなります。
Q.階層を元に戻せば直るんでしょ?
A.はい、直ります。
Tips : 階層を戻さずに直す方法
TestAnimation.anim
をテキストエディタで開きます。
~~~~~~~ 略 ~~~~~~~ m_PostInfinity: 2 m_RotationOrder: 4 attribute: m_LocalPosition.z path: Parent/Child/GrandSon classID: 4 script: {fileID: 0} ~~~~~~~ 略 ~~~~~~~
すると、このように怪しいpath
というプロパティが現れます。
本来はParent/Child/GrandChild/GrandSon
というパスじゃないといけない所が、Parent/Child/GrandSon
となっています。
この部分を直接Parent/Child/GrandSon
に直して保存すればTestAnimation.animは正常にアニメーションするようになります。
注意) Unity外での編集はファイル破損を招く可能性があるため、Unityを閉じてからが安全とのことです。
2. AnimatorがAddComponentされたGameObject配下のGameObject名を変更する
図のようにGameObjectChild
をChildren
に変更してみます。すると、、、
はい、Missing!
Q.名前を元に戻せば直るんでしょ?
A.はい、直ります。
3. Animationブラウザで直接GameObjectの参照名を変更する
Animationブラウザの各アニメーションターゲットにカーソルを合わせて、Enterキー
を押下すると、名前を編集できます。ここでChild
をChildren
にしてみます。すると、、、
はい、予想通りMissing!
Q.名前を元に戻せば直るんでしょ?
A.はい、直りません。
まず、気づいて欲しいのが、なぜかChildren
の階層が一段階下がっています。
名前をChild
に戻してみます。
さらに階層が深くなります。正直なぜこうなるのか怖いです。
困ったときは直接TestAnimation.anim
をテキストエディタで開きます。
m_PostInfinity: 2 m_RotationOrder: 4 attribute: m_LocalPosition.x path: Parent///Child classID: 4 script: {fileID: 0}
すると、怪しげなpathが見つかります。
Parent///Child
???
この/(スラッシュ)
が名前を変更する度に追加されているようです。
これも先ほどと同じくParent/Child
に書き換えれば直ります。
ここから本題
本記事のタイトルにもあるように少し
リカバリーしてみるEditor拡張を書いてみました。
このようなカスタムウィンドウに、チェックしたいAnimationClip
と、AnimatorをAddComponentするTransformをセットし、Checkボタンを押下します。
すると、Transform階層と差異のあるパスが出力されます。
これらを直接入直しなおし、Recoverボタンを押下します。
全て終えたら、再度Checkボタンを押下します。
図のようにAnimationClip is ALL GREEN
と出力されれば正常なAnimationClipに戻ったことになります。
以下ソース
アニメーションターゲット数が多くなると、1つ1つ手入力するのが面倒くさいので、GameObject名サジェスト機能、一括置き換え機能など追加しても良いかもしれません。