지난번 친절한 답변 감사드립니다.
1) 장비 변경에 관련되어
부담없이 옷이나 장비들을 언제든지 이미지 파일(아틀라스)에 그려서 추가해주고 싶습니다.
여러 종류의 장비들이 숫자가 재각각인 경우
(ex: 머리 20개, 상의 4개, 바지 8개 이런식으로)
https://rainyrizzle.github.io/kr/AdvancedManual/AD_CharacterCostume.html
위 예제대로 한다면 아틀라스를 여러개를 만들면 되긴 하겠지만,
어느 아틀라스는 머리만 덩그라니 있고 하는 형식이 되어
제작에서도 게임에서도 비효율적일거라 생각됩니다.
그렇다면
https://www.rainyrizzle.com/apgs-1-6-kor
의 예제처럼 모디파이어를 통하여 교체를 하는게 가장 옳은걸까요?
아니면 다른 기능이 있을까요?
2) 루트 유닛을 두개 만들어서 그런지
유니티 Game 윈도우와, Scene 윈도우에서 이미지 여러개가 겹쳐보입니다.
(당연히 게임을 시작하면 실행중인 애니메이션 하나만 보입니다.)
게임 실행에는 크게 중요하지 않은 문제지만 루트 유닛이 여러개인 경우
윈도우에서 이미지 대표 루트유닛 하나만 보는 방법이 있을까요?
안녕하세요.
두개의 질문에 대하여 답변을 드립니다.
1) 이미지를 교체하는 방식으로는 경우에 따라 여백이 많을 수 있어서 다소 비효율적이긴 합니다.
현재의 AnyPortrait 버전에서는 이 문제를 해결할 방법이 없어서, 가능한 이 접근 방법 내에서 해결을 해야할 것 같습니다.
질문주신 모디파이어의 Show/Hide 기능도 같이 활용하여 이 문제를 해결할 수 있을 것 같습니다.
저희가 생각해본 아래의 아이디어가 프로젝트에 적합한지 한번 고려해보시는 것도 좋을 것 같습니다.
(1) 교체되는 파츠의 종류에 따라 다른 아틀라스 이미지를 준비합니다.
기존에는 하나의 아틀라스 이미지에 머리, 몸, 옷, 장비 등이 모두 포함되어 있었다면, 이번에는 "머리 및 얼굴 표정, 모자"에 대한 아틀라스, "상체와 상의, 망토"등에 대한 아틀라스, "하체와 하의"에 대한 아틀라스 등 교체되는 부위의 이미지들을 따로 묶어서 이미지를 준비합니다.
- 기존 : 모든 장비와 모든 신체를 하나의 이미지로 묶음
- 변경 : "머리 부분 / 상체 부분 / 하체 부분 / 발 부분"을 각각의 아틀라스 이미지로 묶음
(2) 장비를 교체할 때 해당 부위의 아틀라스 이미지 텍스쳐만 교체합니다.
(3) 만약 장착되지 않은 부위의 경우 모디파이어의 Show/Hide 기능을 이용하여 메시를 숨깁니다.
위 방법은 기존의 튜토리얼과 비슷하지만, "각 부위들의 이미지를 따로 준비한다"라는 점에서 차이가 있습니다.
이를 통해서 아틀라스 이미지가 공백으로 인해 낭비되는 문제를 최소화할 수 있습니다.
이미지 개수가 기본적으로 부위에 따라 "드로우콜"이 증가되는 문제가 있지만, 게임 중에 텍스쳐가 교체되면 드로우콜이 완벽히 최적화되지 않기 때문에 큰 차이가 없을 것입니다.
비어있는 아틀라스를 최소화하기 위해, 비어있는 메시를 모디파이어로 숨긴다는 점도 중요합니다.
위 방법에서 중요한 것은 "각 부분의 아틀라스 이미지들이 하나의 캐릭터를 구성하는 것"입니다.
여러개의 PSD 파일을 하나의 캐릭터로 만드는 과정이 다소 복잡하여 아래와 같이 설명을 첨부합니다.
<여러개의 PSD 파일로부터 하나의 캐릭터 만들기>
AnyPortrait의 Demo에 등장하는 캐릭터 이미지를 각각 머리, 상체, 하체로 나누었습니다.
원래 하나였던 파일에서 레이어들을 구분하여 각각 저장한 상태입니다.
(레이어들만 따로 저장하고 그외 레이어들의 위치, 이미지의 크기를 변경하지 않아야, 별도의 과정없이 메시들이 병합하기 좋은 적절한 위치에 생성됩니다.)
각각의 파츠에 해당하는 PSD파일들을 임포트합니다.
3개의 PSD 파일을 가져오면 위와 같이 3개의 머리, 상체, 하체에 대한 각각의 아틀라스 이미지가 완성됩니다.
이후 캐릭터의 장비 교체시 필요한 부분의 이미지만 만들어서 교체하면 되므로 조금 더 효율적인 아틀라스 이미지 관리가 가능할 것입니다.
문제는 현재 "3개의 메시 그룹"이 존재한다는 점입니다.
이 메시 그룹들을 하나의 루트 캐릭터로 합쳐봅시다.
(1) 새로운 "루트 캐릭터" 메시 그룹을 생성합니다.
(2) + 버튼을 누릅니다.
(3) Mesh Group 탭을 선택합니다.
(4) Shift 키를 눌러서 3개의 메시 그룹들을 선택합니다. (Select All을 누르면 일반 메시들까지 모두 추가되므로 주의하세요.)
(5) Add 버튼을 누릅니다.
이제 "루트 캐릭터" 하위에 머리, 상체, 하체에 대한 3개의 메시 그룹이 속하게 바뀌었습니다.
이대로 마무리해도 될 것 같지만, 메시의 레이어 순서를 바꿔야하는 문제가 있습니다.
따라서 "자식 메시 그룹의 메시"들을 모두 "루트 캐릭터"에 속하도록 "이전(Migrate)"하는 작업을 해야합니다.
여기서는 간단히 과정만 설명 드리며, 자세한 설명은 다음의 링크를 참고해주세요.
https://rainyrizzle.github.io/kr/AdvancedManual/AD_DuplicateMigratingSubObj.html
(1) 옮겨야 하는 메시 하나를 선택합니다.
(2) Migrate 버튼을 누릅니다.
(3) "루트 캐릭터"를 선택합니다.
(4) Select 버튼을 누르면 경고 메시지가 나타납니다.
(5) 확인 버튼을 누릅니다.
이제 해당 메시의 소속이 자식 메시 그룹에서 루트 캐릭터로 변경되었습니다.
같은 방법으로 필요한 모든 메시에 대해서 소속을 "루트 캐릭터"로 옮깁니다.
이 작업은 다중 선택이 불가하여 각각 시행해야하므로 다소 번거롭습니다.
이점에 대해서는 양해부탁드립니다.
이제 비어버린 3개의 자식 메시 그룹들을 삭제합니다.
(1) 3개의 자식 메시 그룹을 Ctrl키를 누른채로 한꺼번에 선택합니다.
(2) Detach 버튼을 누릅니다.
(3) 경고 메시지가 나오는데 여기서도 Detach 버튼을 누릅니다.
이제 3개의 메시 그룹들은 루트 캐릭터로 부터 분리가 됩니다.
메시들이 없어져서 불필요해진 3개의 메시 그룹들을 Hierarchy 에서도 삭제합시다.
(1) 비어버린 3개의 메시 그룹들을 하나씩 선택합니다.
(2) Remove Mesh Group 버튼을 누르고
(3) 메시지의 Remove 버튼을 눌러서 삭제합니다.
이제 루트 캐릭터 메시 그룹만 남게 됩니다.
메시들의 소속을 루트 캐릭터로 옮긴 것은 레이어 순서를 옮기기 위함입니다.
(1) 순서를 바꾸고자 하는 메시를 선택합니다.
(2) 레이어 순서 변경 버튼을 이용하여 적절하게 순서를 바꿉니다.
이것을 루트 유닛(Root Unit)으로 설정하면, 이제 3개의 아틀라스 이미지를 가지는 하나의 캐릭터가 완성됩니다.
2) 게임이 실행중이 아닐 때는 유니티 씬에서 항상 모든 루트 유닛(Root Unit)이 나타납니다.
저희가 이 부분은 고려하지 못했습니다. 불편을 드려서 죄송합니다.
현재로는 다음의 방법을 사용하여 불필요한 루트 유닛을 숨겨서 작업을 하셔야 합니다.
(1) Bake된 GameObject를 보시면 그 하위에 루트 유닛들이 GameObject로서 각각 존재합니다.
(2) 작업에 불필요한 루트 유닛의 GameObject를 Inspector에서 비활성화하여 숨깁니다.
(3) 모든 작업이 끝나고 게임을 시작하기 전에 비활성화한 GameObject들을 다시 활성화하여 화면에 나타나게 합니다.
질문 주신 이슈를 툴 개발시에 미리 예상하지 못하여, 임시로 아이디어를 내어 답변을 드렸습니다.
이 문제를 해결하기 위해 다른 해결 방법이 필요하거나 저희가 개발을 해야할 수도 있습니다.
문제가 해결되지 않았거나 더 궁금한점, 또는 의견이 있다면 글을 남겨주세요!
감사합니다.
Eng)
Q1) If the image is replaced and the character's costume is changed, an Atlas image with an unnecessarily empty space is sometimes required.
A1) Resources can be optimized by configuring different Atlas images for each major part (ex. head, upper body, lower body).
(The description with images is "how to create a single character from multiple PSD files.)
Q2) How to hide unnecessary Root Units in Unity Scene
A2) You can hide the GameObject corresponding to the Root Unit by disabling it directly in the Inspector.