見出し画像

【Unity】AnimatorのコールバックをUniRxで検知する

Animator上でAnimationが開始したタイミングや終了したタイミングで何かしらの処理をスクリプトで行いたいとき、UniRxを使うと簡単に実現することができます。早速やっていきましょう!

1. ObservableStateMachineTriggerのアタッチ

UniRxをインポートすると、Animator上で稼働しているステートマシンのコールバックをObservableに変換するObservableStateMachineTriggerコンポーネントを使うことができます。

検知したいAnimatorのインスペクタの[Add Behaviour]をクリックしてObservableStateMachineTriggerをアタッチします。

スクリーンショット 2021-09-11 155119_New

2. スクリプト

以下のスクリプトを適当なオブジェクトにアタッチします。アタッチ後、インスペクタから検知したいAnimatorを割り当てます。

using UnityEngine;
using UniRx;
using UniRx.Triggers;

public class Controller : MonoBehaviour
{
   [SerializeField] private Animator m_Animator;

   private void Start() {
       var trigger = m_Animator.GetBehaviour<ObservableStateMachineTrigger>();
       trigger
           .OnStateEnterAsObservable()
           .Where(x => x.StateInfo.IsName("MoveX"))// すべてのStateを対象にする場合は不要
           .Subscribe(x => {
               Debug.Log("MoveX開始");
           }).AddTo(this);
       
       trigger
           .OnStateExitAsObservable()
           .Where(x => x.StateInfo.IsName("MoveX"))// すべてのStateを対象にする場合は不要
           .Subscribe(x => {
               Debug.Log("MoveX終了");
           }).AddTo(this);
   }
}

サンプルコードではOnStateEnterAsObservableで開始のタイミング、OnStateExitAsObservableで終了のタイミングのイベントを購読しています。

3. 実行

実行してAnimatorが開始されステートの変化が検知されていることが確認できます。

4. おわりに

アニメーションを行う別の方法としてはのDOTweenがあります。DOTweenはスクリプトベースであるため、開始や終了のタイミング管理はスクリプトから扱いやすいですが、複雑なアニメーションを行いたい場合は煩雑になりやすく単発アニメーション向きといえます。

一方、AnimatorはStateMachineを使って視覚的に制御を設定していくため、制御の流れが分かりやすく、複数のアニメーションのブレンドなど複雑な処理ができる反面、簡単なアニメーションだけを行う場合には過剰で設定にも少々手間がかかります。

アニメーションの開始や終了もTransitionを設定するだけであとはStateMachineが管理してくれるためお手軽ではありますが、Animatorの世界だけで閉じているためスクリプトからは触れにくい部分でもあります。

そこで今回はUniRxを使ってAnimatorとスクリプトを連携させる方法を解説しました。これによってよりインタラクティブで多様な演出ができるようになりますので是非、活用していきたいですね。🌱

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