[Lost Kingdom] 개발일지 - 3

조재훈·2024년 3월 19일

개발일지 - 3

오늘은 플레이어 캐릭터를 나만의 클래스로 만들어보려고 한다

이 게임에는 크게 캐릭터를 플레이어 캐릭터, NPC로 나누고 플레이어 캐릭터와 싸울 적을 잡몹, 중간, 보스로 나누려고 한다
그래서 먼저 플레이어 캐릭터, NPC의 부모 클래스인 LKCharacterBase를 C++ 클래스로 만드려고 한다

LKCharacterBase

클래스를 생성하면 다음과 같이 헤더 파일이 정의되어 있는데(헤더파일은 생략함)

UCLASS()
class LOSTKINGDOM_API ALKCharacterBase : public ACharacter
{
	GENERATED_BODY()

public:
	// Sets default values for this character's properties
	ALKCharacterBase();

protected:
	// Called when the game starts or when spawned
	virtual void BeginPlay() override;

public:	
	// Called every frame
	virtual void Tick(float DeltaTime) override;

	// Called to bind functionality to input
	virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
};

여기서 현재 필요없어 보이는 것을 지워보겠다.
매 프레임 호출되는 Tick은 캐릭터에서는 필요없기도 하고 매 프레임 호출되는 함수는 피하는게 좋으니 지우자
그리고 SetupPlayerInputComponent은 플레이어의 Input을 클래스 내 함수와 매핑하는 메서드같은데 우린 이미 컨트롤러에서 입력을 처리하고 있으니 지우자

이제 다른 부분을 구현해야 하는데 플레이어 캐릭터만 필요한 부분은 그 클래스에서 처리하도록 하고 NPC에도 적용되는 공통 기능을 구현하자

캐릭터는 폰을 상속받기에 폰의 옵션들도 상속받는다. 그래서 Use Controller Rotation Pitch/Yaw/Roll 옵션이 있다

  • Use Controller Rotation 옵션
    • 언리얼 엔진이 제공하는 컨트롤러(플레이어 컨트롤러)에서 제공하는 회전 값을 사용하여 해당 컴포넌트의 회전을 업데이트 할지 말지를 정하는 옵션이다
    • 내가 해석한 바로는 GTA 같은 1인칭 게임 안에서 마우스를 컨트롤하면서 내가 조종하고 있는 캐릭터가 그 마우스 방향을 보게 된다로 해석했다
    • Pitch
      • X축을 중심으로 한 회전. 머리를 위 아래로 보는 것 같은 느낌(고개를 까딱까딱하는 느낌)
    • Yaw
      • Z축을 중심으로 한 회전. 현재 상태에서 몸을 돌려 왼쪽, 오른쪽으로 돌린 것같이
    • Roll
      • Y축을 중심으로 한 회전 고개를 옆으로 까딱이는 것 같은 느낌(대충 ? 할 때)

위의 옵션들을 살펴보니 나의 게임에서는 (로스트아크 모작) 마우스를 움직여 클릭하면 캐릭터가 그 방향으로 회전하고 이동하기 때문에 즉각으로 회전할 필요는 없어 이런 옵션들을 꺼야 한다

그리고 플레이어는 기본적으로 충돌 컴포넌트가 필요하기에 기본적으로 있는 캡슐 컴포넌트를 수정해주자 -> GetCapsuleComponent()

  • GetCapsuleComponent()->InitCapsuleSize(float InRadius , float InHalfHeight);
    • 해석해보면 알겠지만 첫 번째 매개변수는 반지름, 두 번째 매개변수는 키의 절반? 느낌
    • 임포트한 메시에 따라 수정해보면서 맞춰가는게 중요할 듯

그 다음으로 CharacterMovement 컴포넌트를 수정해보자.
#include "GameFramework/CharacterMovementComponent.h" 헤더 파일 필요

  • GetCharacterMovement()
    • bOrientRotationToMovement
      • 캐릭터가 향하고 있는 방향을 이동하려는 방향에 맞추는 옵션
      • 내가 만드려는 게임은 클릭한 곳으로 회전해서 이동해야 하기에 true로 설정
    • RotationRate
      • 3D 공간에서 회전을 나타내는 구조체 FRotator 변수이며 Pitch, Yaw, Roll 값을 지정할 수 있다
      • 말 그대로 얼마나 빨리 회전하느냐를 나타냄
      • 템플릿에서 쓰던 값 그대로 (0f, 640.0f, 0f) 사용, Yaw 회전 속도?
    • bConstrainToPlane
      • 이 값을 true로 설정하면 캐릭터의 움직임이 특정 평면으로 제한된다
      • 캐릭터가 지면을 따라 수평으로만 이동할 수 있고 수직으로는 이동이 불가능(점프가 불필요)
      • 로스트아크는 특정 지면에 평행하게 이동하므로(점프가 없듯이) true로 설정한다
    • bSnapToPlaneAtStart
      • 위의 옵션과 같이 사용하는 듯 하며 true로 설정하면 캐릭터가 이동을 시작할 때 지정된 평면에 스냅된다
      • 내가 해석하기로 뭐 공중에 떠있는듯한 그런 움직임을 하지 않기 위해 바닥에 딱 붙인다는 느낌같음
    • 이외에도 점프 시 속력이나, 걸음 속도 등 다양한 움직임을 제어할 수 있지만 현재는 불필요한 것 같아 제외하고 진행함

카메라, 스프링암 같은 것은 NPC에게 필요하지않으므로 플레이어 캐릭터를 구현할 때 컴포넌트로 만들어 사용하겠다

그리고 캐릭터의 외형을 책임질 스켈레탈 메시를 설정해보겠다
보통 블루프린트 클래스에서는 그냥 스켈레탈 메시 클릭해서 바꿔주기만 하면 되는데 C++에서는 스켈레탈 메시가 있는 경로를 가져와 Object를 찾은 다음 메시 컴포넌트에 등록해주는 과정을 거치게 된다(사실 블프가 더 편할 것 같긴 함)
현재는 아직 사용할 스켈레탈 메시를 안 가져와서 있는 거 쓰겠다

책이나 강의를 봤으면 흔히 이런 코드가 나옴

static ConstructorHelpers::FObjectFinder<USkeletalMesh> CharacterMeshRef(TEXT("/Script/Engine.SkeletalMesh'/Game/Characters/Mannequins/Meshes/SKM_Quinn.SKM_Quinn'"));
if (CharacterMeshRef.Object)
{
	GetMesh()->SetSkeletalMesh(CharacterMeshRef.Object);
}

지정한 경로에 오브젝트가 있으면 스켈레탈 메시를 설정하는 코드이다

이제 베이스로 쓸 캐릭터를 만들었는데 원래 시간이 더 있었으면 플레이어 캐릭터까지 만드는데 알바 가야돼서 마치겠다,,,

아 잘 됐는지 확인하려고 게임모드에서 DefaultPawn 클래스를 방금 만든 클래스로 교체해보자!

static ConstructorHelpers::FClassFinder<APawn> DefaultPawnClassRef(TEXT("/Script/CoreUObject.Class'/Script/LostKingdom.LKCharacterBase'"));
if (DefaultPawnClassRef.Class)
{
	DefaultPawnClass = DefaultPawnClassRef.Class;
}

생성자는 엔진 킬 때 초기화되니까 엔진 껐다키자

아 의도와 다르게 캐릭터가 붕 떠있다 아마 캡슐 컴포넌트 위치 조정해야할듯,, 다음 일지에서 계속

profile
나태지옥

0개의 댓글