https://docs.unity3d.com/kr/530/ScriptReference/StateMachineBehaviour.html
유니티에서 제공하는 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로 써야했던 설움을 갚을 수 있겠다.
'프로그래밍 > Unity' 카테고리의 다른 글
[Unite Seoul 2019] 양진석 - 효과적인 에셋 관리를 위한 어드레서블 에셋 시스템 소개 (0) | 2020.05.14 |
---|---|
UnityEvent vs C# Event : 무엇을 쓸까? (1) | 2020.03.13 |
Unity SceneManager.sceneLoaded (0) | 2020.03.12 |
유니티 테스트 러너(Unity Test Runner) (0) | 2020.03.01 |
Unity Reflection을 이용한 Factory pattern 구현. (0) | 2019.09.10 |