언리얼 엔진(UE4/UE5)을 공부하며 게임플레이의 핵심 구성 요소인 Pawn, Character, Controller, 그리고 Actor의 개념을 정리했다. 이번 학습은 언리얼 엔진의 객체 구조와 클래스 계층을 이해하는 데 초점을 맞췄으며, 실제 프로젝트에 적용 가능한 지식을 기록한다.
1. Pawn (폰)
- 정의: Pawn은 제어 가능한 게임 오브젝트로, 플레이어의 아바타를 나타내는 액터 유형이다. Controller에 의해 소유(Possess)되어 플레이어나 AI의 입력에 따라 움직인다.
- 구현 경험: 초기에는 Pawn과 Controller의 관계를 혼동했으나, Pawn이 단순히 "제어되는 객체"라는 점을 이해하며 명확해졌다. 예를 들어, RTS 카메라 컨트롤러를 Pawn으로 설정해 입력 처리를 구현한 경험이 있다.
- 배운 점: Pawn은 단순한 이동체 역할에 그치지 않고, 다양한 입력 처리를 위한 기반이 된다. 이를 통해 플레이어와 AI가 동일한 인터페이스를 공유할 수 있다는 점이 인상 깊었다.
2. Character (캐릭터)
- 정의: Character는 이족보행 아바타를 위해 설계된 Pawn의 전문화된 버전이다. 이동, 충돌, 애니메이션 등 복잡한 게임 오브젝트 동작을 처리한다.
- 구현 경험: 기본 Character 클래스를 사용해 플레이어 캐릭터를 설정했을 때, 언리얼이 제공하는 이동 및 충돌 처리 기능이 매우 편리했다. 다만, 커스텀 애니메이션을 적용하려다 보니 Animation Blueprint와의 연동에서 약간의 학습 곡선이 있었다.
- 배운 점: Character는 단순한 Pawn보다 훨씬 많은 기능을 내장하고 있어, 빠르게 프로토타입을 만들기에 적합하다. 하지만 커스터마이징 시에는 내부 로직을 명확히 이해해야 한다.
3. Controller (컨트롤러)
- 정의: Controller는 Pawn 또는 Character를 Possess하여 제어하는 역할을 한다. Pawn과 Controller를 분리함으로써, AI와 플레이어가 동일한 인터페이스로 동작할 수 있다.
- 구현 경험: RTS 카메라 시스템에서 PlayerController를 활용해 마우스와 키보드 입력을 처리했다. AIController를 추가로 구현하며 동일한 Pawn을 AI가 제어하도록 설정해본 경험이 있다.
- 배운 점: Controller의 분리 구조 덕분에 코드 재사용성이 높아진다. 특히 AIController를 작성하며 Behavior Tree와의 연동이 흥미로웠다.
4. PlayerController (플레이어 컨트롤러)
- 정의: PlayerController는 게임패드, 마우스/키보드, 터치 입력을 받아 Possess 중인 Pawn 또는 Character를 제어하는 전문화된 컨트롤러다.
- 구현 경험: PlayerController를 설정하며 입력 매핑(Input Mapping Context)을 처음 접했다. 초기에는 입력 바인딩에서 오류가 발생했으나, Enhanced Input 시스템을 도입해 문제를 해결했다.
- 배운 점: PlayerController는 플레이어 경험을 좌우하는 핵심 클래스다. 입력 처리의 유연성을 높이기 위해 Enhanced Input 시스템을 적극 활용할 계획이다.
5. Actor와 World
- 정의: Actor는 UE4의 게임플레이에서 가장 기본적인 단위로, World에 Spawn(배치) 가능한 유일한 오브젝트 유형이다. 레벨에 배치되는 모든 오브젝트는 Actor의 서브클래스다.
- 구현 경험: Actor를 활용해 스태틱 메시, 트리거 박스, 카메라 등을 배치하며 World와의 상호작용을 테스트했다. Actor의 컴포넌트 기반 구조가 매우 직관적이었다.
- 배운 점: Actor의 유연성 덕분에 다양한 오브젝트를 빠르게 배치하고 조작할 수 있었다. 특히 컴포넌트 추가/제거로 기능을 확장하는 방식이 프로토타이핑에 유용했다.
6. C++ 클래스 접두사
- 정의:
- A: Actor의 서브클래스를 나타낸다 (예: AActor, APawn).
- U: UObject의 서브클래스를 나타낸다 (예: UComponent).
- F: 일반 데이터 구조체 또는 UObject 외의 클래스에 사용된다 (예: FVector).
- 구현 경험: C++로 간단한 Actor 클래스를 작성하며 접두사의 의미를 체감했다. 예를 들어, AMyActor를 작성하며 Actor의 생명주기를 학습했다.
- 배운 점: 접두사는 코드 가독성과 클래스 역할 파악에 큰 도움을 준다. 특히 UObject와 Actor의 차이를 명확히 이해하며 메모리 관리에 신경 쓰게 되었다.
7. 개발 중 주요 이슈와 해결
- Pawn과 Controller 연결 문제: 초기에는 Pawn이 Controller의 입력을 받지 못하는 문제가 있었다. Possess 노드의 타이밍을 조정하고, 로그를 추가해 디버깅하며 해결했다.
- 입력 시스템 혼란: Legacy Input과 Enhanced Input 간의 차이를 몰라 설정에 어려움이 있었다. 공식 문서와 커뮤니티 튜토리얼을 참고해 Enhanced Input으로 전환했다.
- C++ 학습 곡선: 블루프린트에 익숙했던 터라 C++ 클래스 작성은 낯설었다. 간단한 Actor 클래스를 작성하며 점차 익숙해졌다.
8. 마무리
이번 학습을 통해 언리얼 엔진의 객체 구조와 게임플레이 프레임워크의 핵심을 깊이 이해할 수 있었다. 특히 Pawn, Character, Controller의 역할과 Actor의 유연성이 프로젝트 설계에 큰 영향을 미친다는 점을 깨달았다. 다음 단계로는 C++와 블루프린트를 혼합해 더 복잡한 게임 로직을 구현하고, AIController와 Behavior Tree를 활용한 AI 시스템을 탐구할 계획이다.
참고: https://docs.unrealengine.com/4.27/ko/Basics/UnrealEngineForUnityDevs/
'공부 > 언리얼 엔진' 카테고리의 다른 글
ChatGpt에게 언리얼 카메라 개발시키기 (0) | 2023.04.23 |
---|---|
개발일지: 언리얼 블루프린트로 구현한 RTS 카메라 제어 시스템 (0) | 2023.03.26 |
개발일지: 언리얼 엔진 튜토리얼 시스템 개발 - 블루프린트, 입력 처리, Enum 활용 (0) | 2023.03.10 |
언리얼 튜토리얼과 UMG 제작 공부 일지 (0) | 2023.02.26 |