Animationまとめ


（BlendTree以外）

https://docs.unity3d.com/jp/540/Manual/AnimationSection.html


## Mecanim

- メリット
	- 人型のリグを認識して調整する
	- 他の人型キャラにアニメーションを使いまわせる
	- アニメーションの切り替えをスムーズにブレンドする

アニメーションシステム？を指していて、Mecanim画面とかがあるわけではない。

> 参考
[UnityのMecanimでキャラクターを動かす](https://qiita.com/yando/items/601e6fd35002e77ae9c8)



## Animatorコンポーネント

### Controller

アニメーションセットを配置・管理するためのもの。使い回しが効く。

![スクリーンショット 2017-10-17 1.21.10.png](https://qiita-image-store.s3.amazonaws.com/0/136286/3063c01d-f616-2f39-9e64-89de09a858bd.png "スクリーンショット 2017-10-17 1.21.10.png")


### Avator

モデルにAvatorがついている場合はそれを選択する。
Legacyなどになっているモデルの場合は、Animation Typeを`Humanoid`に変更する。

![スクリーンショット 2017-10-17 1.10.52.png](https://qiita-image-store.s3.amazonaws.com/0/136286/72b76c32-0357-8c1b-b52b-eea87c5d630b.png "スクリーンショット 2017-10-17 1.10.52.png")

Avatarが生成される。

![スクリーンショット 2017-10-17 1.11.01.png](https://qiita-image-store.s3.amazonaws.com/0/136286/82cd04e8-9bd2-53a5-40c8-2819a507081d.png "スクリーンショット 2017-10-17 1.11.01.png")



### Apply Root Motion
positionの変更が組み込まれている場合、移動するかどうか

### Update Mode

|モード|内容|
|---|---|
|Normal|[Time.timeScale](https://docs.unity3d.com/jp/540/ScriptReference/Time-timeScale.html)の影響を受ける|
|Animate Physics|物理演算の影響を受ける|
|Unscaled Time|Time.timeScaleの影響を受けない|

### Culling Mode
見えていない時にアニメーションさせるかどうか


## Animation Clip

https://docs.unity3d.com/jp/540/Manual/AnimationClips.html

### Animation Events

https://docs.unity3d.com/jp/540/Manual/animeditor-AnimationEvents.html

![AnimationEvents_.png](https://qiita-image-store.s3.amazonaws.com/0/136286/ffb7a7e0-de78-a5a7-07db-cd5b70688c0a.png "AnimationEvents_.png")

[チュートリアルのサバイバルシューター](https://unity3d.com/jp/learn/tutorials/projects/survival-shooter-tutorial)を見てみると、`StartSinking`がアニメーションイベントとわかる。このAnimationClipをもつゲームオブジェクトに、`StartSinking`関数をもったスクリプトがアタッチされていて、それをコールしている。死亡アニメーションの途中で床に沈み始めてほしいという意図だろう。アニメーションの最後につければ、終了時のイベントをとることもできる。

#### ※注意点

Aアニメーションが終了する前に
Bアニメーションが始まってしまうと
Aアニメーションの終了するタイミングがなくなってしまう
（アニメーションイベントが発生しない）

なので実際の業務では、
前のフレームのアニメーションを取得し続け、
今のフレームのアニメーションと照らし合わせてステートを判定しているらしい

> 参考
[Unity : AnimationClipに合わせて処理をしたいなら](http://indie-du.com/entry/2016/05/17/080000)


## Animator Controller

https://docs.unity3d.com/ja/current/Manual/class-AnimatorController.html

### State

https://docs.unity3d.com/jp/540/Manual/class-State.html

![スクリーンショット 2017-10-17 13.08.44.png](https://qiita-image-store.s3.amazonaws.com/0/136286/b583cfc7-4ede-4c48-2205-994224f520ad.png "スクリーンショット 2017-10-17 13.08.44.png")

アニメーションデータ（AnimationClip）をアニメーターウィンドウにドラッグ&ドロップするとステートがつくられる。

オレンジ色が最初のステート。右クリックからの`Set as Layer Default State`で、最初のステートを切り替えられる。

#### Any State
どのステートからでも遷移できるステート。ステートの遷移先にすることはできない。ex.「Any State」->「ダメージを受ける」


### Transition

https://docs.unity3d.com/ja/current/Manual/class-Transition.html

Stateの上で右クリックし、`Make Transition`を選び、次のステートへつなげる。

Transition（矢印）をクリックして、ConditionsやExitTimeの設定をする。

※削除する場合はインスペクタの`Transitions`からマイナスボタンを押さないといけない。

![スクリーンショット 2017-10-17 13.18.57.png](https://qiita-image-store.s3.amazonaws.com/0/136286/885d4e95-4814-5e1f-39d1-77ea27dd5e60.png "スクリーンショット 2017-10-17 13.18.57.png")

#### Parameters

https://docs.unity3d.com/jp/540/Manual/AnimationParameters.html

アニメーション切り替え条件のパラメータを設定する。

追加は以下のプラスボタンから
![スクリーンショット 2017-10-17 13.03.32.png](https://qiita-image-store.s3.amazonaws.com/0/136286/b0d181e4-64c5-8b16-8a74-7072173f9bd0.png "スクリーンショット 2017-10-17 13.03.32.png")

「歩く」「走る」などじわじわ値を変えていって閾値を越えたかどうかの判定には`Float`を使う。

「ジャンプ」「攻撃」など、一回だけ実行したい時には`Trigger`を使う。公式のサンプルでは「死亡した」ときに`animator.SetTrigger("Die");`のように使っている。`Trigger`は1フレームtrueを実行したらfalseに戻る。一方`Bool`は、セットしたbool値を維持する。

1回だけ実行してフラグを元に戻したい場合は、`Trigger`を使って以下のようにシンプルに書くことができる。

```c:Bool型でジャンプ処理を書く
if(Input.GetKeyDown(KeyCode.Space)) {
	animator.SetBool("Jump", true);
} else {
	animator.SetBool("Jump", false);
	// falseに戻さないとずっとジャンプしている
}
```

```c:Trigger型でジャンプ処理を書く
if(Input.GetKeyDown(KeyCode.Space)) {
	animator.SetTrigger("Jump");
}
```


> 参考
[【Unity7】プレイヤーのAnimator Controllerを設定したい！【ローグライク8】](http://hiyotama.hatenablog.com/entry/2015/06/05/090000)

#### Conditions
アニメーションの切り替え条件。パラメータから設定する。

#### ExitTime
`Has Exit Time`にチェックを入れると、パラメータではなくアニメーションの再生回数（Exit Time）で遷移のタイミングを決める。

#### Fixed Duration
アニメーションがクロスする部分の度合いを、前のアニメーションの長さを元にパーセントで決めるか、秒数で決めるか。


> 参考
[【Unity開発】Animator Controllerの遷移設定(Duration等)【ひよこエッセンス】](http://hiyotama.hatenablog.com/entry/2015/06/29/090000)




## AnimatorOverrideController

https://docs.unity3d.com/jp/540/Manual/AnimatorOverrideController.html

![スクリーンショット 2017-10-26 1.38.52.png](https://qiita-image-store.s3.amazonaws.com/0/136286/2cb4e344-dd85-3587-e24f-375dbc6a0542.png "スクリーンショット 2017-10-26 1.38.52.png")


トランジション、ステートなどのロジックは同じで、複数キャラに使いまわしたい場合に使う。
ベースになるControllerを指定して、AnimationClipを差し替える。