Actor 클래스 계층
UObject부터 ACharacter까지 언리얼 엔진의 클래스 계층 구조를 이해합니다
UObject - 모든 것의 시작
언리얼 엔진 오브젝트 시스템의 최상위 클래스
UObject는 언리얼 엔진의 모든 클래스가 상속하는 최상위 기반 클래스입니다. 가비지 컬렉션, 리플렉션, 직렬화 등 엔진의 핵심 기능을 제공합니다.
UObject // 최상위 기반 클래스
├─ AActor // 월드에 배치 가능한 오브젝트
│ ├─ APawn // 컨트롤러에 의해 조종 가능
│ │ └─ ACharacter // 이족보행 캐릭터 (Movement)
│ ├─ APlayerController // 플레이어 입력 처리
│ ├─ AAIController // AI 의사결정
│ ├─ AGameModeBase // 게임 규칙 관리
│ ├─ AGameStateBase // 게임 상태 동기화
│ └─ APlayerState // 플레이어별 상태 정보
├─ UActorComponent // 컴포넌트 기반 클래스
├─ USubsystem // 생명주기 관리 서브시스템
└─ UBlueprintFunctionLibrary // 정적 함수 라이브러리
UObject가 제공하는 핵심 기능
| 기능 | 설명 |
|---|---|
| Garbage Collection | 참조 추적 기반 자동 메모리 관리 |
| Reflection | 런타임에 클래스/속성/함수 정보 조회 (블루프린트 근간) |
| Serialization | 에셋 저장/로드, 네트워크 복제 |
| CDO (Class Default Object) | 클래스별 기본값 오브젝트 (블루프린트 Class Defaults) |
AActor - 월드의 시민
월드에 존재하는 모든 오브젝트의 기반 클래스
AActor는 월드에 배치하거나 스폰할 수 있는 모든 오브젝트의 기반입니다. Transform(위치/회전/크기)을 가지며, 컴포넌트를 포함할 수 있습니다.
Actor의 핵심 특성
Transform
월드 내 위치(Location), 회전(Rotation), 크기(Scale)를 가집니다. GetActorLocation, SetActorRotation 등으로 제어합니다.
컴포넌트 소유
여러 UActorComponent를 포함할 수 있습니다. 컴포넌트를 조합하여 Actor의 기능을 구성합니다.
생명주기
BeginPlay, Tick, EndPlay 등의 이벤트로 생명주기를 관리합니다. SpawnActor로 동적 생성, Destroy로 파괴합니다.
Actor 생명주기 순서
주요 Actor 함수
// 위치/변환
GetActorLocation() → Vector: 월드 위치
SetActorLocation(NewLoc) → 월드 위치 설정
GetActorRotation() → Rotator: 월드 회전
AddActorWorldOffset(Delta) → 상대 이동
// 스폰/파괴
SpawnActor(Class, Transform) → 새 Actor 생성
DestroyActor() → Actor 파괴
// 계층
AttachToActor(Parent, Rule) → 다른 Actor에 부착
GetOwner() → 소유 Actor 반환
// 태그
ActorHasTag(TagName) → 태그 확인 (Boolean)
Tags → Name 배열 (Details에서 편집)
APawn과 ACharacter
플레이어와 AI가 조종하는 캐릭터 클래스
APawn
APawn은 컨트롤러(PlayerController 또는 AIController)에 의해 Possess(소유)될 수 있는 Actor입니다. 입력을 받아 행동하는 모든 엔티티의 기반입니다.
| APawn 기능 | 설명 |
|---|---|
| Controller | PlayerController 또는 AIController가 Possess하여 제어 |
| Input Binding | SetupPlayerInputComponent에서 입력 바인딩 |
| Navigation | NavMesh 위에서 AI 이동 가능 |
ACharacter
ACharacter는 APawn을 상속하며, 이족보행 캐릭터에 필요한 기능이 내장되어 있습니다.
ACharacter
├─ CapsuleComponent // 충돌용 캡슐 (Root)
├─ ArrowComponent // 전방 방향 표시
├─ CharacterMovementComponent // 이동 로직의 핵심
│ ├─ Walking / Running
│ ├─ Jumping / Falling
│ ├─ Swimming
│ ├─ Flying
│ └─ Custom Movement Mode
└─ SkeletalMeshComponent // 캐릭터 메시 (Mesh)
CharacterMovementComponent 주요 설정
| 속성 | 기본값 | 설명 |
|---|---|---|
| Max Walk Speed | 600 | 최대 걷기 속도 (cm/s) |
| Jump Z Velocity | 420 | 점프 초기 속도 |
| Air Control | 0.05 | 공중 이동 제어 (0~1) |
| Gravity Scale | 1.0 | 중력 배수 |
| Braking Deceleration Walking | 2048 | 걷기 감속률 |
| Can Crouch | False | 웅크리기 활성화 여부 |
APawn: 차량, 드론, 탑뷰 RTS 유닛 등 커스텀 이동 로직이 필요할 때
ACharacter: 걷기, 점프, 중력이 필요한 이족보행 캐릭터일 때. CharacterMovementComponent가 대부분의 이동 로직을 처리해줍니다.
Controller 시스템
PlayerController와 AIController의 Possess 패턴
Controller는 Pawn을 소유(Possess)하여 제어하는 두뇌 역할입니다. Pawn은 몸, Controller는 정신으로 분리됩니다.
// Controller → Pawn 관계
APlayerController ──Possess──> APawn / ACharacter
├─ 입력 처리 ├─ 시각적 표현
├─ 카메라 관리 ├─ 물리 충돌
├─ HUD 관리 └─ 이동 로직
└─ 게임 규칙 접근
// 유용한 노드
[Get Player Controller] // 플레이어 컨트롤러 가져오기 (Index: 0)
[Get Controlled Pawn] // 컨트롤러가 소유 중인 Pawn
[Get Controller] // Pawn에서 컨트롤러 가져오기
[Possess] // 새 Pawn 소유
[UnPossess] // 소유 해제
캐릭터가 사망해도 Controller는 유지됩니다. 리스폰 시 새 Pawn을 생성하고 다시 Possess하면 됩니다. 또한 같은 Pawn을 PlayerController와 AIController가 번갈아 소유할 수 있어, 플레이어가 AI 캐릭터를 임시로 조종하는 등의 기능을 쉽게 구현할 수 있습니다.
핵심 요약
- UObject는 가비지 컬렉션, 리플렉션, 직렬화를 제공하는 모든 클래스의 기반이다
- AActor는 월드에 배치 가능하며, Transform과 컴포넌트를 소유한다
- APawn은 Controller에 의해 소유(Possess)될 수 있는 Actor이다
- ACharacter는 CapsuleComponent + CharacterMovementComponent를 내장하여 이족보행 이동을 지원한다
- Controller(두뇌)와 Pawn(몸)을 분리하여 유연한 캐릭터 시스템을 구현한다
- Actor 생명주기: Constructor → BeginPlay → Tick → EndPlay → Destroy
도전 과제
배운 내용을 직접 실습해보세요
Actor Blueprint를 만들고 BeginPlay, EndPlay, Tick 이벤트에 각각 Print String을 연결하세요. 레벨에 배치한 후 PIE로 실행하여 이벤트 발생 순서를 확인하세요. Tick에서는 Delta Seconds도 함께 출력하세요.
APawn 기반 BP와 ACharacter 기반 BP를 각각 생성하세요. Pawn에는 FloatingPawnMovement를, Character에는 기본 CharacterMovement를 사용하여 동일한 입력으로 이동시키고, 점프, 중력, 충돌 처리의 차이를 비교하세요.
GameMode에서 DefaultPawnClass를 커스텀 Character BP로 설정하고, PlayerController에서 Possess/UnPossess를 사용하여 여러 Pawn 사이를 전환하는 시스템을 구현하세요. SpawnActor 노드로 런타임에 Actor를 동적 스폰하는 것도 포함하세요.