eaglesakuraの技術ブログ

技術的な話題とか、メモとか。

Unity学習の整理 Animatorの基本

UnityChanをアニメーションさせる

Animator

  • 複数Layerが配置できる
    • Layerは Baseが身体本体の歩きモーション 表情モーション のように組み合わせられる
    • UnityChan付属のAnimator UnityChanAnimationCheck が参考になる
  • 基本的にステートマシンとして動作する
    • おそらく同じ骨構成であれば別アバターにも適用できる構造のはず

アニメーションループ

  • アニメーションが終わったタイミングでイベントを発火というユースケースがある
    • イベント処理で使っていた
  • 現在のAnimationの位置が正規化されたTime値でわかる
    • 開始 => 終了で1.0
    • 周回を進められるので、小数点以下が正規化された現在のループ
    • 整数部がループ回数として得られる
  • アニメーションがループ設定になっていない場合でも時計は進み続ける
    • UnityChanの JUMP00 で確認できる
    • 時計は進むが、アニメーションは止まる
      • 適切な次のアクションに切り替えてあげなければならない
  • ポーズだけのアニメーションの場合、凄まじい速度で時計が進む
    • UnityChanの POSE で確認できる

UniRxでループタイミングを得る方法

  • normalizedTime をint変換することで、整数部の切り替わり = ループのタイミングとして検出できる。
  • 0は最初の開始時となる。
_animator = GetComponentInChildren<Animator>();
_animator.UpdateAsObservable()
    .Select(_ => (int) _animator.GetCurrentAnimatorStateInfo(0).normalizedTime)
    .DistinctUntilChanged()
    .Subscribe(loop => Debug.Log($"Animation Loop!! [{loop}]"));