언리얼 엔진 에서 게임 시스템이나 플레이어가 다양한 의상이나 모델 같이 외형을 커스터마이징할 수 있는 캐릭터를 생성할 때 모듈형 캐릭터(Modular Character) 블루프린트 를 사용하여 캐릭터를 구성하는 것을 고려하는 것이 좋습니다.
모듈형 캐릭터 블루프린트를 사용하면 전체 캐릭터에 대해 단일 스켈레탈 메시 모델을 임포트하는 대신에 블루프린트 로직을 사용하여 교체할 수 있는 여러 개의 스켈레탈 메시 에셋을 사용하여 런타임 시 캐릭터를 구성할 수 있습니다. 모듈형 캐릭터 블루프린트를 사용하면 모듈형 외형으로 캐릭터를 더 유연하게 생성할 수 있으며, 전체 메시를 교체하는 것보다 더 효율적으로 생성할 수 있습니다.

모듈형 캐릭터 구성 메서드
언리얼 엔진에서 모듈형 캐릭터 시스템을 생성할 때 각각 다양한 프로젝트의 요구사항과 범위에 맞춰진 몇 가지 구성 메서드를 선택할 수 있습니다. 다음은 각 메서드의 장단점을 포함한 간략한 설명입니다.
-
리더 포즈 컴포넌트 설정 - 스켈레탈 메시 오브젝트의 부모 스켈레탈 메시 오브젝트를 지정하여 캐릭터를 구성하고, 그 부모에서만 애니메이션을 실행합니다. 이렇게 하면 가장 빠르게 구성할 수 있지만 분리된 애니메이션 재생이나 피직스 렌더링을 지원하지 않으며 렌더 스레드 퍼포먼스 비용이 높아질 수 있습니다. 리더 포즈 설정은 언리얼 엔진에서 첫 모듈형 캐릭터를 구성을 시작할 때 좋습니다.
-
메시에서 포즈 복사 - 캐릭터를 구성하는 각 스켈레탈 메시 오브젝트에서 피직스 시뮬레이션을 빌드하는 데 사용할 수 있는 중간 솔루션으로, 분리된 애니메이션 재생도 지원하지만 게임 스레드와 렌더 스레드 모두에서 프로젝트 계산 프로세스 비용이 가장 높습니다.
-
스켈레탈 메시 병합 - 런타임 시 여러 스켈레탈 메시 오브젝트를 결합하여 전체 캐릭터를 렌더링하므로 게임 스레드와 렌더 스레드 모두에서 비교적 퍼포먼스 비용이 낮은 가장 포괄적인 솔루션입니다. 하지만 이 메서드는 구성이 가장 번거로우며 캐릭터의 모프 타깃을 활용할 수 없다는 단점이 있습니다.
아래 차트에서 각 메서드의 장단점, 퍼포먼스 비용을 참조할 수 있습니다.
리더 포즈 컴포넌트 | 메시에서 포즈 복사 | 스켈레탈 메시 병합 | |
---|---|---|---|
구성 비용 | 최소 | 중간 | 높음 |
게임 스레드 비용 | 최소 | 높음 | 중간 |
렌더 스레드 비용 | 높음 | 높음 | 낮음 |
피직스 | 아니요 | 애님 다이내믹스(AnimDynamics) 또는 리지드 바디(RigidBody) | 예 |
모프 타깃 | 예 | 예 | 아니요 |
전제조건
- 전체 캐릭터로 어셈블되는 스켈레탈 메시 에셋 그룹이 있어야 합니다. 이런 그룹이 없다면 언리얼 엔진 마켓플레이스 에서 Stylized Character Kit: Casual 01(https://www.unrealengine.com/marketplace/ko/product/stylized-male-character-kit-casual?sessionInvalidated=true)을 사용할 수 있습니다.

리더 포즈 컴포넌트
언리얼 엔진에서 모듈형 캐릭터를 생성하는 메서드 중 하나는 리더 포즈 컴포넌트(Leader Pose Component) 시스템입니다. 리더 포즈 컴포넌트 블루프린트 호출 가능 함수를 사용하면 스킨을 입힌 메시 컴포넌트 오브젝트(Skinned Mesh Component Objects)를 스킨을 입힌 리더 메시 컴포넌트 오브젝트(Leader Skinned Mesh Component Object)의 자손으로 설정할 수 있습니다. 예를 들어, 몸통(Torso)을 리더 포즈 컴포넌트로 정의하고 애니메이션을 몸통에 할당한 다음, 발, 다리, 손 및 머리를 자손으로 추가하여 몸통에 할당된 애니메이션을 따르게 할 수 있습니다.
리더 포즈 컴포넌트를 사용할 때 자손 메시 오브젝트는 어떠한 본 트랜스폼 버퍼(Bone Transform Buffer) 도 사용하지 않고 어떤 애니메이션도 독립적으로 실행하지 않습니다. 자손 메시는 리더 포즈 컴포넌트의 본 트랜스폼 버퍼에서 재생되는 애니메이션만 실행할 수 있습니다. 이 시스템은 가볍지만 제한적인 어태치먼트 시스템을 생성합니다.
다음 섹션에서는 언리얼 엔진에서 리더 포즈 컴포넌트 시스템을 사용하여 모듈형 캐릭터를 생성하는 방법에 대한 워크플로 예시를 따라 해 볼 수 있습니다.
리더 포즈 컴포넌트 구성
언리얼 엔진 프로젝트에 스켈레탈 메시 에셋을 임포트한 다음에 콘텐츠 브라우저(Content Browser) 에서 + 추가(Add) 를 클릭하고 블루프린트 클래스(Blueprint Class) 를 선택하여 새 캐릭터 블루프린트를 생성합니다. 부모 클래스 선택(Pick Parent Class) 창에서 캐릭터(Character) 클래스 옵션을 선택합니다.

블루프린트 이름 을 지정하고 엽니다.

컴포넌트(Components) 패널에서 메시 컴포넌트를 선택한 다음, 디테일(Details) 패널에서 스켈레탈 메시 에셋(Skeletal Mesh Asset) 프로퍼티를 사용하여 스켈레탈 메시를 정의합니다. 머리처럼 게임 구조에 따라서 변하지 않는 캐릭터의 기본 컴포넌트를 선택하는 것이 좋습니다.

캐릭터의 모든 보이는 컴포넌트를 변경하려는 경우, 루트 스켈레탈 메시로 빈 스켈레탈 메시 오브젝트를 생성한 다음 이 오브젝트를 기본 에셋으로 사용할 수 있습니다. 빈 스켈레탈 메시 오브젝트에는 런타임 시 보이지 않는 아주 작은 양의 지오메트리가 포함될 수 있으며, 이 지오메트리를 중심으로 다른 보이는 메시의 방향을 지정할 수 있습니다.
뷰포트(Viewport) 패널에서 기본 메시의 배치를 조정합니다.

컴포넌트 패널에서 메시를 우클릭 하고 옵션 메뉴에서 복제(Duplicate) 를 선택합니다.

컴포넌트(Components) 패널에서 복제된 메시 컴포넌트를 선택한 다음, 디테일(Details) 패널에서 메시(Mesh) 섹션으로 이동하여 스켈레탈 메시 에셋(Skeletal Mesh Asset) 프로퍼티에서 모듈형 캐릭터의 또 다른 세그먼트를 선택합니다. 이 워크플로 예시에서는 머리 컴포넌트가 복제된 메시 컴포넌트의 몸통으로 교체되었습니다.

캐릭터의 메시 컴포넌트가 제대로 익스포트되었다면 해당 메시는 뷰포트 패널의 올바른 위치에 스냅되어야 합니다. 제대로 스냅되지 않는다면 수동으로 메시 컴포넌트를 정렬해야 합니다.

해당 메시 컴포넌트와 일치하도록 복제 컴포넌트의 이름을 변경(Rename) 합니다.

모든 메시 컴포넌트가 블루프린트에 추가되고 캐릭터의 모든 조각이 갖춰질 때까지 기본 메시 컴포넌트부터 이 프로세스를 반복합니다.
(convert:false)
모든 메시 컴포넌트가 캐릭터 블루프린트에 추가되고 뷰포트 패널에서 제대로 정렬되면 블루프린트의 컨스트럭션 스크립트(Construction Script) 패널을 엽니다. Construction Script 노드에서 Set Leader Pose Component 노드를 생성합니다.

블루프린트 내에 포함된 각 메시 컴포넌트의 인스턴스를 그래프에 드래그합니다.

기본 메시 컴포넌트를 Set Leader Pose Component 노드의 New leader Bone Component 입력 핀에 연결합니다.

나머지 메시 컴포넌트를 Set Leader Pose Component 노드의 Target 입력 핀에 연결합니다.

캐릭터 블루프린트를 저장하고 컴파일하면 이제 모듈형 캐릭터가 어셈블되어 프로젝트에 추가하고 애니메이팅하고 제어할 수 있습니다.

명심해야 할 점은 캐릭터에 리더 포즈 컴포넌트 노드를 사용하면 게임 스레드 의 캐릭터 퍼포먼스 비용은 감소하지만, 렌더 스레드 의 캐릭터 렌더링 비용은 감소하지 않는다는 것입니다. 캐릭터는 컴포넌트에 포함된 각 추가 섹션에 대한 추가 드로 콜과 함께 여전히 같은 수의 컴포넌트를 별도로 렌더링합니다.
또한, 리더 본의 모든 자손 메시 오브젝트는 정확히 같은 구조의 서브셋이어야 한다는 점도 명심해야 합니다. 조인트를 추가할 수도 조인트를 건너뛸 수도 없습니다. 추가 조인트에 대한 본 버퍼 데이터가 없으므로 추가 조인트나 건너뛴 조인트는 레퍼런스 포즈를 사용하여 렌더링됩니다.
모듈형 캐릭터 블루프린트 내에 포함된 자손 메시 오브젝트는 고유 애니메이션을 실행할 수도 없고 리더 포즈 컴포넌트와 독립적으로 피직스를 시뮬레이션할 수도 없습니다.
메시에서 포즈 복사
언리얼 엔진에서 모듈형 캐릭터를 어셈블하는 또 다른 메서드는 메시에서 포즈 복사(Copy Pose from Mesh) 시스템입니다. 메시에서 포즈 복사는 자손 메시의 애니메이션 블루프린트 내에서 사용할 수 있는 애님 그래프(AnimGraph) 노드로, 이 노드를 사용하여 다른 스켈레탈 메시 컴포넌트에서 애니메이션 포즈를 복사할 수 있습니다. 메시에서 포즈 복사는 일치하는 본만 복사하며, 나머지는 모두 레퍼런스 포즈를 사용합니다.
포즈 복사 컴포넌트 구성
언리얼 엔진 프로젝트에 스켈레탈 메시 에셋을 임포트한 다음에 캐릭터 블루프린트를 생성하고 각 메시 컴포넌트를 블루프린트에 추가합니다.

기본 메시 컴포넌트에 대한 애니메이션 블루프린트를 생성하고 메시 컴포넌트의 디테일(Details) 패널에서 애니메이션 모드(Animation Mode) 프로퍼티를 애니메이션 블루프린트 사용(Use Animation Blueprint) 으로 설정한 다음 애님 클래스(Anim Class) 프로퍼티로 메인 애니메이션 블루프린트를 선택하여 할당합니다.

이 워크플로 예시에서 모듈형 캐릭터 메시는 마네킹 템플릿의 스켈레톤 에셋을 사용하며 삼인칭 템플릿 프로젝트에 있는 ThirdPerson_AnimBP
애니메이션 블루프린트를 사용하여 할당할 수 있습니다.
이 애니메이션 블루프린트를 할당하면 기본 메시, 이 경우에는 캐릭터 머리가 애니메이팅을 시작하고 나머지 메시 컴포넌트는 해당 레퍼런스 포즈를 출력합니다.

이제 모듈형 캐릭터의 나머지 각 자손 메시 컴포넌트에 대한 애니메이션 블루프린트 포즈를 구동할 애니메이션 블루프린트 에셋을 생성합니다. 콘텐츠 브라우저(Content Browser) 에서+ 추가(Add) 를 클릭한 다음 애니메이션(Animation) > 애니메이션 블루프린트(Animation Blueprint) 를 선택하여 에셋을 생성합니다. 그런 다음, 모듈형 캐릭터의 스켈레톤 에셋을 할당합니다. 이 워크플로 예시에서는 마네킹 캐릭터의 스켈레톤을 사용합니다.

애니메이션 블루프린트의 이름 을 지정하고 엽니다.

애니메이션 블루프린트 내에서 기본 메시 컴포넌트에 대한 레퍼런스 변수를 생성합니다. 레퍼런스 변수를 생성하려면 먼저 내 블루프린트(My Blueprint) 패널의 변수(Variables) 섹션에서 + 추가(Add) 를 사용하여 Source Mesh Component
라는 새 변수를 추가한 다음, 스켈레탈 메시 컴포넌트(Skeletal Mesh Component) > 오브젝트 레퍼런스(Object Reference) 를 선택합니다.

그런 다음, 애니메이션 블루프린트의 이벤트 그래프(Event Graph) 에서 Cast to Blueprint 노드를 생성하여 애니메이션 블루프린트를 캐릭터의 블루프린트에 연결합니다. Try Get Pawn Owner 노드를 생성하고 해당 Return Value 를 Cast to Blueprint 노드의 Object 입력 핀에 연결합니다. Cast to Blueprint 노드의 출력 핀을 드래그하여 Get Mesh 노드를 생성합니다. 마지막으로 메시 변수에 대한 Set Variable 노드를 생성하고 Get Mesh 노드의 출력 핀을 Set Variable 노드의 입력 핀에 연결합니다.

애님 그래프 에서 Copy Pose From Mesh 노드를 생성합니다. 레퍼런스 변수를 그래프에 추가하고 Copy Pose From Mesh 노드의 Source Mesh Component 입력 핀에 연결합니다. 마지막으로, Copy Pose From Mesh 노드의 출력 포즈를 Output Pose 노드에 연결합니다.

캐릭터 블루프린트에서 각 자손 메시 컴포넌트가 새 애니메이션 블루프린트를 사용하여 실행되도록 설정합니다. 애니메이션 블루프린트를 설정하려면 컴포넌트(Components) 패널에서 각 자손 메시 컴포넌트를 선택한 다음, 애니메이션 모드(Animation Mode) 프로퍼티를 애니메이션 블루프린트 사용(Use Animation Blueprint) 으로 설정하고 애님 클래스(Anim Class) 프로퍼티로 해당 자손 메시 애니메이션 블루프린트를 설정합니다.

메시에서 포즈 복사를 사용하여 여러 메시 컴포넌트의 애니메이션을 동기화할 때, 복사하는 스켈레탈 메시 컴포넌트가 이미 틱되었는지 확인하는 것이 좋습니다. 그렇지 않으면 마지막 프레임의 애니메이션을 복사하게 됩니다. 기본 메시가 틱되었는지 확인하려면, 캐릭터 블루프린트의 컴포넌트(Comments) 패널에서 각 자손 메시 오브젝트를 기본 메시 컴포넌트에 드래그하여 기본 메시 컴포넌트를 자손 메시 컴포넌트의 부모로 지정하면 됩니다.

또한, 코드에서 기본 메시의 틱을 자손 메시 평가의 전제조건으로 설정하여 이 관계를 설정할 수도 있습니다. 자세한 내용은 틱 종속성 문서를 참조하세요.
메시에서 포즈 복사 메서드를 사용하여 모듈형 캐릭터를 빌드할 때는 각 메시 컴포넌트의 전체 애니메이션 그래프에 액세스할 수 있으므로 분리된 애니메이션 재생을 더 동적으로 제어할 수 있습니다. 또한 RigidBody 또는 AnimDynamics 노드를 사용하여 각 메시 컴포넌트에 대한 라이트 피직스 시뮬레이션을 개별적으로 빌드할 수 있습니다.
하지만, 메시에서 포즈 복사를 사용할 경우 애니메이션 그래프 평가가 각 자손에서 실행되어야 하므로 리더 포즈 컴포넌트 시스템을 사용하는 것보다 퍼포먼스 비용이 높다는 점에 유의해야 합니다.
스켈레탈 메시 병합
언리얼 엔진 내에서 모듈형 캐릭터를 생성할 때, 메시 병합(Merge Meshes) 블루프린트 함수 노드를 사용하여 런타임 시 여러 메시를 하나의 스켈레탈 메시로 병합할 수도 있습니다. 이 메서드는 초기에 스켈레탈 메시 생성을 위한 퍼포먼스 비용이 높지만, 여러 메시가 아닌 단일 스켈레탈 메시를 렌더링하므로 다른 메서드보다 반복 렌더링 비용은 낮습니다.
예를 들어, 머리와 바디, 다리, 이렇게 세 개의 컴포넌트로 구성된 캐릭터가 있고 화면에 캐릭터가 50개 있다면, 드로 콜은 50번이 발생합니다. 스켈레탈 메시 병합을 하지 않으면 각 컴포넌트는 자체 드로 콜을 갖게 되므로 캐릭터당 세 번의 콜이 발생하여 총 150번의 드로 콜이 발생하게 됩니다.
FSkeletalMeshMerge
를 사용할 때는 병합된 메시가 메인 메시 컴포넌트에 설정된 스켈레톤만 사용하기 때문에, 메인 메시 컴포넌트에 캐릭터의 애니메이션 모두를 포함한 전체 스켈레톤이 포함되어야 합니다. 특정 신체 부위에 대한 추가 조인트가 있다 해도 메시 병합이 성공하려면 메인 메시 컴포넌트에 모든 애니메이션이 포함되어 실행되고 있어야 합니다.
또한, 병합된 메시는 한 번에 하나의 애니메이션만 실행하며 병합된 메시에 모프 타깃을 전송하는 기능은 지원하지 않는다는 점도 유의해야 합니다. 하지만, FSkeletalMeshMerge::GenerateLODModel
을 참조하여 병합된 스켈레탈 메시에 모프 타깃을 적용하는 우회 방법을 만들 수 있습니다. 런타임 시 병합된 메시를 생성한 후, 베이스 메시와 원하는 모프 간의 FMorphTargetDelta
를 계산하여 모프 타깃을 적용할 수 있습니다.
또한, FSkeletalMeshMerge
를 사용할 때는 처음부터 이 메서드를 염두에 두고 콘텐츠를 맞춤 빌드해야 할 것입니다. 병합된 캐릭터에 하나의 공통 머티리얼을 사용하고 텍스처에 대한 아틀라스 를 결정하는 것이 좋습니다. 이렇게 하면 런타임 시 텍스처를 잘라 적용하여 병합된 캐릭터를 하나의 메시로 렌더링할 수 있는 더 동적인 시스템을 만들 수 있습니다.
스켈레탈 메시 병합 구성
언리얼 엔진 프로젝트에 스켈레탈 메시 에셋을 임포트한 다음 Skeletal Merging 플러그인을 활성화합니다. 플러그인을 활성화하려면, 메뉴 바(Menu Bar) 에서 편집(Edit) > 플러그인(Plugins) 으로 이동하여 기타(Other) 섹션 아래 목록에서나 검색창(Search Bar) 을 사용하여 Skeletal Merging 플러그인을 찾습니다. 플러그인을 활성화한 후 에디터를 재시작합니다.

에디터를 재시작한 다음에는 콘텐츠 브라우저(Content Browser) 에서 + 추가(Add) 를 사용하여 빈 스켈레탈 메시 컴포넌트가 있는 캐릭터 블루프린트를 생성합니다.
그런 다음, Skeletal Mesh Merge Parameters 변수를 캐릭터 블루프린트에 추가합니다. 이 변수를 생성하려면 내 블루프린트(My Blueprint) 패널의 변수(Variables) 섹션에서 + 추가(Add) 를 사용하여 새 변수를 생성하고 변수 타입을 Skeletal Mesh Merge Parameters
변수로 정의하면 됩니다.

블루프린트를 저장(Save) 하고 컴파일(Compile) 합니다.
내 블루프린트 패널에서 Skeletal Mesh Merge Param 변수를 선택하여 변수의 디테일(Details) 패널을 엽니다. 스켈레톤(Skeleton) 프로퍼티를 사용하여 캐릭터의 스켈레톤을 정의합니다.

이제 병합할 메시(Meshes to Merge) 프로퍼티에서 + 추가(Add) 를 사용하여 병합하려는 메시를 정의할 수 있습니다. 캐릭터에 포함된 각 메시의 배열을 생성하고 각각의 메시를 정의합니다.

캐릭터 블루프린트 이벤트 그래프에서 이제 Event Begin Play 노드로부터 메시 병합 노드를 생성하여 Skeletal Mesh Merge Parameter 변수에 의해 정의된 메시를 병합할 수 있습니다.

그런 다음, Set Skeletal Mesh Asset 노드를 사용하여 빈 스켈레탈 메시 컴포넌트를 생성된 병합 메시로 대체할 수 있습니다. 기존 메시 노드를 Target으로 설정하고 생성된 병합 메시를 New Mesh로 설정합니다. 그런 다음, 새 병합 메시에서 재생할 애니메이션을 빈 메시 오브젝트에서 재생할 수 있습니다.

이제 병합된 메시 블루프린트를 레벨에 추가하고 실시간으로 전체 스켈레탈 메시 재생 애니메이션을 관찰할 수 있습니다.

병합된 메시가 캡슐 컴포넌트에 정확하게 정렬되지 않은 경우, 캐릭터 블루프린트의 뷰포트 패널에서 빈 스켈레탈 메시 컴포넌트를 이동하여 위치를 조정할 수 있습니다.
Skeletal Mesh Merge Parameter 레퍼런스
아래에서 Skeletal Mesh Merge Parameter 변수의 프로퍼티 목록과 그 기능에 대한 설명을 참조할 수 있습니다.
프로퍼티 | 설명 |
---|---|
메시 섹션 매핑(Mesh Section Mappings) | 소스 메시 섹션을 병합된 섹션 항목으로 매핑하는 데 사용되는 선택적 배열입니다. |
메시별 UV 트랜스폼(UVTransforms Per Mesh) | 각 메시에서 UV를 트랜스폼하는 데 사용되는 선택적 배열입니다. |
병합할 메시(Meshes to Merge) | 하나로 병합될 스켈레탈 메시입니다. |
상위 LOD 제거(Strip Top LODs) | 입력 메시에서 제거할 상위 LOD 수입니다. |
CPU 액세스 필요(Needs Cpu Access) | 파티클 이펙트 스폰 등, 어떤 이유로든 CPU에서 결과 메시에 액세스해야 하는지 여부입니다. |
스켈레톤 이전(Skeleton Before) | 스켈레톤을 병합 전에 업데이트할지 병합 후에 업데이트할지 여부입니다. 스켈레톤도 제공되어야 합니다. |
스켈레톤(Skeleton) | 병합된 메시에 사용할 스켈레톤입니다. 병합된 메시가 사용할 스켈레톤을 생성하려면 이 프로퍼티를 비워둬도 됩니다. |