渋谷ほととぎす通信

完全趣味でやってるUnityメモ。説明できないところを説明できるようにするための個人ブログ。昨日の自分より少しでも大きくなれるように。。。 ※所属団体とは一切関係がありません

Unity 壊れたAnimationClipを少しリカバリーしてみるEditor拡張


f:id:esakun:20150730215258g:plain

使う人はよく使うであろうAnimationClip。 プロダクトを作りこんでいくとGameObject階層に変更が入りAnimationClipの参照が外れ、

f:id:esakun:20160309230808p:plain

このようにMissing!という表示に焦り、色々試行錯誤するも、最終的に、、、

http://blog-imgs-59.fc2.com/j/o/u/joukamachisendai/20130614144134cd1.jpg

っていう感じになった経験が何度かあります。

最悪作り直し....

今までお前に費やしてきた時間を返してくれという絶望感に襲われます。

過去の過ちを繰り返さないために

以下の作業を実行するとAnimationClip内のアニメーション対象参照が外れてしまいます。

  1. AnimatorがAddComponentされたGameObject配下の階層構造を変更する

  2. AnimatorがAddComponentされたGameObject配下のGameObject名を変更する

  3. Animationブラウザで直接GameObjectの参照名を変更する

一つ一つ説明していきます。

f:id:esakun:20160309230200p:plain
図のようなGameObject構成で、

f:id:esakun:20160309232245p:plain

このような感じでRootにAnimatorをAddComponentし、アニメーションをさせています。 AnimatorにはAnimationClipTestAnimation.animを1つだけセットしています。

1. AnimatorがAddComponentされたGameObject配下の階層構造を変更する

f:id:esakun:20160309232405p:plain
このようにGrandSonChildの子階層に移動すると、、、

f:id:esakun:20160309232408p:plain
このようにGrandSonMissing!になりアニメーションできなくなります。

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名を変更する

f:id:esakun:20160309233655p:plain
図のようにGameObjectChildChildrenに変更してみます。すると、、、

f:id:esakun:20160309233709p:plain
はい、Missing!

Q.名前を元に戻せば直るんでしょ?
A.はい、直ります。

3. Animationブラウザで直接GameObjectの参照名を変更する

f:id:esakun:20160309234342p:plain

Animationブラウザの各アニメーションターゲットにカーソルを合わせて、Enterキーを押下すると、名前を編集できます。ここでChildChildrenにしてみます。すると、、、

f:id:esakun:20160309234050p:plain
はい、予想通りMissing!

Q.名前を元に戻せば直るんでしょ?
A.はい、直りません。

f:id:esakun:20160309234835p:plain

まず、気づいて欲しいのが、なぜかChildrenの階層が一段階下がっています。

名前をChildに戻してみます。

f:id:esakun:20160309234930p:plain

さらに階層が深くなります。正直なぜこうなるのか怖いです。

困ったときは直接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拡張を書いてみました。

f:id:esakun:20160309235518p:plain
このようなカスタムウィンドウに、チェックしたいAnimationClipと、AnimatorをAddComponentするTransformをセットし、Checkボタンを押下します。

f:id:esakun:20160309235648p:plain

すると、Transform階層と差異のあるパスが出力されます。
これらを直接入直しなおし、Recoverボタンを押下します。

f:id:esakun:20160309235937p:plain

全て終えたら、再度Checkボタンを押下します。

f:id:esakun:20160309235934p:plain

図のようにAnimationClip is ALL GREENと出力されれば正常なAnimationClipに戻ったことになります。

以下ソース

gist.github.com

アニメーションターゲット数が多くなると、1つ1つ手入力するのが面倒くさいので、GameObject名サジェスト機能、一括置き換え機能など追加しても良いかもしれません。