Unreal Character Class

정혜창·2025년 1월 22일
0

내일배움캠프

목록 보기
22/43
post-thumbnail

1.GameMode

1-1 GameMode

  • 언리얼 엔진의 GameMode는 게임의 규칙, 흐름 기본적인 설정을 관리하는 역할을 하는 핵심 클래스이다. 게임이 시작될 때 어떤 규칙으로 작동할지 정의하며, 게임 플레이의 전반적인 동작을 제어한다.

1-2 GameMode의 주요 기능

  • 플레이어 Pawn/Character 스폰

    • 게임이 시작되면 GameMode는 플레이어의 시작 지점과 폰을 관리한다.
    • 예를 들어, 플레이어가 사망했을 때 새로운 폰을 스폰하는 역할을 수행한다.
  • PlayerController 지정

    • 플레이어의 입력(키보드, 마우스, 게임패드 등)을 전달하고 처리하는 PlayerController가 어떤 클래스로 동작할지 설정한다.
    • PlayerControllerClass = ASpartaPlayerController::StaticClass();
  • 게임 규칙 관리

    • 게임의 승리/패배 조건, 게임 시작 및 종료 로직 등을 처리한다.
  • GameState / PlayerState 사용

    • GameState는 전체 게임 흐름(타이머, 전역 변수 등), PlayerState는 플레이어별 정보(체력, 점수 등)를 관리하는 용도로 쓰일 수 있다.
  • 이러한 클래스들을 총괄하며 관리하는 하나의 거대한 매니저역할을 한다고 보면 된다.


2.GameMode 클래스 생성

2-1 C++ 클래스 GameMode 생성

언리얼 에디터 상단 메뉴에서 Tools -> New C++ Class를 클릭하고 GameMode를 검색하면 아래 사진과 같은 클래스가 나온다.

  • GameMode
    • 언리얼에서 제공하는 멀티플레이 기능(세션, 플레이어 연결 로직 등)을 일부 포함하고 있으며, 싱글플레이에서도 문제없이 사용할 수 있다.
    • 필요에 따라 GameState, PlayerState등 연동이 활성화되어 있다.
    • 기본적으로 구현할 수 있는게 더 많다보니 무겁다.
  • GameModeBase
    • GameMode보다는 단순화된 형태로, 멀티플레이 관련 로직이 거의 포함되지 않는다.
    • 간단한 싱글 플레이 게임 또는 직접 멀티플레이 로직을 구현하고 싶을 때 사용하기도 한다.

2-2 GameMode 클래스 적용

  • C++ 클래스를 굳이 블루프린트 클래스로 상속시켜서 하나 더 만드는 이유는 에디터에서 세부 파라미터를 수정하기 훨씬 편리하기 때문이다.
    여기서 블루프린트 클래스는 C++ 클래스를 상속받는 형태로 생성되며 서로 다른 클래스라는 것을 유념해야한다. C++클래스의 확장이라고 보는 것이 좋다.

  • 언리얼 엔진에서 GameMode를 적용하는 방법은 크게 두 가지이다.

    1. 프로젝트 전역 설정
    • 상단 메뉴 Edit -> Project Setting -> Maps & Modes
    • Default GameMode를 BP_SpartaGameMode로 지정
    • 이 프로젝트의 모든 레벨에 대해 기본 GameMode가 BP_SpartaGameMode가 된다.
    1. 레벨 별 설정
    • 상단 메뉴 Window -> World Settings를 클릭해 World Settings 창을 연다.
    • World Settings 창에서 GameMode Override를 BP_SpartaGameMode로 지정
    • 이렇게 하면, 이 특정 레벨은 프로젝트 전역 설정 대신 BP_SpartaGameMode를 사용한다.

만약 프로젝트 전역 설정과 레벨 별 설정이 충돌한다면, 레벨 별 설정이 우선 적용된다.

3. Pawn과 Character 클래스

  1. Pawn 클래스
  • APawn은 게임 세계에서 플레이어 또는 AI가 제어할 수 있는 객체를 나타낸다.

  • 모든 플레이어나 AI 캐릭터는 기본적으로 Pawn 클래스를 기반으로 생성된다.

  • 상대적으로 가벼운 구조로, 복잡한 이동이나 애니메이션 기능이 없다. 커스터마이징이 쉬운 구조를 원할 때 이용하는 클래스.

  1. Character 클래스
  • ACharacterAPawn을 상속한 클래스이고, 인간형 캐릭터를 위해 설계된 확장된 클래스이다.

  • 주로 행동과 애니메이션(걷기, 뛰기, 점프 등)을 지원하며, 캐릭터와 관련된 모든 기능을 제공한다.

  • ACharacter는 복잡한 동작을 구현하기 위한 기능을 미리 포함한다.

    • UCapsuleComponent : 충돌을 처리하기 위한 캡슐
    • USkelealMeshComponent : 캐릭터의 스켈레탈 메시(모델)
    • UCharacterMovementComponent : 이동 로직
  • 추가적으로 네트워크 복제와 AI네이게이션에 적합하도록 설계되어 있다. 인간형 캐릭터가 필요할 때 이용하는 클래스이다.

Character 기반 C++ 클래스를 생성하고 게임모드와 마찬가지로 생성한 C++클래스를 상속받는 블루프린트 클래스도 생성해준다. 이렇게 만든 BP_SpartaCharacter를 열면 왼쪽 컴포넌트 트리에 이미 여러 기본 컴포넌트가 포함되어 있는 것을 볼 수 있다.

