맨 밑에 3줄요약 있음
아바타를 이제 막 만들기 시작한 갤러들이 하나같이 궁금해 하는 것이 있다.
표정이나 옷을 바꿀려고 토글을 누르면
왜 표정은 기본으로 돌아오지 않는 것이고 옷은 겹쳐지는지 말이다.
그리고 그 해결법이라고 제시하는 것은 하나같이 전부 "Write Defaults 켜라" 라고 말한다.
심지어 그 방법이 통한다.
한국사람이면 한번은 가봤을 "iY MMD World" 에도
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
Left Hand와 Right Hand 보다 계층적으로 상위에 있는(유니티 애니메이터 상에서 아래)
레이어의 모든 애니메이션 상태는 Write Default On 이여야 합니다. Write Default off인
state가 존재하면 표정 및 립싱크가 작동하지 않습니다. 위 내용을 이해하지 못했으면 모두
Write Default On을 체크하면 됩니다.
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
라고 Write Defaults 옵션에 대한 언급이 되어있다.
그러면 Write Default가 하는 일은 무엇이고 왜 이 옵션을 켜야하는지 알아보자
참고로 해당 글은 유니티에 대한 지식이 없는 사람을 대상으로
매우 긴 글로 설명을 하지만 최대한 쉽게 이해시키기 위해 작성되었습니다.
무지성으로 이 옵션을 키지말고 왜 키는지 이유를 알아보기 위해 작성되었으니
Write Defaults 옵션의 기능에 대해 완전히 이해한 사람이라면 보지 않으셔도 됩니다.
다만 VRChat 공식문서에 따르면 Write Defaults 의 권장 옵션 활성화 유무는 "비활성화" 이므로
이에 대해 대응이 가능하시면 Write Defaults 옵션을 비활성화 하는 것이 VRChat을 하는데에 유리할 수 있습니다.
잠시 SDK 2.0 시절로 돌아가보자.
그 시절에 아바타를 만들지 않은 사람도 존재하겠지만
그당시 유니티 버전은 2017.4.28f1 / 2018.4.20f1 버전이다.
그리고 이 버전에는 Write Defaults 라는 옵션이 없었다.
그래서 아바타에 옷을 입힐려고 한다면 애니메이션을 만들때
아래 사진과 같이 켜고싶은 옷을 켜고 그 외 나머지 모든 옷을 끄게 해주는 애니메이션이 필요했다.

(Casual 옷을 꺼낼려면 다른 모든 옷을 찾아서 애니메이션 프로퍼티로 추가 후 0을 줬어야 했다.)
3.0 으로 넘어와서 이렇게 처리를 하는 갤러도 존재할 것이다.
그리고 이 방식은 현재 VRChat 에서 권장하는 방식이다.
밑 사진에 나와 있듯 VRChat 에서는 Write Defaults 를 비활성화 한 상태에서 아바타를 만들자고 약속을 했다.

이렇게 하면 현재 2019.4.31f1 버전에 존재하는 Write Defaults 옵션의 활성 유무와 상관없이 내가 켜고 끄고 싶은 옷을 "안전"하게 바꿀 수 있다.
다만 이렇게 하면 치명적인 문제가 존재한다.
만약 자신의 아바타에 100개의 옷이 들어있고 (int 파라미터 하나로 이론상 옷 256개를 넣을 수 있다.)
101번 옷을 넣겠다고 하면
100번 옷 애니메이션을 복사 후 101번 옷을 복사한 애니메이션에 프로퍼티를 추가하여 101번 옷의 값에 1을 주고
나머지 1번부터 100번 옷의 애니메이션에 101번 옷 0값 프로퍼티를 수동으로 추가해줘야 한다.
한 아바타에 101개의 프로퍼티가 존재하는 애니메이션이 101개가 있다는 얘기이다.
프로퍼티가 늘어나면 그만큼 애니메이션 크기도 늘어나기에 다운로드 사이즈도 덩달아 늘어난다.
이 점을 보완하기 위해서 Write Default 라는 옵션을 사용할 수 있는데
Write Defaults 옵션은 말그대로 "기본" 상태를 다시 쓴다는 말이다.
내가 실제로 사용하는 아바타로 예를 들어보겠다.

- 하이어라키에서 Nxde 부터 Uniform 까지가 옷이고 다 꺼두었다.
- 애니메이터에서 위(idle) 부터 파라미터 값이 0이다.
- 모든 State의 Write Defaults 는 활성화 해두었고
- 모든 State의 애니메이션은 오른쪽 밑 Animation 처럼 해당 옷에 필요한 오브젝트만 1 처리 해두었다.
쉽게 말하면 위 짤의 Write Defaults 값은 현재 하이어라키에 있는 아바타이다.
로딩이 된 순간의 아바타가 Write Defaults 라고 생각하면 쉬울 것이다.
대부분 이렇게 아바타를 만들것이고 이렇게 만드는 것이 우리들이 아바타를 만들때 좋은 방식이다.
이렇게 하면 밑 움짤처럼 잘 작동한다.

그러면 이상황에서 파라미터가 0값인 idle에 Write Defaults 옵션을 비활성화 해보겠다.

