본문 바로가기

프로그래밍/Unity

Unity - StateMachineBehaviour를 얻는법

https://docs.unity3d.com/kr/530/ScriptReference/StateMachineBehaviour.html

 

Unity - 스크립팅 API: StateMachineBehaviour

 

docs.unity3d.com

 

 

유니티에서 제공하는 StateMachineBehaviour는 알고 있었지만, 이를 적극적으로 사용해본적이 없었다.

애니메이션 transition시에 해당 gameObject를 destroy 해주는 정도로 밖에 사용하지 않았었는데, 이를 Layer에다 붙여놓고 animator를 사용하는 곳에서 쓸 수 있다는 걸 오늘 알았다.

 

using System;
using UnityEngine;

public sealed class InvokeOnStateExit : StateMachineBehaviour
{
    public event Action<AnimatorStateInfo> StateExitHandler;

    public override void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        StateExitHandler?.Invoke(stateInfo);
    }
}


public sealed class EffectManager : MonoSingleton<EffectManager>
{
    public IEnumerator RequestEffect(int effectId)
    {
        var address = GetEffectResourceAddress(effectId);

        if (string.IsNullOrEmpty(address))
            yield break;

        var asyncOperationHandle = Addressables.InstantiateAsync(address);

        yield return new WaitUntil(() => asyncOperationHandle.IsDone);

        if (asyncOperationHandle.Status != AsyncOperationStatus.Succeeded || asyncOperationHandle.Result is null)
        {
            yield break;
        }

        var fxObject = asyncOperationHandle.Result;
        var animator = fxObject.GetComponent<Animator>();
        var stateHandler = animator.GetBehaviour<InvokeOnStateExit>();

        var trigger = false;
        stateHandler.StateExitHandler += _ => { trigger = true; };

        animator.Play("Start", 0);

        yield return new WaitUntil(() => trigger);

        Addressables.ReleaseInstance(fxObject);
    }
}

좀 어거지인 예제긴 하지만 GetBehaviour로 StateMachineBehaviour를 얻어올 수 있다는 점.

 

+ 오늘보니 티스토리 코드블럭에 C#이 추가되었다! Java로 써야했던 설움을 갚을 수 있겠다.