이번 게시글은 우여곡절이 많아서 억울해서 주저리주저리 씀.
상황
에셋스토어에서 다운한 에셋이
부위별로 메쉬가 교체 가능한 캐릭터 모델이었다.
메쉬를 교체하는 방식을 내 입맛대로 구조를 바꾸고, 애니메이션을 적용하는 과정을 적었다.
메쉬 교체하는 방식 바꾸기
캐릭터 모델을 임포트했는데, 모델링 구조가 너무 마음에 안들었다.
대략 부위마다 이런 구조였다.
(모자 부위)
- 모자 1 (모자 1을 사용하려면 이것만 On, 다른 것은 Off하는 방식.)
- 모자 2
- 모자 3
어떻게 개선할까하다가,
모자 1, 모자 2, 모자 3와 같은 데이터 정보는 따로 클래스를 만들어서 보관하고,
각 부위에 데이터만 교체하는 구조로 새로 만들면 되겠다고 생각했다.
(모자 부위)
- 모자 (데이터만 교체.)
데이터 정보(모자 1, 모자 2, etc.) 보관해두었다가 교체시키기
처음 생각은 'Inspector 창에 보이는 설정 값만 보관했다가 교체하면 되겠다.' 였다.
그래서 저렇게 3종류의 데이터를 보관했다.
보관해두었던 데이터를 세팅하려하니,
Skinned Mesh Renderer의 Bounds 속성이 Get만 된다. Set이 안된다 ㅎㅎ...
'Bounds 속성은 카메라에 그려지는 범위니까 임의로 크게 설정해놓으면 되겠지.' 해서 이 설정 값은 빠르게 포기했다.
그래서 남은 데이터 값 2개 Mesh와 Root Bone을 설정해주었더니 와우!! 보이지가 않는다.
구글링을 엄청나게 한 결과, Inspector에 보이지 않는 Bones 값도 저장해야한다.......... 이게 뭐람.
이렇게 보관했다가 세팅해주니까 잘 작동한다.
SkinnedMeshRendererInfo 클래스는 데이터를 저장해두려고 내가 임의로 만든 클래스이다.
애니메이션 적용
파츠는 교체가 잘 되니까 뿌듯해서 애니메이션을 추가해보려했다.
Mixamo 사이트에 들어가서 다운하려는데, 캐릭터를 가져다놓아도 뼈를 인식 못한다. 분명 뼈가 있는데??
조금 귀찮지만, 이렇게 하라고 한다.
이 모델은 어떻게 만들었길래 이렇게 불친절한걸까..... 원래 파츠 교체하는 캐릭터 모델들은 다 이런가?
아무튼 영상처럼 기존과 다른 캐릭터를 다운받아서 애니메이션을 적용한 뒤, 다운로드했다.
이후에 뼈도 설정해주었다.
Character is not in T-pose 가 뜨길래, '또 뭔 오류일까 ㅎㅎ' 했는데, 무시해도 될 것 같다.
내 생각엔 아마도 T-Pose가 아니면, 애니메이션 리타기팅 결과가 이상하게 나와서 경고해주는 것 같다.
근데 충분히 T-Pose 같아서 딱히 건드릴 필요는 없겠다.
가만히 서 있는 애니메이션(Idle)을 다운받아서 적용했다.
근데 움직이지를 않는다.
하나를 구현할 때마다 하나가 문제 생긴다. 하하. 정말 재밌다.
뭐가 문제일까 하나하나 체크해보다가, RootMotion을 체크하면 작동을 하는 것을 발견했다!!!
기쁜 마음에 스크립트로 달려가서 Apply Root Motion을 체크하는 코드를 추가했다.
GetComponent<Animator>().applyRootMotion = true;
체크가 되었는데 변하지를 않는다.
아까 보이지 않았던 데이터를 저장해야하는 것도 살짝 억울했는데, 이거까지 안되니까 더 억울했다.
유니티는 왜 값들을 보여주는 곳에 모든 값을 보여주지 않는 걸까.
같은 체크표시를 하는 건데도 저거는 뒤에서 뭐가 돌아가나보네.
도대체 '저기서 체크하는 거랑 코드에서 체크하는 거랑 뭐가 다를까.' 한참을 생각했다.
뭐라도 하나 더 하니까 다른 결과가 나왔겠지. 흠..
체크하면서 기본 값들을 한번 더 초기화할 것 같다!!!! 라는 생각이 갑자기 들었다.
Animator에서 초기화를 해주는 함수를 찾아보았다.
Rebind 함수를 보자마자, 이걸 하면 될 것이라는 확신이 섰다. 이럴 때 유레카를 외치나보다.
잘 작동한다. 와!!!!
docs.unity3d.com/ScriptReference/Animator.Rebind.html
느낀 점
모를 땐 몰랐는데, 알고 나니까
내가 구조를 바꿨으면 당연히 Rebind()를 해야하는 거 아닌가? 라는 생각이 든다.
뭐를 잘못하고 있는지 모르는 게 가장 무서운 것 같다.
안 고치고, 다른 캐릭터 에셋으로 바꿀 수도 있었는데
내가 유니티한테 지는 것 같아서, 진짜 이건 꼭 해결한다는 생각으로 하루종일 이것만 생각했다.
그래도 글에 주저리주저리 내 상황을 적으니까 마음이 정리된다. 휴.
간단한 기능이지만, 나 이렇게 고생해서 만들었다!! 이런 느낌..?
'Unity' 카테고리의 다른 글
Clocking 효과 (0) | 2021.08.10 |
---|---|
기본 라이팅 연산 (0) | 2021.08.09 |
[Unity Github Desktop] CRLF 오류 (2) | 2019.12.10 |
[Unity] Rendering Pipeline 정리 3 (과정) (2) | 2019.11.28 |
[Unity] Rendering Pipeline 정리 2 (기법) (0) | 2019.11.28 |