티스토리 뷰

🟩 오늘의 목표

  • Pawn 클래스와 Character 클래스의 차이점을 이해하고 수동으로 이동 로직을 구현하는 법을 배운다.
  • 애니메이션 블루프린트 내 스테이트 머신과 Random Sequence Player를 활용해 자연스러운 대기 시스템을 구축하는 법을 배운다.
  • Enhanced Input의 다양한 이벤트를 활용해 가변 속도 및 정지 로직을 정교화하는 법을 배운다.
  • 소형 캐릭터 메시에 최적화된 컴포넌트 설정 및 커스텀 PlayerStart를 통한 스폰 문제를 해결하는 법을 배운다.
  • MetaHuman, Humanoid, Custom 본 구조가 서로 다른 캐릭터 간에 언리얼 엔진의 리타게팅 기능을 사용하여 애니메이션을 공유하고 복사하는 방법을 배운다.
  • 리타게팅의 핵심 구성 요소인 스켈레톤, 스켈레탈 메시, 애니메이션 시퀀스, 루트 모션의 개념을 이해하고 실습을 통해 숙달하는 것을 목표로 한다.

 

🟧 1. Pawn과 Character 클래스의 차이 및 이동 로직


🟦 Pawn 클래스에서의 수동 이동 구현

Character 클래스는 CharacterMovementComponent를 포함하고 있어 중력, 마찰, 속도 계산 등을 자동으로 처리하지만, Pawn 클래스는 이러한 기능이 없어 개발자가 직접 속도 변수와 이동 공식을 설계해야 함을 배웠다. 이동 입력이 있을 때만 CurrentGroundSpeed를 갱신하고, 입력이 끊기는 시점인 Completed 이벤트를 활용해 속도를 0으로 초기화함으로써 Pawn의 멈춤 동작을 명확히 구현하는 법을 배웠다. Left Shift 키를 바인딩하여 캐릭터의 상태에 따라 MaxSpeed(150)와 SprintSpeed(300) 사이를 전환하는 가변 속도 시스템을 구축하는 법을 배웠다.

🟦 C++과 애니메이션 블루프린트 데이터 연동

CharacterMovement가 없는 Pawn은 Get Velocity 함수를 사용할 수 없으므로, C++ 클래스에서 생성한 CurrentGroundSpeed 변수를 애니메이션 블루프린트에서 참조하는 구조를 설계하는 법을 배웠다. UPROPERTY에 BlueprintReadOnly 지정자를 추가하여 외부 클래스인 애니메이션 블루프린트에서 안전하게 데이터를 읽어갈 수 있도록 접근 권한을 설정하는 법을 배웠다.

 

🟧 2. 애니메이션 시스템(ABP) 및 스테이트 머신 구축


🟦 지능적인 대기 시스템 설계

가만히 서 있는 동작의 단조로움을 피하기 위해 Random Sequence Player를 사용하여 여러 개의 Action Idle 애니메이션을 무작위로 재생하는 법을 배웠다. Idle 상태에서 5초가 지나면 Action_Idle로 전이되고 다시 돌아오는 순환 구조를 설계했으며, 이를 위해 Current State Time 노드와 Automatic Rule을 활용하는 로직을 완성하는 법을 배웠다.

🟦 속도에 따른 상태 전이

C++에서 넘겨받은 GroundSpeed 변수를 활용하여 캐릭터의 속도가 0일 때는 Idle, 일정 수치 이상일 때는 Walk, 최대 속도일 때는 Run 애니메이션이 부드럽게 전환되도록 스테이트 머신을 구성하는 법을 배웠다.

 

🟧 3. 컴포넌트 최적화 및 스폰 환경 설정


🟦 소형 메시용 캡슐 및 위치 보정

까마귀와 같은 소형 메시에 맞춰 캡슐 컴포넌트의 크기를 Radius 15, Half Height 20으로 대폭 축소하여 물리적 충돌 범위를 최적화하는 법을 배웠다. 캡슐 크기 변경 후 발이 지면에 닿지 않는 문제를 해결하기 위해 메시 컴포넌트의 Z축 위치 오프셋을 조정하여 발바닥을 캡슐 바닥면에 정확히 맞추는 법을 배웠다.

🟦 커스텀 PlayerStart 제작 및 해결

기본 제공되는 PlayerStart는 캡슐 크기가 고정되어 있어 소형 캐릭터 배치 시 공중에 뜨는 현상이 발생하므로, 내부에 작은 캡슐을 가진 BP_PlayerStart를 직접 만들어 지면에 밀착시키는 방법을 배웠다.

 

🟧 4. 애니메이션 리타게팅 핵심 개념


🟦 리타게팅의 정의와 필요성

리타게팅은 체형이나 본 구조가 다른 캐릭터에게 특정 움직임의 의도를 전달하는 기술임을 배웠다. 본 이름이나 개수, 초기 포즈(T-Pose vs A-Pose)가 다르더라도 IK Rig와 IK Retargeter를 통해 애니메이션을 자연스럽게 변환할 수 있음을 이해하는 법을 배웠다.

