TA: 모듈형 캐릭터 (Modular Character)
모듈형 캐릭터
RPG에서 캐릭터마다 장착하는 장비에 따라 외형이 달라지는건 많이 보았을 것이다. 칼이나 무기같은 정적으로 있는 채로 몸에 달리는 물체들도 있겠지만, 옷처럼 캐릭터를 따라 변형되며 움직여야 하는 매쉬들도 있을텐데 각 부위를 모듈로 만들면 이를 쉽게 관리할 수도 있다. 사실적으로 휘날리는 망토나 옷을 원한다면 카오스 클로스(Chaos Cloth)같은 솔버(Solver)를 사용하는 방법도 있겠으나, 지금은 그것보단 부위별로 메쉬를 교체해가며 여러 모습의 캐릭터를 만들 수 있는 모듈형 캐릭터(Modular Character)를 만들어보도록 하자.
방법
언리얼 엔진 공식문서 기준으론 크게 3가지 방법을 안내하고 있다.
| 방법 | 리더 포즈 컴포넌트 | 메시 포즈 복사 | 스켈레탈 메시 병합 |
|---|---|---|---|
| 특징 | 블루프린트에서 리더 포즈 컴포넌트 사용 | ABP에서 기준 메시의 애님 복사 | |
| 장점 | 애니메이션 계산 비용은 1개만큼으로 적어짐 | 큰 설정 없이 단순 복사 가능 필요시 메시마다 다른 애님 적용 가능 | 1개 메시만 호출하도록 해 드로우콜과 애님등 이후의 비용을 줄일 수 있음. |
| 단점 | 애니메이션을 그리는 드로우콜 비용은 그대로. 본 구조가 부모-자식간 호환 가능해야 함. 자손 메시의 다이나믹본, 애님 실행 불가 | 매시별로 렌더링 비용과 드로우콜 증가. | 처음 병합시 비용 존재. 모프타겟등 개별 메시에 대한 수정 필요시 제약 있음. |
캐릭터의 수가 제한적이거나 성능에 큰 부담이 없는 프로젝트라면 리더 포즈 컴포넌트를 설정하는 방법이나 메시 포즈를 복사하는 방법도 고려해볼 수 있겠다. 다만 현재 하고있는 프로젝트 기준으론 초기 다수의 NPC를 세팅해놓고 실시간으로 움직이는게 중요하니, 성능에서의 이점이 큰 스켈레탈 메시를 병합하는 방식을 살펴보도록 하자.
스켈레탈 메시 병합
먼저 사용하기 위해서는 Skeletal Merging 플러그인을 활성화해주어야 한다.
그러고 나면 MergeParams에 USkeletalMesh인 사용할 메시들을 넣어놓고, USkeletalMergingLibrary::MergeMeshes()를 이용해 하나의 메시로 합칠 수 있다. 어떤 스켈레톤을 기준으로 사용할지도 정해줘야 하는데, 같은 스켈레톤을 사용한다면 어느 메시에서 얻어오거나 별도로 할당된 스켈레톤을 사용해도 상관은 없다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//병합용 파라미터 세팅
FSkeletalMeshMergeParams MergeParams;
MergeParams.MeshesToMerge = {
UpperBodyMesh,
LowerBodyMesh,
HeadMesh,
HandsMesh
};
MergeParams.Skeleton = UpperBodyMesh->GetSkeleton();
//병합전 스켈레톤 갱신 여부, 현재는 존재하면 갱신.
MergeParams.bSkeletonBefore = MergeParams.Skeleton != nullptr;
//병합
USkeletalMesh* MergedMesh = USkeletalMergingLibrary::MergeMeshes(MergeParams);
블루프린트에서도 원한다면 노드를 활용해 병합 기능을 활용할 수 있다.
랜덤으로 만들고자 한다면 사용할 메시들을 부위별로 목록에 넣어놓고 랜덤선택하는 방법도 있다. 문제는 새로운 조합을 만들 때마다 병합 연산과 렌더링 비용이 발생한다는 점이다. 이미 생성한 조합은 캐싱하고 같은 조합의 NPC가 이를 공유하도록 하면 반복 병합 비용과 중복 메시 메모리를 줄일 수 있다. 다만 캐릭터별 렌더 드로우콜 자체가 없어지는 것은 아니다.
또한 머티리얼 슬롯에 의상 텍스처를 바꾸거나, 피부 머티리얼 색을 바꾸는 식으로 여러 외형을 보여주면서도 동일한 메쉬를 사용해 비용을 절약하는 방법도 있겠다. 메쉬를 다양하게 하는 편보단 텍스처만 달리해서 갈아끼우는걸로 해결된다면 일반적으론 그편이 비용은 적다.