見出し画像

【Unity】AnimancerProについて


1.AnimancerProとは?

AnimatorControllerを使わず、Scriptで直接アニメーションを制御するアセットです!
(まだほとんど使っていないので、手抜き記事となります。今後改訂する可能性があります。)

ステートマシンがスパゲッティになることに悩むこともありません。

2.注意点

(1)一度アニメーションしたら動かなくなる場合

Animancer Proを使用し、以下のようなコードでボタンをクリックしたときのアニメーションをつけてみたが、一度だけアニメーションして動かなくなってしまいました。

 [Header("Animancer")][SerializeField]AnimancerComponent animancer;
 [Header("クリック時アニメーション")][SerializeField]AnimationClip pressed;

////////中略//////////

 private void AnimePlay() {
        if (animancer == null) return;
        animancer.Play(pressed, 0.1f);
    }

理由としては、一度pressedのアニメーションが再生された後、そのままもう一度pressedのアニメーションを再生することはできないようで、pressedから一度notPressed(通常時、アイドル時)のアニメーションを挟んで、再度pressedのアニメーションをさせる必要があります。
修正後のコードは以下のようになります。

 [Header("Animancer")][SerializeField]AnimancerComponent animancer;
 [Header("クリック時アニメーション")][SerializeField]AnimationClip pressed;
 [Header("非クリック時アニメーション")][SerializeField]AnimationClip notPressed;   

////////中略//////////

 private void AnimePlay() {
        if (animancer == null) return;
        var state = animancer.Play(pressed, 0.1f);
        state.Events.OnEnd = () => animancer.Play(notPressed, 0.1f);
    }
何回クリックしても動くようになりました。

なお、安全面を考慮し、Buttonコンポーネントの遷移は「アニメーション」から「なし」に変更しています。
Buttonの遷移の「アニメーション」は短いクリックだと、アニメーションが再生されないことが多々ありましたが、Animancer Proでコードを使用して呼び出すと、そのようなこともなくなりました。非常にいいです。

(2)アニメーション完了時にイベントを実行する

以下のコードは_openClipアニメーション完了時に3つイベントを実行しています。

        var state = _animancer.Play(_openClip);
        state.Events.OnEnd = () => {
            _animancer.Play(_idleClip);
            IsTransition = false;
            //ボタンを押せるようにする
            foreach (var button in _openButton)
                button.enabled = true;
        };

ラムダ式?殆ど書いたことがなかったので、間違えた書き方をして、しばらく混乱してました。

//この書き方が正しい
state.Events.OnEnd = () => { イベント1;イベント2;イベント3;};

//この書き方は誤り(イベント3しか実行されない)
state.Events.OnEnd = () => { イベント1;};
state.Events.OnEnd = () => { イベント2;};
state.Events.OnEnd = () => { イベント3;};

(3)Action On Disable

「Animancer.AnimancerComponentを無効にするときに実行するアクション」らしいです。デフォルト値は停止(Stop)です。

  • Stop(停止) すべてのアニメーションを停止し、巻き戻しますが、アニメーションの値はそのまま残します。

  • Pause(一時停止) すべてのアニメーションを現在の状態で一時停止し、後で再開できるようにします。

  • Continue(続行) 非アクティブ時もプレーを続ける。

  • Reset(リセット) すべてのアニメーションを停止し、巻き戻し、オブジェクトを元の状態に強制的に戻します。

  • Destroy(破棄) UnityEngine.Playables.PlayableGraphとそのすべてのレイヤーとステートを破棄します。

3.参考記事

以下の2記事が大変事細かに書かれているので、困ることはないと思います。


この記事が気に入ったらサポートをしてみませんか?