4. 카메라 및 GameMode 설정

3인칭 게임에서는 플레이어가 캐릭터의 뒤쪽이나 어깨 너머 시점을 보며 이동하는 경우가 많다. 이를 위해 2가지 컴포넌트를 추가해야한다. USpringArmComponentUCameraComponent를 추가한다. 이후 GameMode 설정을 통해, 우리가 만든 캐릭터가 기본적으로 스폰되도록 구성한다.

SpartaCharacter.h

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "SpartaCharacter.generated.h"

class USpringArmComponent;	// 스프링 암 관련 클래스 전방 선언
class UCameraComponent;		// 카메라 관련 클래스 전방 선언

UCLASS()
class SPARTAPROJECT_API ASpartaCharacter : public ACharacter
{
	GENERATED_BODY()
    
public:
	ASpartaCharacter();
    
protected:
	// 스프링 암 컴포넌트
    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Camera")
    USpringArmComponent* SpringArmComp;
    // 카메라 컴포넌트
    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Camera")
    UCameraComponent* CameraComp;
    
    virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
};

SpartaCharacter.cpp

#include "SpartaCharacter.h"
// 카메라, 스프링 암 실제 구현이 필요한 경우라서 include
#include "Camera/CameraComponent.h"
#include "GameFramework/SpringArmComponent.h"

ASpartaCharacter::ASpartaCharacter()
{
	// Tick은 일단 안 쓰므로 false
    PrimaryActorTick.bCanEverTick = false;
    
    // (1) 스프링 암 생성
    SpringArmComp = CreateDefaultSubobject<USpringArmComponent>(TEXT("SpringArm"));
    // 스프링 암을 루트 컴포넌트 (CapsuleComponent)에 부착
    SpringArmComp->SetupAttachment(RootComponent);
    // 캐릭터와 카메라 사이의 거리 기본값 300으로 설정
    SpringArmComp->TargetArmLength = 300.0f
    // 컨트롤러 회전에 따라 스프링 암도 회전하도록 설정
    SpringArmComp->bUsePawnControlRotation = true;
    
    // (2) 카메라 컴포넌트 생성
    CameraComp = CreateDefaultSubobject<CameraComponent>(TEXT("Camera"));
    // 스프링 암의 소켓 위치에 카메라를 부착
    CameraComp->SetupAttachment(SpringArmComp, USpringArmComponent::SocketName);
    // 카메라는 스프링 암의 회전을 따르므로 PawnControlRotation은 끔
    CameraComp->bUsePawnControlRotation = false;
}

void ASpartaCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
		Super::SetupPlayerInputComponent(PlayerInputComponent);
}
  • USpringArmComponent::SoketName은 FName(TEXT("Something")) 대신 사용되는 정적 멤버 변수로, USpringArmComponent 클래스에서 미리 정의된 특정 소켓 이름을 나타낸다. 하드코딩된 텍스트 대신 클래스에서 제공하는 상수값을 사용해 소켓 이름을 지정하는 더 안전하고 유지보수 가능한 방법

  • 클래스 내부에서 static const FName SoketName; 으로 정의되어 있을 가능성이 높다.

  • bUsePawnControlRotation 앞의 b 접두사는 함수가 bool타입이라는 것을 명시하는 Unreal의 규칙이다. 컨트롤러가 돌아갈 때 스프링암도 같이 돌아가야하므로 true, 카메라 컴포넌트는 스프링암의 회전에 따르므로 끄도록 false


5. GameMode에서 DefaultPawnClass 설정

DefaultPawnClass는 "게임 시작 시 어떤 캐릭터(Pawn)를 플레이어에게 제공할 것인지"를 결정한다. 우리가 만든 SpartaCharacter가 기본 캐릭터로 스폰되도록 설정하려면 BP_SpartaGameMode에서 DefaultPawnClass를 설정해도 되지만 C++파일 SpartaGameMode에 다음과 같이 코드를 추가해도 된다.

SpartaGameMode.h

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/GameMode.h"
#include "SpartaGameMode.generated.h"

UCLASS()
class SPARTAPROJECT_API ASpartaGameMode : public AGameMode
{
	GENERATED_BODY()
    
public:
	ASpartaGameMode()
};

SpartaGameMode.cpp

#include "SpartaGameMode.h"
#include "SpartaCharacter.h"

ASpartaGameMode::ASpartaGameMode()
{
	DefaultPawnClass = ASpartaCharacter::StaticClass();
}
  • StaticClass() 는 언리얼 엔진의 리플렉션 시스템에 의해 모든 UObject 기반 클래스에 자동으로 생성되는 정적 메서드이다. 이 메서드는 특정 클래스의 UClass 오브젝트를 반환한다. 객체를 생성하지 않아도 클래스의 정보를 반환한다.

  • 따라서 위의 DefaultPawnClass = ASpartaCharacter::StaticClass();는 ASpartaCharacter 클래스의 UClass 정보를 반환하여 DefaultPawnClass 변수에 설정한다는 말이다.

  • DefaultPawnClassAGmaeMode 클래스에 정의된 변수로, 게임에서 기본으로 사용되는 폰 클래스를 설정한다.

    • 타입은 TSubclassOf<APawn>이며, APawn을 상속한 클래스만 설정할 수 있다.
profile
Unreal 1기

0개의 댓글

관련 채용 정보