コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【Unity】別々の Animator で StateMachineBehaviour のインスタンスを共有できる「SharedBetweenAnimatorsAttribute」

概要

using UnityEngine;

[SharedBetweenAnimators]
public sealed class Example : StateMachineBehaviour
{
    private int m_counter; // static ではない

    public override void OnStateEnter
    (
        Animator          animator,
        AnimatorStateInfo stateInfo,
        int               layerIndex
    )
    {
        // OnStateEnter が呼び出されるたび m_counter をインクリメント
        Debug.Log( $"呼び出された回数:{++m_counter}" );
    }
}

上記のように StateMachineBehaviour を継承したクラスに
SharedBetweenAnimatorsAttribute を適用して

f:id:baba_s:20200917115551p:plain

Animator Controller を作成して

f:id:baba_s:20200917115554p:plain

適当なステートを作成して

f:id:baba_s:20200917115557p:plain

先ほど作成した StateMachineBehaviour をアタッチします

f:id:baba_s:20200917115600p:plain

そして、シーンに2つのゲームオブジェクトを作成して

f:id:baba_s:20200917115603p:plain

その2つのゲームオブジェクトに「Animator」をアタッチして
先ほど作成した Animator Controller を設定して Unity を再生すると

f:id:baba_s:20200917120043g:plain

StateMachineBehaviour の static ではない m_counter 変数が
共通で使用されていることが確認できます

f:id:baba_s:20200917120208g:plain

SharedBetweenAnimatorsAttribute を消して動作確認してみると
m_counter 変数が共通で使用されなくなったことが確認できます

このように SharedBetweenAnimatorsAttribute を使用すると
別々の Animator で StateMachineBehaviour のインスタンスを共有できるようになります