PART 1 · 강의 3/3

메시 머징과 모듈화

Mesh Merge, Master Pose Component, SkinnedMeshComponent를 활용한 모듈러 캐릭터 시스템을 심층 분석합니다.

SECTION 01

모듈러 캐릭터 접근법

캐릭터 커스터마이징을 위한 세 가지 핵심 전략

RPG나 MMO에서 캐릭터의 의상, 장비, 헤어 등을 실시간으로 교체하려면 모듈러 캐릭터 시스템이 필요합니다. UE5에서는 세 가지 주요 접근법을 제공합니다.

1. Master Pose Component

하나의 리더 메시가 본 트랜스폼을 계산하면, 팔로워 메시들이 동일한 본 트랜스폼을 복제하여 사용합니다. 드로우콜이 파트별로 분리되지만, 셰이더 계산은 절약됩니다.

2. Skeletal Mesh Merge

여러 스켈레탈 메시를 하나의 메시로 합칩니다. 드로우콜을 최소화할 수 있지만, 런타임 머지 비용이 발생하며, 머지 후 개별 파트를 교체하려면 다시 머지해야 합니다.

3. Copy Pose from Mesh

AnimBP의 Copy Pose from Mesh 노드로 리더 메시의 포즈를 복사합니다. 팔로워가 독립적인 AnimBP를 가질 수 있어 추가 애니메이션 로직(보조 동작 등)을 적용할 수 있습니다.

접근법 드로우콜 본 평가 비용 런타임 교체 추가 AnimBP
Master Pose 파트별 분리 리더만 계산 즉시 교체 불가
Mesh Merge 머티리얼 수만큼 단일 메시 재머지 필요 불가
Copy Pose 파트별 분리 각각 평가 즉시 교체 가능
SECTION 02

Master Pose Component 심화

SetLeaderPoseComponent의 내부 동작과 본 매핑 메커니즘

SetLeaderPoseComponent(이전 명칭: SetMasterPoseComponent)를 호출하면, 팔로워 컴포넌트는 자체 애니메이션 평가를 건너뛰고 리더의 본 트랜스폼 버퍼를 직접 참조합니다.

Master Pose 동작 흐름
[Leader SkeletalMeshComponent] ├── AnimInstance → AnimGraph 평가 → 본 트랜스폼 계산 └── ComponentSpaceTransforms[] (결과 버퍼) ↓ 참조 (복사 아님) [Follower SkeletalMeshComponent - 헤어] └── LeaderBoneMap[] 을 통해 인덱스 매핑 ↓ 참조 [Follower SkeletalMeshComponent - 장비] └── LeaderBoneMap[] 을 통해 인덱스 매핑
C++
// 모듈러 캐릭터 설정 예시 void AModularCharacter::SetupModularParts() { // 리더 메시 (바디) BodyMesh = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT("BodyMesh")); BodyMesh->SetSkeletalMesh(BodySkeletalMesh); BodyMesh->SetAnimInstanceClass(AnimBPClass); // 팔로워 메시 (헤어) HairMesh = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT("HairMesh")); HairMesh->SetSkeletalMesh(HairSkeletalMesh); HairMesh->SetupAttachment(BodyMesh); HairMesh->SetLeaderPoseComponent(BodyMesh); // 팔로워 메시 (장비) ArmorMesh = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT("ArmorMesh")); ArmorMesh->SetSkeletalMesh(ArmorSkeletalMesh); ArmorMesh->SetupAttachment(BodyMesh); ArmorMesh->SetLeaderPoseComponent(BodyMesh); } // 런타임 파트 교체 void AModularCharacter::ChangeArmor(USkeletalMesh* NewArmor) { ArmorMesh->SetSkeletalMesh(NewArmor); // SetLeaderPoseComponent는 메시 교체 후에도 유지됨 }
주의: 본 매핑 불일치

리더와 팔로워의 USkeleton이 다르거나, 팔로워에 리더에 없는 본이 있으면 해당 본은 레퍼런스 포즈로 고정됩니다. 모듈러 파트를 제작할 때는 반드시 동일한 USkeleton을 사용하고, 필요한 본만 포함하도록 합니다.

SECTION 03

Skeletal Mesh Merge

FSkeletalMeshMerge를 통한 런타임 메시 합병 기법

FSkeletalMeshMerge는 여러 스켈레탈 메시의 버텍스, 인덱스, 머티리얼 섹션을 하나의 USkeletalMesh로 합치는 유틸리티입니다. 드로우콜을 최소화하여 렌더링 성능을 높이지만, 머지 비용이 존재합니다.

C++
// 메시 머지 실행 USkeletalMesh* MergeMeshes(const TArray<USkeletalMesh*>& MeshesToMerge) { // 머지 파라미터 설정 FSkeletalMeshMergeParams Params; for (USkeletalMesh* Mesh : MeshesToMerge) { FSkelMeshMergeSectionMapping SectionMapping; Params.MeshesToMerge.Add(Mesh); } Params.bNeedsCpuAccess = false; Params.bSkeletonBefore = false; Params.Skeleton = BaseSkeleton; // 공유 스켈레톤 // UMeshMergeFunctionLibrary 사용 (UE5 기본 제공) USkeletalMesh* MergedMesh = UMeshMergeFunctionLibrary::MergeMeshes(Params); return MergedMesh; }

