어제 다운로드사이즈/텍스처메모리 최적화 방법 게시글을 올리고
FX 애니메이터의 Any State 가 프레임 드랍의 주범이라는 댓글을 달았던 갤러가 있어서
이에 관해서도 이야기를 해볼까 한다.
참고로 해당 게시글은 Unity 엔진의 기본지식이 없다는 것을 전제로 한다.
Unity 엔진의 기본지식이 있는 사람이 VRChat 아바타를 제작한다고 한다면
애초에 Any State 및 Can Transition To Self 의 기능이 무엇인지 정확히 알고 있을테니
내가 밑에서 할 말이 무엇인지 알 것이고 그렇게 했을 것이다.
그래서 글이 매우 길지만 다 중요한 내용이니
남들한테 "님 아바타보면 랙걸리니 하이드아바타/블락할게요" 소리를 듣고 싶지 않으면 천천히 정독해주길 바란다.
우선 해당 게시글을 보기위해선 Any State와 Can transition To Self 옵션이 뭘 하는 녀석인지를 알아야된다.
Unity 공식 문서에 따르면
Any State는 말그대로 "모든 상태" 라는 뜻을 뜻하며
해당 레이어의 어떤 노드에 State 되어 있던 간에
조건(파라미터)을 바꾸면 그에 만족하는 노드로 State 되게 하는 것임.
Can Transition To Self 는 Any State에 연결된 노드의 트렌지션에서만 나오는 옵션으로
어떤 상태에 있을 때 그 상태에서 동일한 상태로 돌아갈 수 있는지의 유무를 결정함
A 상태인데 A 상태에서 다시 A 상태로 갈 수 있는지의 유무임
텍스트로 하면 이해가 안되니
아래 사진으로 예시를 들어보겠음
(Action 이 Any State 와 Can Transition To Self 의 예시로 가장 들기 좋아 보여서 준비했으니 참고하면됨)

- 적용 사항
/ New State 노드에는 모션이 존재하지 않고 Test 파라미터가 0일때 전이되도록 트랜지션을 설정함
/ OrangeJustice 노드에는 모션이 존재하고 Test 파라미터가 1일때 전이되고 Can Transition To Self 옵션을 활성화 해두었음
/ 둘다 Write Defaults 옵션을 활성화 해놨기에 서로 겹쳐질 일은 없음
/ 사용자 파라미터 및 액션메뉴에도 Test 파라미터를 0 혹은 1로 지정할 수 있도록 토글을 만들어 두었음
위 상태로 Test 파라미터를 1로 만들어보겠음

그러면 위 움짤처럼 캐릭터가 1프레임만 움직이고 움직이지 않음
(이상태로 Test 메뉴를 한번더 누르면 차렷으로 돌아옴)
이처럼 Can Transition to Self 옵션은 해당 노드에서 그 노드로 다시 갈 수 있는지를 확인함
메뉴로 Test 파라미터를 1로 만들었으니
Any State 는 Test 파라미터 값에 의해 계속 동작하게 되어 해당 노드로 State 될것이고
그 때문에 캐릭터는 해당 모션의 1프레임만 계속 재생하게됨 (사실상 1프레임 재생도 아님, 그저 계속 켜질뿐임)
그럼 Can Trasition To Self 옵션을 비활성화 하면 어떻게 될까?

Can Trasition To Self 을 비활성화 하게 되면
Test 파라미터의 값이 바뀌면서 Any State 노드에서 OrangeJustice 노드로 State 가 전이되게 되고
그 이후 Can Trasition To Self 옵션이 비활성화 되어 있기에 최초 1번만 State가 바뀌게 OrangeJustice 노드의 애니메이션을 재생하게 됨
쉽게 말하면 Any State 가 해당 파라미터 조건에 맞는 노드로 State가 바뀌게 명령을 계속해서 내보내고 있기 때문에
Any State 에 연결된 노드들은 전부 Can Trasition To Self 옵션을 비활성화 해줘야함
최초의 명령만 내리고 파라미터가 변경되는 경우에만 Any State가 동작하여 명령을 수행하도록 해야함
이제 이 글을 본 갤러들은 Any State 와 Can Trasition To Self 옵션의 역할을 알게 되었으니
FX 애니메이터로 돌아와보자
밑 사진은 현재 나의 매쉬변경을 위한 레이어의 화면이다
(노드/State)

