오늘은 플레이어 캐릭터를 나만의 클래스로 만들어보려고 한다
이 게임에는 크게 캐릭터를 플레이어 캐릭터, NPC로 나누고 플레이어 캐릭터와 싸울 적을 잡몹, 중간, 보스로 나누려고 한다
그래서 먼저 플레이어 캐릭터, NPC의 부모 클래스인 LKCharacterBase를 C++ 클래스로 만드려고 한다
클래스를 생성하면 다음과 같이 헤더 파일이 정의되어 있는데(헤더파일은 생략함)
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 옵션위의 옵션들을 살펴보니 나의 게임에서는 (로스트아크 모작) 마우스를 움직여 클릭하면 캐릭터가 그 방향으로 회전하고 이동하기 때문에 즉각으로 회전할 필요는 없어 이런 옵션들을 꺼야 한다
그리고 플레이어는 기본적으로 충돌 컴포넌트가 필요하기에 기본적으로 있는 캡슐 컴포넌트를 수정해주자 -> GetCapsuleComponent()
GetCapsuleComponent()->InitCapsuleSize(float InRadius , float InHalfHeight);그 다음으로 CharacterMovement 컴포넌트를 수정해보자.
#include "GameFramework/CharacterMovementComponent.h" 헤더 파일 필요
GetCharacterMovement()FRotator 변수이며 Pitch, Yaw, Roll 값을 지정할 수 있다카메라, 스프링암 같은 것은 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;
}
생성자는 엔진 킬 때 초기화되니까 엔진 껐다키자

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