VRChatアニメーションオーバーライド勢もAnimatorControllerの存在を意識しよう

#VRChatのアバター編集目的でUnityを軽く使っている人向けの話
ちょっとお節介かもしれませんが、
Unityは「VRChatのアバターを編集してアップロードするやつ」で、
Animationウィンドウを「アバターのアニメーションオーバーライドを編集する」程度で扱っている人って、
意外とAnimatorのことを理解していない人も多いんじゃないかと思いました。

アニメーションオーバーライドの手法が解説されている記事を見ても、
そのときに編集されているはずのAnimatorControllerの存在が割と無視されている場合が多い気がします。
まぁ、そのとき必要ないですからねぇ。

しかし、Animation編集作業でAnimatorまわりに何が起こっているのかを少し理解することで、無駄なファイルが増えすぎて訳がわからなくなることが減るかもしれません。

ここでは、AnimatorControllerが謎だと思っている人が、その存在と意味を少し理解することだけを目的とした説明をしたいと思います。
Animatorの詳しい機能は説明しません。


#登場するアセット
アニメーション編集で登場するアセットの種類を紹介します。

###AnimationClip（アニメーションクリップ）
こういうアイコンのやつです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/275693/63b2d0b6-6402-d95b-8c16-40290f7a14f3.png)
こちらは言うまでもなく、モーションのデータです。
みなさん、こちらの編集を意識すると思います。

###AnimatorController（アニメーターコントローラー）
こういうアイコンのやつです。こちらが本書の主役。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/275693/e641978d-bb0d-5f22-12df-939058c0c1e0.png)
これは本来、アプリを実行したときに、どのアニメーションを流して、次にどの条件になったらどのアニメーションを流して……というシナリオを描くものです。
Windows -> Animator で内容を見ることができます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/275693/219a863b-4f9f-19c1-e9f1-671c7cdff5cb.png)
もし、今までAnimatorControllerを意識せずにアニメーション編集を行ってきている場合、
あるいはこんな感じになっている人もいるかもしれません。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/275693/ffd81632-225a-f91d-2488-3b33993d717b.png)
例えば、ここにある部品（ステートといいます）を選択してInspectorを見ると、それぞれMotionという項目にAnimationClipが設定されています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/275693/8e9f4bac-0b2f-7375-1144-a876e527166a.png)
つまり、１つのAnimatorControllerに対して複数のAnimationClipがセットされ、管理されているということです。
遷移の矢印については、ここでは説明を省略します。
とにかく、**AnimatorControllerには複数のAnimationClipがお品書きのように登録される**、ということだけを覚えてください。
AnimationClipの内容までは登録されません。どのAnimationClipを使うかだけが登録されます。

#Animatorコンポーネント
次に、Animatorコンポーネントについて説明します。
FBXにしろVRMにしろ、3DモデルのObjectには必ずAnimatorコンポーネントがついています。こういうやつです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/275693/c7737c69-34ca-91a9-51ea-fa778a318877.png)
このControllerの項目にAnimatorControllerをセットすることで、そのモデルはそのAnimatorControllerのルールに従って動くことになります。
今までそんなものセットしたことないけど？　という人もいるでしょうか。
Unityは便利なので、これを意識しなくてもAnimationを編集できるようになっています。

#Animationウィンドウについて
AnimationClipを編集するときAnimationウィンドウを開くと思いますが、
AnimationClipの内容が表示されるシチュエーションは次の２種類です。

- Hierarchyウィンドウ：親か自身がAnimatorコンポーネントを持ち、AnimatorControllerがセットされているGameObjectを選択する。
- Projectウィンドウ：AnimationClipを選択する。

ただし、編集ができるのはHierarchyウィンドウの選択の場合のみです。
そのとき、AnimatorコンポーネントにセットされたAnimatorControllerに登録されているAnimationClipを表示・編集できます。
複数ある場合は、Animationウィンドウの左上のプルダウンで切り替えることができます。
![clip_anim.PNG](https://qiita-image-store.s3.amazonaws.com/0/275693/24dbace7-d3ca-f15e-4774-9d6a895c647b.png)
ProjectウィンドウのAnimationClip単体の選択では、実際に動かす対象の情報が不足しているため編集できません。

#よくある操作について
さて、ここまでの解説を踏まえて、実際によくある操作で何が起こっているかを説明します。
##AnimationウィンドウのCreateボタンを押す
AnimationClipを新規で作成する場合、AnimationウィンドウのCreateボタンを押す、という手順があります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/275693/453ff8ca-7a53-ee30-75ba-f465aeb72f49.png)
Createボタンを押すと、ファイルダイアログが開いて、新規AnimationClipを保存する流れになります。
しかし、実際に行われている動作は、単にAnimationClipの作成だけではありません。

- AnimatorコンポーネントにセットされているAnimatorControllerに、新規AnimationClipの情報を登録します。
- もしAnimatorコンポーネントにAnimatorControllerがセットされていない場合、新しくAnimatorControllerを自動作成してセットします。
- Animatorコンポーネントすら持っていない場合、Animatorコンポーネントを追加しつつ、AnimatorControllerを自動作成してセットします。

AnimationClipのあるフォルダにAnimatorControllerが増えていたりするのは、そういう理由です。
Animatorコンポーネントを見ると、これまで"None"だったControllerの項目に、新しいAnimatorControllerがセットされています。
##AnimationCripを3Dモデルにドラッグ＆ドロップする
これは、既存のAnimationClipを編集する場合の手順ですね。
Hierarchyにある3DモデルにAnimationClipを貼り付けたらアニメーション編集できると、単純にそう認識している人がいると思います。
しかし、これも実際に行われている動作は、単にAnimationClipの操作だけではありません。

- AnimatorコンポーネントにセットされているAnimatorControllerに、持ってきたAnimationClipの情報を登録します。
- もしAnimatorコンポーネントにAnimatorControllerがセットされていない場合、新しくAnimatorControllerを自動作成してセットします。
- Animatorコンポーネントすら持っていない場合、Animatorコンポーネントを追加しつつ、AnimatorControllerを自動作成してセットします。

上記のCreateボタンと同じです。

#今後はAnimatorControllerを意識しながら作業しよう
AnimatorControllerの存在が意識できれば、AnimatorControllerを無駄に増やしたり、ステートを無駄に増やしたりすることはなくなると思います。
たとえば今後は次のようにしてはどうでしょうか。
##一度作ったAnimatorControllerを使いまわすやり方
###１．AnimatorControllerのセットを意識する
最初は上記のAnimatorController自動生成でもいいのですが、２回目以降は意識的にAnimatorControllerをセットしてあげるのが良いです。
最初に生成されたAnimatorControllerをAnimatorコンポーネントにセットしてあげてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/275693/ef7a9e5c-c538-5e23-dc83-32739ad018bc.png)
###２．Animatorのステートを編集する
Animatorウィンドウを開き、編集したいAnimationClipをドラッグ＆ドロップで追加したり、不要なステートを削除したりします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/275693/900a6197-f1f9-fc4e-15a7-372ecbe1164a.png)
既にステートに設定されているMotionを差し替えるでもOKです。
削除はステートを選択してDeleteキーです。
ステートを削除したからといって、元のAnimationClipが消えることはありません。
間違って別のAnimationClipを編集しないよう、なるべく整理しておきましょう。
##AnimatorControllerを使い捨てるやり方
自動生成されたAnimatorControllerを用が済んだらさっぱりと消してしまうのもアリです。
これが一番簡単かもしれませんね。
ただし、必ず自分が自動生成させたものであることを理解した上で削除しましょう。