(트랜지션)

이처럼 대부분의 사람들은 위 사진처럼
Left/Right Hand 의 레이어와 동일하게 모든 노드를 Any State와 연결해두었을 것이고
MMD 를 위해서 모든 노드의 Write Defaults 를 활성화 해두었을 것이며 (Write Defaults 에 대한 이야기도 조만간 올리겠음)
나같은 경우 Can Transition To Self 옵션을 비활성화 해두었지만 대부분은 체크가 되어있을 것이다.
(애니메이터에서 Any State 과 트랜지션 된 노드에만 해당 옵션이 나옴)

그리고 매쉬변경을 위한 애니메이션은 위 사진처럼 대부분 1키프레임으로 동작을 하게 만들어 두엇을 것이다.
해결방법은 Any State와 연결된 모든 노드들의 Can Transition To Self 옵션을 비활성화 해두는 것이다.
위 Action 애니메이터로 예시를 들었다시피 Can Transition To Self 옵션때문에 1키프레임만 재생하게 만들어두니
1키프레임만 존재하는 애니메이션에 Can Transition To Self 옵션을 활성화 해둘 이유도 없다.
옵션을 활성화하면 계속 파라미터에 의해 해당 노드로 State 를 전이시키니 자원만 더 잡아먹는다.
그럼 일부 갤러들은 "Any State 연결을 안하면 해결되는 문제 아님?" 이라고 말할 것이다.
이 의문점은 직접 해보면 알게될 문제이지만 굳이 지금 아바타 옷 잘 바뀌는데 해볼 이유는 못 찾을거 같으니 내가 대신 해보았다.
Any State 를 연결하지 않고 메쉬를 변경하고 싶다는 사람은 밑 사진처럼 해주면된다.
(옷은 3개로 예시를 들겠다)

Any State 를 연결했을때와의 차이점은
Entry 단계에서의 상태를 정의 해줘야 하기에 Idle 애니메이션에서 각 애니메이션 노드로 연결하였고
각 애니메이션 노드에서 Exit 로 빠져줘야 애니메이션의 변경이 가능하기때문에
애니메이션에서 Exit 로 가는 트랜지션에 NotEquals 컨디션도 넣어줘야 한다
위처럼 한다면 어떻게 되는지 밑 움짤을 보자

움짤 초반에 각 애니메이션 노드의 트랜지션을 보여주면서
모든 트랜지션의 컨디션을 보여줬음
그리고 옷을 바꾸면 옷이 바로 바뀌는 것이 아닌
Idle 애니메이션 노드를 한번 거치고 바뀌게 된다
그래서 옷이 바로 바뀌지 않고 idle 옷이 잠깐 보이게 된다.
그럼 또 일부 갤러들은 "모든 노드를 다 연결하면 되지 않음?" 라고 말할 수 있는데
맞는 말이다. 모든 노드에 가정할 수 있는 모든 트랜지션과 컨디션을 다 때려박으면된다.
하지만 옷이 3개면 연결해줘야 하는 트랜지션은 2^3 인 8개 이고 옷이 4개면 2^4인 16개 이다.
이 계산법이 맞지는 않지만 아무튼 Any State 의 Can Transition To Self 옵션을 비활성화하면 될 일을 굳이 귀찮게 하고 싶지는 않다.
따라서 이 글을 본 갤러들은
다운로드사이트/텍스처메모리 최적화 방법 글과 더불어
자신의 아바타를 더욱 쾌적하게 만들어서 많은 사람들과 즐겁게 게임하는 갤러들이 되었으면 좋겠다.
다음에는 Write Default 사용 방법으로 돌아오도록 하겠다.
3줄 요약
- FX 애니메이터의 모든 레이어에 Any State 와 연결된 모든 트랜지션의 Can Transition To Self 옵션을 꺼라
- 안끄면 계속 옷을 실행시키므로 자원을 소비하게 된다.
- 그러기 싫으면 노가다 하자.