C#
Unity
Unity2017

Animationまとめ

(BlendTree以外)

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

Mecanim

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

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

参考
UnityのMecanimでキャラクターを動かす

Animatorコンポーネント

Controller

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

スクリーンショット 2017-10-17 1.21.10.png

Avator

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

スクリーンショット 2017-10-17 1.10.52.png

Avatarが生成される。

スクリーンショット 2017-10-17 1.11.01.png

Apply Root Motion

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

Update Mode

モード 内容
Normal Time.timeScaleの影響を受ける
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

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

※注意点

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

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

参考
Unity : AnimationClipに合わせて処理をしたいなら

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

アニメーションデータ(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

Parameters

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

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

追加は以下のプラスボタンから
スクリーンショット 2017-10-17 13.03.32.png

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

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

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

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

参考
【Unity7】プレイヤーのAnimator Controllerを設定したい!【ローグライク8】

Conditions

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

ExitTime

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

Fixed Duration

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

参考
【Unity開発】Animator Controllerの遷移設定(Duration等)【ひよこエッセンス】

AnimatorOverrideController

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

スクリーンショット 2017-10-26 1.38.52.png

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