머지 비용

버텍스/인덱스 버퍼 복사, 본 인덱스 리매핑, 새 렌더 리소스 생성이 필요합니다. 장비 교체가 빈번한 경우 프레임 히칭의 원인이 될 수 있습니다.

최적화 전략

비동기 머지를 활용하거나, 자주 사용되는 조합을 미리 캐시하여 런타임 비용을 줄일 수 있습니다. 또는 로딩 화면에서 머지를 수행합니다.

UE5.4+ Modular Character 플러그인

UE5.4부터 Modular Character 관련 기능이 강화되었습니다. SkeletalMeshMerge 외에도 USkeletalMergingLibrary가 추가되어 더 유연한 머지 옵션을 제공하며, 머지 시 머티리얼 슬롯 리매핑과 UV 채널 제어가 가능합니다.

SECTION 04

SkinnedMeshComponent 고급 기법

Skin Weight Profile, 모프 타겟, 클로스 시뮬레이션 통합

모듈러 캐릭터에서 각 파트는 USkinnedMeshComponent(USkeletalMeshComponent의 부모 클래스)의 고급 기능들을 활용할 수 있습니다.

기능 설명 Master Pose 호환
Skin Weight Profile 동일 메시에 여러 스킨 웨이트 세트 저장, 런타임 전환 호환
Morph Target 얼굴 표정, 체형 변화 등 버텍스 오프셋 애니메이션 독립 동작
Cloth Simulation Chaos Cloth 기반 의상 물리 시뮬레이션 호환 (주의 필요)
Post Process AnimBP 메시별 후처리 애니메이션 블루프린트 호환
C++
// 모프 타겟 활용 예시 void AModularCharacter::SetBodyType(float MuscularWeight, float SlimWeight) { BodyMesh->SetMorphTarget(FName("Muscular"), MuscularWeight); BodyMesh->SetMorphTarget(FName("Slim"), SlimWeight); } // Post Process AnimBP 설정 void AModularCharacter::SetupClothPart(USkeletalMesh* ClothMesh) { ClothComponent->SetSkeletalMesh(ClothMesh); ClothComponent->SetLeaderPoseComponent(BodyMesh); // Post Process AnimBP로 보조 본 동작 추가 ClothComponent->SetPostProcessAnimBlueprint(ClothAnimBPClass); } // Skin Weight Profile 전환 BodyMesh->SetSkinWeightProfile(FName("GameplayProfile"));
프로덕션 팁: 하이브리드 접근법

실무에서는 단일 방식이 아닌 하이브리드를 사용합니다. 바디+얼굴은 Master Pose로, 무기는 Socket Attach로, 방어구 중 자주 교체되는 것은 Copy Pose로, 거의 바뀌지 않는 기본 세트는 Mesh Merge로 처리하는 식입니다. 프로파일링을 통해 병목 지점에 맞는 전략을 선택하세요.

SUMMARY

핵심 요약

  • 모듈러 캐릭터는 Master Pose, Mesh Merge, Copy Pose 세 가지 접근법으로 구현할 수 있다.
  • SetLeaderPoseComponent는 리더의 본 트랜스폼을 팔로워가 직접 참조하여 평가 비용을 절약한다.
  • FSkeletalMeshMerge는 메시를 하나로 합쳐 드로우콜을 줄이지만, 런타임 머지 비용이 존재한다.
  • Morph Target, Cloth Simulation, Post Process AnimBP 등을 모듈러 시스템과 결합하여 고급 캐릭터를 구현한다.
  • 프로덕션에서는 상황에 맞는 하이브리드 접근법이 가장 효과적이다.
PRACTICE

도전 과제

배운 내용을 직접 실습해보세요

실습 1: Master Pose Component 설정

캐릭터에 Body, Hair, Armor 3개의 SkeletalMeshComponent를 추가하세요. Body를 Leader로 설정하고, 나머지를 Set Master Pose Component로 연결하여 하나의 애니메이션으로 모든 메시가 동기화되는지 확인하세요.

실습 2: 장비 교체 시스템 구현

런타임에 Set Skeletal Mesh로 Armor 컴포넌트의 메시를 교체하는 장비 교체 시스템을 구현하세요. 동일한 USkeleton을 공유하는 3종의 갑옷 메시를 준비하고, UI 버튼으로 전환하세요.

심화 과제

FSkeletalMeshMerge를 사용하여 여러 SkeletalMesh를 하나로 병합하는 시스템을 C++로 구현하세요. 병합된 메시의 Section(머티리얼 슬롯)이 올바르게 매핑되는지 확인하고, 병합 전후의 Draw Call 수를 비교하여 최적화 효과를 측정하세요.