1. Pawn 클래스란?
- Pawn은 플레이어 혹은 AI가 소유(Possess)할수 있는 가장 상위 클래스이다. 즉, 엔진에서 "무언가를 조종한다"고 할 때 기본이 되는 형태가 Pawn이다.
- Pawn에는 이동 로직이나 충돌 처리, 중력, 네트워크 이동을 위한 기능들이 기본적으로 포함되어 있지 않다.
- 보행(걷기, 달리기, 점프 등)에 필요한 시스템(캡슐 콜리전, 중력, 지형 따라가기)을 모든 단계에서 직접 구현해야 하므로, 사람 캐릭터를 처음부터 Pawn으로 만들기에는 다소 부담이 크다.
- 이러한 특성 덕분에, 비행기, 드론, 카메라처럼 기존 Characater의 이동 방식을 벗어난 특수한 로직을 완전히 자유롭게 구현할 때 유용하다.
2. Character 클래스란?
- Character는 Pawn을 상속받아 만들어진 자식 클래스 중 하나로, 기본적으로 UCharacterMovementComponent를 포함하고 있다.
- 이동, 회전, 점프, 중력, 지형 따라가기, 네트워크 동기화 등 보행형 캐릭터에게 필요한 기능이 이미 구현되어 있어, 사람이 달리고 점프하는 형태의 캐릭터를 쉽게 만들 수 있다.
- 여기에 미리 정의된 대표적인 함수들(MoveForward, MoveRight, Jump)이 존재하므로, 몇 줄의 코드만 추가해도 금방 캐릭터 움직임을 테스트할 수 있다.
- 캐릭터를 구성하는 전형적인 요소들이 표준화되어 있어, 일반적인 인간형 캐릭터를 만드는데 최적화되어 있다.
- 단, 자동차나 비행기처럼 완전히 다른 이동 방식을 구현할 때는 Character 내부에 탑재된 기능들이 오히려 방해가 될 수 있다. 이런 경우에는 Pawn을 직접 확장해서 사용하는 것을 고려해야 한다.
3. Character 클래스 생성하기
C++ 클래스를 생성한 후, 이 클래스를 Blueprint로 한번 더 감싼다.
4. Character 클래스 구조 살펴보기
블루프린트를 열면 왼쪽 컴포넌트 트리에 이미 여러 컴포넌트가 포함되어 있는 것을 확인할 수 있다.
4 - 1. Capsule Component (Root Component)
- 캐릭터가 벽이나 지형에 충돌하는 범위를 정의하는 콜리전 컴포넌트이다.
- 캡슐 형태이며, Radius(반지름)와 Half Height (높이 절반)를 조정해 캐릭터의 물리적 크기를 설정할 수 있다.
4 - 2. Arrow Component
- 캐릭터가 어느 방향을 바라보고 있는지를 표시하기 위해 씬에 화살표를 띄워주는 컴포넌트이다.
- 게임 플레이 로직에는 직접적인 영향을 주지 않고, 주로 편집기에서 시각적 디버깅용으로 사용된다.
4 - 3. Skeletal Mesh Component
- 캐릭터의 3D 모델과 애니메이션을 적용하는 컴포넌트이다.
- Skeletal Mesh, Anim Blueprint 등을 여기로 할당해 캐릭터의 외형과 동작을 제어한다.
4 - 4. Character Movement Component
- 캐릭터의 이동, 점프, 중력, 네트워크 동기화 등 물리적 이동 로직을 담당하는 핵심 컴포넌트이다.
- 언리얼에서 제공하는 주요 이동 함수 (MoveForward, MoveRight, Jump)가 이미 연결되어 있어, 최소한의 코드만으로 캐릭터 조작을 구현할 수 있다.
5. Skeletal Mesh란?
- Skeletal Mesh는 내부에 뼈대를 갖춘 3D 모델을 의미한다.
- 이 뼈대가 부모 - 자식 관계로 연결되어 있으며, 본이 움직이면 외형(Mesh)도 함께 움직이게 된다.
- 본과 메시가 연동되기 때문에 애니메이션(본 움직임)에 맞춰 캐릭터가 뛰거나 걷는 동작을 구현할 수 있다.
- 언리얼 엔진은 물리 엔진과도 연결할 수 있어, Ragdoll(피격 후 쓰러지는) 효과 등 물리 기반 애니메이션 구현도 쉽게 가능하다.
5 - 1. Skeletal Mesh 설정
- 메시를 적용하면 뷰포트에 자동으로 캐릭터 외형이 표시되고, 머티리얼도 기본으로 연결된다.
5 - 2. 메시 위치 및 방향 설정
- Arrow Component가 가리키는 방향대로 메시의 rotation을 조절해 준다.
- 또한 캡슐 크기를 메시에 맞춰 조절하고, 캐릭터 메시의 발이 캡슐 바닥에 정확히 닿도록 위치를 맞춘다.
- 캡슐의 충돌 범위가 너무 작거나 크면 게임 플레이 시 충돌 문제가 발생할 수 있으므로 값을 적절히 조절한다.
6. 카메라 설정하기
- 3인칭 게임에서는 플레이어가 캐릭터의 뒤쪽이나 어깨 너머 시점을 보며 이동하는 경우가 많다.
- 이를 위해 SpringArm과 CameraComponent를 추가한다.
Character.h
class USpringArmComponent; // 스프링 암 관련 클래스 헤더
class UCameraComponent; // 카메라 관련 클래스 전방 선언
.
.
.
UCLASS()
class MYPROJECT_API AMyCharacter : public ACharacter
{
.
.
.
protected:
// 스프링 암 컴포넌트
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Camera")
USpringArmComponent* SpringArmComp;
// 카메라 컴포넌트
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Camera")
UCameraComponent* CameraComp;
.
.
.
}
- 캐릭터 헤더 파일에 스프링 암과 카메라 관련 클래스를 전방 선언하고 프로퍼티를 추가한다.
Character.cpp
#include "MyCharacter.h"
// 카메라, 스프링 암 실제 구현이 필요한 경우라서 include
#include "Camera/CameraComponent.h"
#include "GameFramework/SpringArmComponent.h"
AMyCharacter::AMyCharacter()
{
// Tick 함수는 우선 꺼둡니다.
PrimaryActorTick.bCanEverTick = false;
// (1) 스프링 암 생성
SpringArmComp = CreateDefaultSubobject<USpringArmComponent>(TEXT("SpringArm"));
// 스프링 암을 루트 컴포넌트 (CapsuleComponent)에 부착
SpringArmComp->SetupAttachment(RootComponent);
// 캐릭터와 카메라 사이의 거리 기본값 300으로 설정
SpringArmComp->TargetArmLength = 300.0f;
// 컨트롤러 회전에 따라 스프링 암도 회전하도록 설정
SpringArmComp->bUsePawnControlRotation = true;
// (2) 카메라 컴포넌트 생성
CameraComp = CreateDefaultSubobject<UCameraComponent>(TEXT("Camera"));
// 스프링 암의 소켓 위치에 카메라를 부착
CameraComp->SetupAttachment(SpringArmComp, USpringArmComponent::SocketName);
// 카메라는 스프링 암의 회전을 따르므로 PawnControlRotation은 꺼둠
CameraComp->bUsePawnControlRotation = false;
}
.
.
.
cpp 파일 설명
SpringArmComp->bUsePawnControlRotation = true
- 플레이어가 마우스를 움직이면 Controller의 회전 값이 변경되고, 이때 스프링 암도 같이 회전하도록 설정한다.
- 결과적으로 카메라도 따라 회전하여 3인칭 시점을 자연스럽게 구현할 수 있다.
CameraComp->bUsePawnControlRotation = false
- 이미 스프링 암이 회전을 처리하므로, 카메라 자체는 PawnControllerRotation을 사용하지 않도록 한다.
빌드를 마치고 언리얼 에디터로 돌아오면, 캐릭터 블루 프린트 컴포넌트 트리에 SpringArmComp와 CameraComp가 추가된 것을 확인할 수 있다.
필요한 경우 이 컴포넌트들의 위치나 거리를 블루 프린트 레벨에서 미세 조정하면 된다.
7. GameMode에서 DefaultPawnClass 설정
- DefaultPawnClass는 게임 시작 시 어떤 캐릭터를 플레이어에게 제공할 것인지를 결정한다.
- 위에서 만든 캐릭터가 기본 캐릭터로 스폰되도록 설정하려면 GameMode c++ 클래스 파일에 다음과 같이 코드를 추가한다.
MyGameMode.h
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/GameMode.h"
#include "MyGameMode.generated.h"
UCLASS()
class MYPROJECT_API AMyGameMode : public AGameMode
{
GENERATED_BODY()
public:
AMyGameMode();
}
생성자를 추가해 준다.
MyGameMode.cpp
#include "MyGameMode.h"
#include "MyCharacter.h"
AMyGameMode::AMyGameMode()
{
DefaultPawnClass = MyCharacter::StaticClass();
}
위와 같은 코드가 있으면 게임 시작 시, MyCharacter가 자동으로 스폰되고, PlayerController와 연결되어 플레이어가 조작할 수 있게 된다. (아직은 PlayerController 구현을 안 했으므로 움직이지 않음)
World Setting으로 돌아가 Default Pawn Class에 캐릭터의 블루프린트 클래스를 넣어 준다.
8. 결과
게임이 시작되면 DefaultPawnClass로 설정된 캐릭터는 맵에 배치된 Player Start 위치에 스폰된다.
'Unreal' 카테고리의 다른 글
Enhanced Input System의 이해 및 Input Action 설정하기 (0) | 2025.02.12 |
---|---|
Player Controller (0) | 2025.02.12 |
GameMode 이해하기 (0) | 2025.02.06 |
[7강 숙제] 멤버 변수 및 멤버 함수 리플렉션 시스템 사용하기 (0) | 2025.01.23 |
언리얼 엔진 리플렉션 (0) | 2025.01.23 |