🟦 애니메이션 시스템 구성 요소

스켈레톤은 본의 계층 구조와 이름 정보를 담은 설계도 역할을 하며 애니메이션 공유의 기준이 됨을 배웠다. 스켈레탈 메시는 3차원 모델과 스켈레톤이 결합된 에셋으로, 스킨 웨이트를 통해 본의 움직임에 따른 메시 변형을 결정함을 배웠다. 애니메이션 시퀀스는 시간에 따른 본의 회전과 위치 변화를 기록한 데이터이며, 루트 모션은 캐릭터의 실제 이동 정보가 애니메이션에 포함되어 발이 땅에 정확히 붙는 현실적인 움직임을 구현하는 방식임을 배웠다.

 

🟧 5. 표준 본(Bone) 구조와 계층의 이해


🟦 주요 본 이름 매핑

언리얼 마네킹에서 사용하는 표준 이름 규칙과 부모-자식 간의 계층 구조를 배웠다. 중심부인 root(최상위)와 pelvis(골반), 상체인 spine(척추), neck(목), head(머리), clavicle(쇄골), 그리고 팔다리의 upperarm/lowerarm, thigh/calf/foot 순으로 연결되는 구조를 확인하는 법을 배웠다.

🟦 C++ 데이터 예시를 통한 구조 확인

C++ 코드를 활용해 본의 이름과 부모 관계를 구조체로 정의하고, 함수를 통해 반복되는 손가락 마디 설정을 효율적으로 처리하는 프로그래밍 방식을 배웠다.

// 본 정보를 담을 구조체 예시
struct BoneData {
    std::string Name;       // 본 이름
    std::string ParentName; // 부모 본 이름
    std::string Description;// 설명
};

// 손가락 뼈를 자동으로 생성해주는 도우미 함수
void AddFinger(std::vector<BoneData>& Skeleton, std::string fingerName, std::string side, std::string parent) {
    std::string bone01 = fingerName + "_01" + side;
    std::string bone02 = fingerName + "_02" + side;
    Skeleton.push_back(BoneData(bone01, parent, fingerName + " (뿌리)"));
    Skeleton.push_back(BoneData(bone02, bone01, fingerName + " (중간)"));
}

 

🟧 6. 리타게팅 실습 과정


🟦 IK Rig 생성 및 체인 설정

각 스켈레톤의 주요 관절을 체인으로 정의하여 리타게팅의 뼈대를 만드는 법을 배웠다. Auto Create Retarget Chains 버튼을 활용해 자동으로 체인을 생성하고, Full Body IK Solver를 통해 움직임을 테스트하고 수정하는 과정을 배우는 법을 배웠다.

🟦 IK Retargeter를 활용한 애니메이션 변환

Source IK Rig와 Target IK Rig를 매칭하여 실제 애니메이션을 복사하는 법을 배웠다. 두 캐릭터의 포즈를 맞추기 위해 Auto Align 기능을 사용하고, Target Mesh Offset 값을 조절하여 움직임을 동시에 비교하며 확인하는 법을 배웠다. 최종적으로 Export Selected Animations 버튼을 통해 대상 캐릭터에 최적화된 애니메이션 시퀀스를 생성하는 법을 배웠다.

🟦 외부 리소스 실습 (Mixamo, Paragon, VRM)

Mixamo의 XBot 캐릭터와 애니메이션을 임포트하여 MetaHuman에 리타게팅하는 전체 프로세스를 학습하는 법을 배웠다. Paragon 리소스를 활용해 복잡한 본 구조의 애니메이션을 MetaHuman에 적용하고, VRM4U 플러그인을 설치하여 VRoid 아바타에 리타게팅하여 출력하는 법을 배웠다.

 

🟫 오늘 느낀 점

강의에서 편리하게 사용했던 Character 클래스의 기능을 Pawn 클래스에서 직접 구현해 보며 엔진 내부의 이동 로직과 데이터 통신 구조를 더 깊게 이해하게 되었다. 입력의 마무리를 처리하는 Completed 이벤트와 커스텀 스폰 환경 구축이 게임의 디테일한 완성도를 결정짓는 핵심 요소임을 체감했다. 또한 서로 다른 본 구조를 가진 캐릭터들이 리타게팅을 통해 동일한 애니메이션을 완벽하게 수행하는 과정이 매우 인상적이었으며, 표준 본 이름 규칙과 계층 구조를 명확히 이해하는 것이 리타게팅 오류를 줄이는 핵심임을 깊이 체감했다.

'내일배움캠프 Unreal_7기 > 본캠프' 카테고리의 다른 글

TIL - 37일차  (1) 2026.01.20
TIL - 36일차  (1) 2026.01.19
TIL - 34일차  (0) 2026.01.15
TIL - 33일차  (0) 2026.01.14
TIL - 32일차  (0) 2026.01.13