✌️개요
애니메이션 작업을 하다가
서브 스테이트 머신(이하 "SM")끼리의 트랜지션이 자꾸 의도대로 안되는 문제에 직면했습니다
검색해봐도 문제와 정확히 일치하는 케이스도없고 머리아파 하던중 의외로 이상하고 간단한 해결법이어서
기록합니다
🔥문제
아래 그림과 같이 3개의 SM으로 구성된 애니메이터가 있다고 치겠습니다 (보기 쉽게 기록하기 위한 예시입니다)
조건
- `BaseSM → SM1`으로 가는 트랜지션
- `Condition` 없음
- SM내부 애니메이션에서 Exit노드로의 트랜지션 `HasExitTime = true`
- `BaseSM → SM2`로 가는 트랜지션
- `Condition = Fire트리거`
- SM내부 애니메이션에서 Exit노드로의 트랜지션 `HasExitTime = false`
이런 구성에서 `BaseSM`에있는 애니메이션이 실행중일 때
`Fire`트리거가 발동되면 당연히 `SM2`로 트랜지션 될 것 이라고 예상했습니다
그런데 결과는 `SM1`으로 트랜지션 됩니다
트리거가 리셋된것도 아니고,
`Fire`트리거가 발동되면서 `BaseSM`내부에서 돌아가던 애니메이션은 ExitTime에 도달하기 전에 나온게 맞습니다
이걸로 1시간은 넘게 헤맸는데 해결법은 좀 허탈했습니다
🍎원인 및 해결
일단 정확히 이 문제에대한 문서를 찾거나 포럼 답변을 찾은건 아닙니다
그래서 시행착오로 확인한 해결법이기에 틀린 정보가 있을 수 있습니다
애니메이터에서 `BaseSM`스테이트를 클릭해 보면 인스펙터에서 해당 스테이트의
나가고 들어오는 트랜지션을 볼 수 있습니다
해당 부분을 자세히 보면 드래그로 순서를 변경할 수 있는 홀더가 있습니다
이 순서가 트랜지션의 우선순위입니다
`BaseSM`내부에서는 `Fire`트리거가 발동됨으로써 Exit노드로 나왔지만
`BaseSM`에서 이제 어디로 갈지는 별개입니다
위 스샷의 상황이면
첫번째 트랜지션인 `BaseSM → SM1`을 먼저 검사하게 되고
`BaseSM → SM1`은 `Condition`이 없기때문에 항상 `true`가 됩니다
따라서
`Fire`트리거가 켜져있지만 우선순위가 낮은 트랜지션인 `BaseSM → SM2`는 조건을 확인하지도 않고
`BaseSM → SM1`트랜지션이 실행됩니다
해결방법은 당연히
드래그로 트랜지션의 우선순위를 바꿔주면 됩니다
참고로 트랜지션의 우선순위는 SM만이 아니라 일반 애니메이션 스테이트에도 적용됩니다
끝!
'Unity > TroubleShooting' 카테고리의 다른 글
[Unity] 안드로이드14 크래시 "Writable dex file is not allowed." (0) | 2024.08.02 |
---|---|
[Unity] 애니메이터 블렌드 트리 이벤트 동시 실행 문제 (0) | 2024.07.07 |
[Unity] 어드레서블 리모트 경로 변경 후에도 기존 경로로 불러올 때 (0) | 2024.05.14 |
[Unity] 어드레서블 씬 로드 후 인스펙터에 프리팹 참조가 끊어질 때 (0) | 2024.05.13 |
[Unity] Addressable로 불러온 모델이 에디터에서 핑크(마젠타) 쉐이더로 나올때 (0) | 2024.05.12 |