[Unity] 애니메이터 블렌드 트리 이벤트 동시 실행 문제Unity/TroubleShooting2024. 7. 7. 19:00
Table of Contents
✌️발단
아래와 같은 블렌드 트리가 있다
- `HorizontalMovement`, `ForwardMovement` 파라미터에 따라 블렌딩 된다
- 파라미터에 따라 A,B가 블렌딩돼서 플레이될것이다
- 설계에 따라 다르겠지만 나는 A,B 중 하나가 대부분의 가중치를 가져가면서 플레이시킬 목적이다
문제는 애니메이션 이벤트에서 발생한다
A,B 둘 모두 같은 함수를 호출하는 이벤트를 다른 타이밍에 넣어줬다
A의 경우
그리고 B의 경우
그리고 블렌드 트리에서 애니메이션이 실행될 때 기대와 다른 결과가 생긴다
- 기대: 대부분의 가중치를 가져가는 애니메이션의 이벤트만 트리거
- 결과: 두 애니메이션의 이벤트가 모두 트리거
아무래도 가중치에 따라 따라 보여지는 애니메이션이 다를 뿐
유니티 내부 구현이 블렌드 트리 내부 모든 애니메이션이 실행되서 모든 애니메이션의 이벤트도 트리거 되는듯 하다
(뇌피셜이다)
🔥해결 과정
애니메이션 이벤트에는 사실 숨겨진 파라미터가 있다
바로 `AnimationEvent`타입의 파라미터다
이 파라미터를 가지고 현재 클립이 블렌드 트리에서 얼마의 가중치를 가지는지 알 수 있다
그 가중치를 가지고 약한 가중치를 가지는 애니메이션의 이벤트를 무시하면 된다
public void SetDisableThrottle(AnimationEvent ev)
{
// 현재 클립의 가중치가 0.9f 이상인 경우에만 true
if (ev.animatorClipInfo.weight > 0.9f)
m_CharacterLocomotion.CanMotorThrottle = false;
}
애니메이션에 이벤트를 연결할 때도
파라미터가 없는 함수를 연결하듯이 똑같이 연결하면 된다
하지만 이 방법에도 사실 한계는 있다
블렌드 트리에 연결된 애니메이션이 아주 많고, 블렌딩을 적극 활용하는 상황일 때
예를 들어 3가지 애니메이션이 있고 각각 0.3f, 0.3f, 0.33f의 가중치를 가질 때 항상 지배적인 가중치를 가지는 애니메이션을 거르기 힘들 수 있다
그런 경우라면 애니메이터 설계를 다시 하거나 애니메이터 외적으로 스크립트에서 현재 변수들을 가지고 판별해야 할 것 같다
🍎결론
이런 대단히 중요한 사실(`AnimationEvent`파라미터를 받을 수 있다는 것)을 왜 어디에도 안적어놨는지 모르겠다
🔗참조
'Unity > TroubleShooting' 카테고리의 다른 글
[Unity] 안드로이드에서 많은 리소스와 함께 빌드를 뽑을 때 AAPT2에러 (0) | 2024.08.24 |
---|---|
[Unity] 안드로이드14 크래시 "Writable dex file is not allowed." (0) | 2024.08.02 |
[Unity] 애니메이터 서브 스테이트 머신의 요상한 트랜지션 우선순위 (0) | 2024.05.24 |
[Unity] 어드레서블 리모트 경로 변경 후에도 기존 경로로 불러올 때 (0) | 2024.05.14 |
[Unity] 어드레서블 씬 로드 후 인스펙터에 프리팹 참조가 끊어질 때 (0) | 2024.05.13 |