상황설명
- 초기에는 모든 옷이 꺼져있고 옷의 파라미터값은 0이기에 정상적으로 idle 애니메이션의 프로퍼티대로 실행되어 기본옷을 입고 있음
- 초기에는 모든 옷이 꺼져있는 상황이 Defaults 값으로 Write 되어 있었기 때문에 다른 옷을 바꿔도 기본옷이 꺼지고 해당 옷이 켜짐
- 하지만 idle 은 Write Defaults 가 비활성화 되어 있었기 때문에 Defaults 값이 존재하지 않았기에 토글을 꺼서 파라미터 값을 0으로 만드는 순간 과거 Write 되었던 옷 3개가 같이 켜졌음
그러니까 idle State 에서는 Defaults 값이 Write 되어 있지 않았기 때문에
idle State 진입 시 켰던 옷 3개가 같이 켜지는 것임
이 현상을 해결하기 위해선
- 위에서 언급했던 모든 옷의 프로퍼티를 추가하거나
- 모든 State 의 Write Defaults 를 켜면됨
아래 움짤처럼 모든 옷의 프로퍼티를 추가하면 Write Defaults 를 활성화 하지 않아도
어짜피 모든 옷을 끄고 켜고싶은 옷만 켜기때문에 옵션을 비활성화 해도됨

다만 이렇게 한다고 하면 모든 애니메이션에 모든 옷의 프로퍼티를 다 넣어줘야 한다는 점이 있고
그렇게 하면 용량 문제로 이어질 수도 있기에 쓰지않는 방법이다.
하지만 공식문서 사진 마지막에도 존재하듯
Write Defaults 옵션을 활성화 해두는 것이 고급사용자에게는 유리할 수 있다고 하는것 처럼
우리는 iY MMD World 제작자/Booth 아바타 제작자들과 무언의 약속을 한 것이다.
Write Defaults 옵션을 활성화 해둬서 쓸때없은 프로퍼티 추가와 애니메이션 추가
아바타 외적인 요소(월드 등)을 제작 시 더욱 편하게 쓸 수 있도록 약속을 한 것이다.
Write Defaults 옵션을 비활성화 한 상태로 표정을 바꿨을때
모든 표정은 다 바뀌는데 Shift+F1 을 누르면 원상태로 돌아와야 하는데 안돌아오는 이유는
Shift+F1 표정을 담당하는 State에 애니메이션이 존재하지 않기 때문이다.
idle State에 표정 애니메이션을 만들어서 넣어주면 동작한다.
1아바타 1옷 아바타로 만드는 갤럼이 있을 것이다.
내가보기에도 가장 좋은 방법이지만
텍스처메모리 편에서도 얘기한거처럼 Crunch 텍스처가 하나라도 존재할 경우
아바타가 무겁던 가볍던 서버에서 갤럼 아바타를 불러올때 마다 해당 텍스처의 압축을 풀때 프라임 드랍이 생길 것이다.
매도 처음에 맞는게 낫다고 하나의 아바타에 5~6개의 옷을 넣어두고 텍스처 최적화 작업을 통해서 프라임 드랍을 최소화 하는것이 더 나을지도 모른다.
참고로 VRChat 에서 Write Defaults 옵션에 대해 비활성화 하자고 해서 비활성화를 해두고
MMD 에서 표정이나 립싱크를 움직이게 만들고 싶다면
1. 모든 State의 Write Defaults 옵션을 비활성화 한다.
2. FX 애니메이터에서 MMD 진입시 토글할 Bool 파라미터와 레이어를 하나 만든다.
3. 추가한 레이어의 Weight를 1로 설정하고 레이어에 Empty State 두개를 추가하고 두 State 에 "VRC Playable Layer Control" 을 추가한다.
4. Entry 에 연결된 State 는 Layer에 FX, Goal Weight 는 1을 주고
5. 연결되어 있지 않은 State 는 Layer에 FX, Goal Weight 는 0을 준다.
6. 두 State 를 연결하고 Entry 가 연결된 State에서 연결되어 있지 않은 State 로는 컨디션을 "True" 를 주고 반대편은 "False" 를 준다.
7. 플레이어블 파라미터에 추가한 Bool 파라미터를 추가, 플레이어블 메뉴에 추가한 Bool 파라미터를 켜고 끌 수 있도록 한다.
위 설정은 추가한 Bool 파라미터를 True 시 FX 애니메이터 자체를 무효화 시킨다.
그래서 iY MMD World 에서 "스테이션 진입시" 라는 내용은 아바타가 VRChat 제공 파라미터인 "InStation" 이 True 일때를 얘기하고
스테이션 진입 전 해당 메뉴를 토글하여 FX 애니메이터의 Weight를 0으로 만들고 진입하면
Write Defaults 옵션이 비활성화 되어 있어도 쉐이프키 및 립싱크가 정상작동 한다.
하지만 이 귀찮은 일을 하기 싫으니 그냥 FX 애니메이터에 있는 모든 State의 Write Defaults 옵션을 켜두도록 하자.
Write Defaults 옵션을 활성화 한다고 아바타 최적화가 안좋아지는 것은 아님
대부분 Write Defaults 옵션을 활용하는 레이어는 표정/옷이고
대부분 그 레이어는 Any State 를 이용한 경우가 대다수임
Any State 에서 각 State로 연결되는 트랜지션 클릭 후
조건 설정할 때 "Can Transition To Self" 체크 해제하자
3줄 요약
- 이 문장을 봤다면 그냥 FX 애니메이터의 모든 State에 Write Defaults 옵션켜라. 귀찮은거 다 안다.
- Any State 연결된 State 는 전부 "Can Trasition To Self" 옵션 체크하자.
- 밑에 다른글도 보고 최적화 다들 하자. 내가 할 수 있는 최적화는 여기까지
1. 다운로드사이즈/텍스처메모리 최적화 방법
https://gall.dcinside.com/mgallery/board/view/?id=vr&no=2876692&search_head=50&page=1
2. FX 애니메이터 최적화 방법
https://gall.dcinside.com/mgallery/board/view/?id=vr&no=2878486&search_head=50&page=1
#표정
#셰이프키
#쉐이프키
#옷장
#옷
#WriteDefaults
#Write Defaults