Animancerで楽々アニメーションプログラミング

# 1. 前提

[Unity アセット真夏のアドベントカレンダー 2019](http://assetstore.info/eventandcontest/adventcalendar/eventandcontestadventcalendarasset-adventcalendar2019summer/) のために書かれた記事です。
![summer_Advent_banner_3_Tw-1024x536.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58282/b4156d7d-f31d-6784-fca8-74f5870262cf.png)
この記事は、Unity上でキャラクターをアニメーションさせる時のプログラミング方法について書かれています。Unityでのアニメーションには通常Mecanimを利用するのですが、今回は**Animancerを利用する方法**を紹介します。

# 2. Animancer とは

Animancerは、シンプルなスクリプトだけでUnityのアニメーションを制御できるようにするための便利なアセットです。

![b07bb6a8-2be9-44dc-8fc8-e788f37f1087.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58282/e9b84287-67fb-fd01-7e67-2352aa74d965.jpeg)

https://assetstore.unity.com/packages/tools/animation/animancer-lite-116516?aid=1011l8zf9&utm_source=aff

https://assetstore.unity.com/packages/tools/animation/animancer-pro-116514?aid=1011l8zf9&utm_source=aff

Mecanimで利用できる機能はすべて利用でき、さらにいくつかの特徴があります。

最も大きい特徴は**Animator Controllerが不要**なところです。また、Animancerは**インスペクタ上でデバッグが容易になるようなインターフェース**を備えているのでデバッグも簡単になります。

Mecanimにない機能として、アニメーション終了時のコールバック機能、再生中以外のアニメーションの状態が確認できる、動的にアニメーションの設定（トランジション時間、スピード、再生位置、アニメーションウェイトなど）を変更可能などの機能があります。

下図に、各アニメーションツールの比較を載せます（[出展](https://kybernetikgames.github.io/animancer/docs/introduction/feature-comparison)）。赤字のところはMecanimにはないAnimancerの主な特徴です。表の内容を大まかに言うと、Mecanimでできることは全てできて、さらにいくつかの独自機能が備わっているという感じです。

![Untitled-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58282/460ac37e-40db-08d5-43c1-709a1e51cc44.jpeg)

## Mecanim を使わずに Animancer を使うメリットは？

### Mecanimのワークフロー

通常、Mecanimでアニメーションを行う場合は、下図のようなワークフローになります（出展：[Unity公式ホームページ](https://docs.unity3d.com/ja/current/Manual/AnimationOverview.html)）。

![MecanimHowItFitsTogether.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58282/7a748c07-01db-ee54-86be-e7ea46f0163f.jpeg)

1. Animation Clipを含むキャラクターモデルをDCCツールなどで用意する
2. Animator Controllerを作成し、Animator Controller上のステートマシンにAnimation Clipを配置し、ステートマシンを完成させる
3. 必要に応じて、Humanoidリグの設定やAvatarの設定などを行う
4. 作成したAnimator ControllerとAvatarをキャラクターのAnimatorコンポーネントにアタッチする

### Mecanimの問題点

Unityでアニメーションさせる時に最も使われるツールはMecanimでしょう。
しかし、Mecanimにはたくさんのゲーム制作ワークフロー上の問題点があります。

まず、そもそもAnimator Controller上に**ステートマシンを用意するのが大変**です。
プログラマーであれば、スクリプトだけで処理を実装したいと思うのではないでしょうか。

仮にステートマシンを作ったとしても、下図のように**複雑なステートマシンになったりします**。
ステートマシンをメンテナンス作業だけでも大変になりがちです。
![nightmare-controller.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58282/38e6ccf4-6461-60a0-adc3-b2ee8ba8c5de.png)

さらに、実際はステートマシンだけでアニメーション制御のロジックは完結せず、ステートマシンを制御するスクリプトが別途必要なのです。**これは二度手間です**。それなら、スクリプトでだけでやらせてほしいところです。

ステートマシンとスクリプトに処理が分離しているので、バグが発生した場合、ステートマシン側とスクリプト側のどちらに不具合があるかの特定が困難になり、**デバッグの難易度は高くなりがち**です。

さらに、Mecanimのステートマシンはスクリプトの様に**アクセス制御の機能がない**ので、スクリプトのどこからでもアクセスできてしまうという問題があります。このためアニメーション周辺はシステム設計が簡単に破綻します。

あと、これはMecanimに限らずUnity全般に言えることですが、**マジックストリングを多用しすぎています**。マジックストリングを多用すると、システムの保守性が著しく下がります。Unityはもっと保守性と可読性を両立してほしいと思います。

# 4. Animancerの利用方法

では、Animancerではアニメーションのワークフローはどうなるのか？
簡単に言うと、**Animator Controllerをいじる工程がなくなります**。
それにより、ステートマシンが必要なくなり、上記Mecanimを使う場合の複数の問題点が全て解決できます。
すべてC#スクリプトでアニメーションを制御するワークフローとなります。

2019年7月の時点でAnimancer Liteに含まれているデモで具体的なワークフローを紹介します。

## 単純なアニメーション再生

１つのアニメーションクリップを再生するワークフローを比較してみます。

Mecanimの場合、以下のようになります。

> Mecanimの場合
> 
> 1. AnimatorControllerアセットをプロジェクト内に作る
> 2. キャラクターのAnimatorコンポーネントに1.のAnimatorControllerをアサインする
> 3. AnimatorControllerでステートを１つ作り、ステートにアニメーションクリップをアサインする
> 4. Playボタンを押すとキャラクターがアニメーションします

次に、Animancerの場合です。
Animancerは、AnimatorControllerをいじる工程がないことが分かります。
実際に作業してみると手順の煩雑さが下がっていることが分かります。
> Animancerの場合
> 1. NamedAnimancerComponentをキャラクターにアタッチする
> 2. AnimationClipをNamedAnimancerComponentのAnimations配列にアサインする
> 3. Playボタンを押すとキャラクターがアニメーションします

## スクリプトでアニメーションを制御する場合

> Mecanimの場合
> 
> 1. スクリプトを書く(PlayOnClick1.cs)
> 2. PlayOnClick1.csをキャラクターにアタッチする。スクリプトの_Animator変数にAnimatorコンポーネントをインスペクタ上からアサインする。
> 3. AnimatorControllerアセットをプロジェクト内に追加する。
> 4. キャラクターのAnimatorコンポーネントに3.のAnimatorControllerをアサインする
> 5. AnimationController内にステートを作成し、Idleアニメーションクリップをアサインする。はじめに作られたステートなのでこれがデフォルトのステートになる
> 6. AnimationController内にもう１つステートを作成し、そこにアクション用のアニメーションクリップをアサインする
> 7. Action用のステートからIdle用のステートへトランジションを作成する

> **とても煩雑ですね。特にステートトランジション作成などは本当に必要でしょうか？**

>  ```csharp:PlayOnClick1.cs
> using UnityEngine;
>
> public class PlayOnClick1 : MonoBehaviour
> {
>   [SerializeField]
>   private Animator _Animator;
> 
>   private void Update()
>   {
>     if (Input.GetMouseButtonDown(0))
>     {
>       _Animator.CrossFade("Action", 0.3f);
>     }
>   }
> }
>  ```

> 上記1.～7.のMecanimの作業内容は以下の動画の様になります。
> ![mecanim-setup.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58282/f3e38833-00dc-4920-07c0-0a74a961d86c.gif)

　
> Animancerの場合
> 1. スクリプトを書く(PlayOnClick2.cs)
> 2. PlayOnClick2.csをキャラクターにアタッチする。

> **Mecanimに比べて格段に工程が削減できています！**

>  ```csharp:PlayOnClick2.cs
> using Animancer;
> using UnityEngine;
> 
> public class PlayOnClick2 : MonoBehaviour
> {
>   [SerializeField]
>   private AnimancerComponent _Animancer;
> 
>   [SerializeField]
>   private AnimationClip _Idle;
> 
>   [SerializeField]
>   private AnimationClip _Action;
> 
>   private void OnEnable()
>   {
>     _Animancer.Play(_Idle);
>   }
> 
>   private void Update()
>   {
>     if (Input.GetMouseButtonDown(0))
>     {
>       _Animancer.CrossFade(_Action)
>         .OnEnd = OnActionEnd;
>     }
>   }
> 
>   private void OnActionEnd()
>   {
>     _Animancer.CrossFade(_Idle);
>   }
> }
>  ```

> 上記1.～2.のAnimancerの作業内容は以下の動画の様になります。
> ![animancer-setup.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58282/a480e1f9-ffc7-7b98-c155-f0be246b0967.gif)

Animancerの効能は、上記に挙げた単純な例でだけではありません。

- デバッグ作業
- 他の人が書いたスクリプトの理解
- スクリプトの再利用

などの複雑な場面ではさらに効果を発揮します。


# 5.サンプル紹介

アセットに収録されているサンプルを紹介します。

### Genericリグ
![test2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58282/e33470bf-2f2b-989a-f172-611098a8b0dd.gif)

### ドアなどの簡単なアニメーションにも利用可能
![test3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58282/5ccfaf3a-e5c9-d537-3ba9-b2da6499ed08.gif)

### Locomotionサンプル

![test4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58282/e5228f4a-7a07-d8e4-764a-d522aff27e1e.gif)

### Spriteアニメーション

![test5.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58282/b27fdaac-a053-3014-577e-cd32bb774647.gif)

### プラットフォーマー

![test6.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58282/61847f52-89ed-4c6c-4e51-0d3ff83b4886.gif)

### アニメーションレイヤー

![test7.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58282/a1a26fb9-5a03-245e-dc71-869c5e6c3428.gif)

### Inverse Kinematics and Target Matching

![test8.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58282/efe2f025-045b-75b2-599f-f04df475e865.gif)


# 6. 無料で全機能お試しできます

Animancerには、Animancer Lite（無料版）とAnimancer Proの２つのバージョンがあります。
Animancer Liteでも全機能が使えますが、基本的な機能以外（アニメーションレイヤーやブレンドツリーなど）はビルドして利用することはできません。全機能をビルド後のゲームで使いたい場合はPro版を購入しましょう。

AnimancerでUnityのアニメーション制御プログラミングはとても楽になりますので是非使ってみて下さい！

# 7. 参考文献

https://assetstore.unity.com/packages/tools/animation/animancer-lite-116516?aid=1011l8zf9&utm_source=aff

https://assetstore.unity.com/packages/tools/animation/animancer-pro-116514?aid=1011l8zf9&utm_source=aff

[Animancerの公式ホームページ](https://kybernetikgames.github.io/animancer/)