오늘 배운 것
오늘은 언리얼 C++로 Pawn을 직접 구현하면서 언리얼의 기본 구조와 Enhanced Input, 이동 시스템에 대해 학습했다.
기존에 Character 클래스를 사용했을 때는 엔진이 제공하는 이동 기능을 사용했지만, Pawn을 직접 구현하면서 이동과 회전을 코드로 제어하는 과정을 경험했다.
Pawn과 Character의 차이
Character
Character는 사람형 캐릭터를 만들기 위한 클래스다.
기본적으로 다음 컴포넌트가 포함되어 있다.
- CapsuleComponent
- SkeletalMeshComponent
- CharacterMovementComponent
그래서 걷기, 점프, 중력, 낙하 등의 기능을 바로 사용할 수 있다.
Pawn
Pawn은 Controller가 조종할 수 있는 가장 기본적인 Actor다.
이동 기능이 기본 제공되지 않기 때문에 직접 구현해야 한다.
이번 과제에서는 다음 컴포넌트를 직접 추가했다.
- CapsuleComponent
- SkeletalMeshComponent
- SpringArmComponent
- CameraComponent
언리얼 객체 구조 이해
언리얼은 Actor와 Component 구조를 사용한다.
Actor
├ Component
├ Component
└ Component
이번 Pawn 구조는 다음과 같다.
Capsule (Root)
├ Mesh
└ SpringArm
└ Camera
RootComponent
RootComponent는 Actor의 기준이 되는 컴포넌트다.
Root가 이동하면 자식 컴포넌트도 함께 이동한다.
Controller와 Pawn
언리얼은 Controller와 Pawn을 분리한다.
PlayerController
↓
Possess
↓
Pawn
Controller는 입력과 판단을 담당한다.
Pawn은 실제로 움직이는 몸체 역할을 한다.
이 구조는 플레이어뿐 아니라 AI에도 동일하게 적용된다.
AIController
↓
Possess
↓
MonsterPawn
Enhanced Input 구조
Enhanced Input은 다음 구조로 동작한다.
Input Mapping Context
↓
Input Action
↓
함수
이번 과제에서는 다음 Input Action을 사용했다.
- IA_Move
- IA_Look
- IA_UpDown
- IA_Roll
그리고 IMC_Default에 키를 등록한 후 C++에서 바인딩했다.
입력 바인딩
입력은 SetupPlayerInputComponent()에서 연결한다.
예시:
- IA_Move → Move()
- IA_Look → Look()
- IA_UpDown → UpDown()
- IA_Roll → Roll()
Enhanced Input은 Triggered 상태에서 입력값을 계속 전달한다.
Completed를 추가하면 입력 종료 시 0값을 받을 수 있다.
자주 사용되는 언리얼 개념
CreateDefaultSubobject
컴포넌트를 생성할 때 사용한다.
예시:
- Camera 생성
- Capsule 생성
- SpringArm 생성
SetupAttachment
컴포넌트의 부모-자식 관계를 설정한다.
예시:
Camera를 SpringArm에 부착
GetController
Pawn을 조종하는 Controller를 가져온다.
Cast
부모 타입을 자식 타입으로 변환할 때 사용한다.
예시:
AController → APlayerController
GetSubsystem
언리얼 Subsystem을 가져온다.
Enhanced Input 등록 시 사용했다.
Ground Check 구현
중력 시스템 구현을 위해 Line Trace를 사용했다.
흐름:
- Pawn 아래로 Line Trace
- 땅 감지 여부 확인
- bIsGrounded 갱신
- 착지 시 낙하 속도 초기화
중요한 점은 Ground Check는 충돌이 아니라 단순 확인이라는 것이다.
Ground Check
≠
충돌 처리
중력 구현
Tick()에서 직접 중력을 계산했다.
개념:
가속도 → 속도 → 위치
중력은 속도를 변경하고
속도는 위치를 변경한다.
중요한 사실:
자연스러운 이동은 위치를 직접 변경하는 것이 아니라 속도를 관리하는 방식으로 구현한다.
비행체 구현 과정
처음에는 위아래 이동을 위치 변경 방식으로 구현했다.
하지만 조작감이 점프처럼 느껴졌다.
원인:
- 상승은 위치를 직접 변경
- 중력은 속도를 변경
서로 다른 방식이 섞여 있었기 때문이다.
정리
좋은 구조
가속도 → 속도 → 위치
나쁜 구조
입력 → 위치 직접 변경
드론 연출 구현
비행체 느낌을 내기 위해 Mesh를 기울이는 연출을 추가했다.
Pitch
앞뒤 기울기
- W → 앞으로 숙임
- S → 뒤로 젖힘
Roll
좌우 기울기
- A → 왼쪽 기울기
- D → 오른쪽 기울기
중요한 점은 실제 Pawn을 회전시키는 것이 아니라 Mesh만 회전시킨다는 것이다.
Root
→ 이동 담당
Mesh
→ 연출 담당
카메라와 비행체 분리
비행체가 기울어질 때 카메라까지 같이 기울어지면 조작감이 불편하다.
해결 방법:
- SpringArm은 Root에 직접 연결
- Camera는 SpringArm의 자식
- Pitch, Roll 상속 비활성화
결과:
기체는 기울어지지만 카메라는 수평을 유지한다.
오늘의 핵심 정리
- Pawn은 직접 이동을 구현해야 한다.
- Controller는 입력과 판단, Pawn은 몸체 역할을 한다.
- 언리얼은 Actor + Component 구조를 사용한다.
- RootComponent는 모든 이동의 기준이다.
- Enhanced Input은 IMC → IA → 함수 구조로 동작한다.
- Ground Check와 충돌 처리는 다른 개념이다.
- 자연스러운 이동은 가속도 → 속도 → 위치 순서로 구현한다.
- 드론 연출은 Mesh만 회전시키는 것이 좋다.
- 이동 로직과 연출 로직은 분리하는 것이 유지보수에 유리하다.
'TIL' 카테고리의 다른 글
| [TIL] 언리얼 C++ & 코드카타 학습 정리 (0) | 2026.06.12 |
|---|---|
| [TIL] C++ 정렬, 람다 함수, override, TEXT() (0) | 2026.06.11 |
| [TIL] Unreal Engine Enhanced Input System (C++) (0) | 2026.06.09 |
| Codex와 Unreal Engine MCP 연결 (0) | 2026.06.08 |
| [UE5] 언리얼 C++기초 정리 (0) | 2026.06.05 |