こんにちわ、Unityエンジニアのオオバです。

AnimationClipは、
Unity上でアニメーションを作成できる、
メイン機能のひとつです。

使う人は本当によく使うのではないでしょうか。
ちなみにオオバもよく使います。

ところでゲーム開発をしていると、
AnimationClipが再生できなくなった!!
という事件が発生しませんか?

よく目にする原因の第1位は、

「AnimationClipが参照するオブジェクトの参照外れ」

複数人で開発していると、
悪気はないけどPrefabの階層を変えてしまって、
AnimationClipが動かなくなる悲しき出来事。

Missing

このようにMissing!という表示に焦ります。
色々試行錯誤するも動かない理由がわからない。

最終的に、、、

【Unity】AnimationClipを壊す3つの方法_0

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

最悪作り直し

「今までお前に費やしてきた時間を返してくれ」
そんな絶望感に襲われながら、
最初からキーフレームを打った日々がありました。

この記事の内容

AnimationClipを破壊する3つポイント

何をしたらAnimationClipが壊れるのか
理解することが大事です。

次の3つは必ず覚えておきましょう。
この行為をすると100%AnimationClipを壊せます。

  1. 階層構造の変更で破壊
  2. 名前変更で破壊
  3. ターゲット名の変更で破壊

これから、なぜこの3つの方法でAnimationClipを、
壊しながら説明してきます。

これから壊すAnimationClipはコチラ

ヒエラルキーの状態

変更前ヒエラルキー

Root(Animator)  
└── Parent  
    └── Child  
        └── GrandChild  
            └── GrandSon  

このようなヒエラルキーで、
RootにAnimatorをAddComponentしています。

Animationウィンドウの状態

【Unity】AnimationClipを壊す3つの方法_1

Animationウィンドウです。
RootのAnimatorには、
AnimationClipTestAnimation.anim
1つだけセットしています。

この状態のAnimationClipをこれから3つの方法で壊していきます。

1. 階層構造の変更で破壊

AnimatorをAddComponentしたGameObject配下の
階層構造を変更するとAnimationClipを破壊します。

破壊前破壊後
変更前ヒエラルキー
破壊その1

このようにGrandSonGrandChildと同じ階層に移動させました。

【Unity】AnimationClipを壊す3つの方法_2

するとAnimationウィンドウでは、
このようにGrandSonMissing!となり、
GrandSonはアニメーションしなくなります。

Q.直す方法はありますか?

A.ヒエラルキー上で階層を元に戻せば直ります

【小ネタ】AnimationClipファイルを直接編集して直す方法

TestAnimation.animをテキストエディタで開きます。

~~~~~~~ 略 ~~~~~~~  
      m_PostInfinity: 2  
      m_RotationOrder: 4  
    attribute: m_LocalPosition.z  
    path: Parent/Child/GrandSon  
    classID: 4  
    script: {fileID: 0}  
~~~~~~~ 略 ~~~~~~~  

pathプロパティがGameObjectの階層を表しています。

path:を破壊前の状態に修正することで、
AnimationClipは元通り動くようになります。

※注意 Unity外でのファイル編集は、
ファイルの破損を招く可能性があるため、
Unityを閉じてから行うと安全です。

2. GameObject名の変更で破壊

AnimatorをAddComponentした
GameObject配下のGameObject名を変更すると破壊します。

破壊前破壊後
変更前ヒエラルキー
破壊その2

GameObject名をChildからChildrenに変更。

【Unity】AnimationClipを壊す3つの方法_3

すると元の名前ChildがMissing!になります。

Q.直す方法はありますか?

A.名前を元に戻せば直ります

3. ターゲット名の変更で破壊

Animationウィンドウで、
ターゲット名の変更をすると破壊します。
ここでいうターゲット名とは、
アニメーションさせるGameObject名のことです。

Animationウィンドウ上で、
ターゲット名を変更する方法を紹介します。

【手順】ターゲット名を選択してEnterキー押下

【Unity】AnimationClipを壊す3つの方法_4

Animationウィンドウ上からターゲット名を選択して、
Enterキーを押下します。

するとターゲット名を編集できます。

試しに、ここではChildChildrenにリネーム。

【Unity】AnimationClipを壊す3つの方法_5

このようにChildrenというGameObjectが見つからないため、
Missing!になります。

Q.名前を元に戻せば直るんでしょ?

A.直りません。

そう名前を元に戻すだけでは直らないのです。

階層関係も元に戻す

ここからはAnimationウィンドウで
ターゲット名を変更したAnimationClipを
直す方法を紹介していきます。

そもそも階層も変更している

破壊前破壊後
【Unity】AnimationClipを壊す3つの方法_6
【Unity】AnimationClipを壊す3つの方法_6

気づいて欲しいのが、
なぜかChildrenとGrandChildが同じ階層になっています。
そう、階層が変わってしまっているのです。

ためしにChildrenを元のChildに名前を戻してみます。

【Unity】AnimationClipを壊す3つの方法_7

すると本来GrancChildの親階層であるはずなのに、
子階層になってしまいます。

AnimationClipの中身を確認

TestAnimation.animを、
テキストエディタで開いて確認してみます。

      m_PostInfinity: 2  
      m_RotationOrder: 4  
    attribute: m_LocalPosition.x  
    path: Parent///Child  
    classID: 4  
    script: {fileID: 0}  

pathがおかしなことになっています。

このスラッシュは階層を表しています。
Animationウィンドウでターゲット名を変更すると、
階層が1つ深くなってしまう不具合があるようです。

階層をもとに戻して解決

path: Parent///Childpath: Parent/Child
変更して保存するとAnimationClipは直ります。

困った時はAnimationClipの中身を
テキストエディタなどで確認してみると良いでしょう。

まとめ

AnimationClipを壊す3つの方法と、
それを直す方法について紹介してきました。

  1. 階層構造の変更で破壊 =>【解決方法】名前を戻す
  2. 名前変更で破壊 => 【解決方法】名前を戻す
  3. ターゲット名の変更で破壊 => 【解決方法】AnimationClipをテキストエディタpathを編集

この3種類はAnimationClipを扱う人は、
覚えておいたほうが良いでしょう。

実際にAnimationClipを扱わないが、
AnimationClipを扱うメンバーがいる
チームリーダー向けにも伝えたいことがあります。

できる限りプロジェクトは壊れない方が良いですよね。
トラブルに時間が割かれるのは本当に時間の無駄。

そこで、壊れにくいプロジェクト状態にするには、
まず何をしてはいけないのか?を知る必要があります。

Unityの理解度はメンバー毎に全く違うということを、
チーム開発で実感します。

自分の当たり前はメンバーには通用しません。
堅固で壊れにくい開発環境を構築するためには、
壊す方法を知るところからです。

「何をしてはいけないのか?」
「何をしたら壊れるのか?」

こういったノウハウを共有し、
チームレベルを上げながら開発することが大事。

今回はAnimationClipを取り上げました。
ついつい、Unity歴の浅いメンバーが
サクッとGameObject名を変更して、
サクッとAnimationClipを壊してしまうこともあるでしょう。

そうならないためにも、
本記事を参考に開発ルールを
作ってみてはいかがでしょうか。

オススメ記事
検証環境