게임모드




GameMode를 상속받고 C++을 새롭게 만든다.



게임모드에서 설정할 수 있는 건 프로젝트에서 확인을 할 수 가 있다

 



우선 사용할 Default  Pawn을 만들자

 


기본캐릭터 설정

 

Pawn이나 Character을 상속하여 클래스를 작성을 한다
Chatacter으로 상속했을 경우에는 캡슐과 메시가 상속있어서 겟터함수를 이용해서 호출 할수 있다
.

Character.h

 

class KGAME_API AKCharacter : public ACharacter
{
	GENERATED_BODY()
public:
	AKCharacter();

protected:
	virtual void BeginPlay() override;

public:	
	virtual void Tick(float DeltaTime) override;
	virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;

public:
	//UPROPERTY(VisibleAnyWhere, Category = Collision)
	//	UCapsuleComponent* m_Capsule;
	//UPROPERTY(VisibleAnyWhere, Category = Visual)
	//	USkeletalMeshComponent* m_Mesh;
	
	UPROPERTY(VisibleAnywhere, Category = Camera)
		USpringArmComponent* m_SpringArm;

	UPROPERTY(VisibleAnywhere, Category = Camera)
		UCameraComponent* m_Camera;


캡슐과 메시는 이미 상속받앗기 떄문에 주석처리를 했다

 

AKCharacter::AKCharacter()
{
	PrimaryActorTick.bCanEverTick = true;

	//GetCapsuleComponent() = CreateDefaultSubobject<UCapsuleComponent>(TEXT("Capsule"));
	//m_Mesh = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT("Mesh"));
	m_SpringArm = CreateDefaultSubobject<USpringArmComponent>(TEXT("Spring"));
	m_Camera = CreateDefaultSubobject<UCameraComponent>(TEXT("Camera"));


	RootComponent = GetCapsuleComponent();
	GetMesh()->AttachTo(GetCapsuleComponent());
	m_SpringArm->SetupAttachment(GetCapsuleComponent());
	m_Camera->SetupAttachment(m_SpringArm);

	
	GetCapsuleComponent()->SetCapsuleHalfHeight(88.0f);
	GetCapsuleComponent()->SetCapsuleRadius(20.0f);
	GetMesh()->SetRelativeLocationAndRotation(FVector(0.0f, 0.0f, -88.0f), FRotator(0.0f, -90.0f, 0.0f));
	m_SpringArm->TargetArmLength = 200.0f;
	m_SpringArm->SetRelativeLocationAndRotation(FVector(0.0f,0.0f,40.0f),FRotator(-25.0f, 0.0f, 0.0f));



	static ConstructorHelpers::FObjectFinder<USkeletalMesh> PlayerModel(TEXT("SkeletalMesh'/Game/Sailor_01/Mesh/SK_Sailor01.SK_Sailor01'"));

	if (PlayerModel.Succeeded()) {
		GetMesh()->SetSkeletalMesh(PlayerModel.Object);
	}
}

 

	//GetCapsuleComponent() = CreateDefaultSubobject<UCapsuleComponent>(TEXT("Capsule"));
	//m_Mesh = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT("Mesh"));
	m_SpringArm = CreateDefaultSubobject<USpringArmComponent>(TEXT("Spring"));
	m_Camera = CreateDefaultSubobject<UCameraComponent>(TEXT("Camera"));


	RootComponent = GetCapsuleComponent();
	GetMesh()->AttachTo(GetCapsuleComponent());
	m_SpringArm->SetupAttachment(GetCapsuleComponent());
	m_Camera->SetupAttachment(m_SpringArm);


위와 같은 코드로 작성을 했는데, 먼저CreateDufalut로 생성을 하고
캡슐을 루트컴포넌트로 삼아서, 컴포넌트 관계를 구축했다. 
여기에 스트링암과 카메라를 연결 했다.


컴포넌트 관계 설정


먼저 메시를 호출 하고 맞춰 주어야 캐릭터가 호출이 된다

static ConstructorHelpers::FObjectFinder<USkeletalMesh> PlayerModel(TEXT("SkeletalMesh'/Game/Sailor_01/Mesh/SK_Sailor01.SK_Sailor01'"));

if (PlayerModel.Succeeded()) {
	GetMesh()->SetSkeletalMesh(PlayerModel.Object);
}


ConstructorHelpers 는 생성할떄 도와주는 함수로 생성할떄 사용하는 것이 좋고,
static을 사용하는 이유는 다른 곳에서 또 만들어서 사용하는 낭비를 줄이기 위해서 이다.
메시 경로는 우클릭 후 레퍼런스 복사로 쉽게 복사 할수 있다.
그리고 Succeeded함수를 이용해서 Null체크를 한수 스켈레톤 메시를 설정한다

그리고 컴파일 후 보면 C++ 미리보기에 캐릭터가 표시되어 있다

 

 


그리고 드래그를 해서 보면, 메시 캡슐 스트링 위치가 맞지가 않다.


BP로 만들어서 수정을 하는 방법이 있고, 여기서 코드로 맞추는 방법도 있다.

BP는 확장을 해서 편집이 필요한 경우에만 사용할 생각 이라서

그냥 코드로 함

 

안맞는 위치 




GetCapsuleComponent()->SetCapsuleHalfHeight(88.0f);
	GetCapsuleComponent()->SetCapsuleRadius(20.0f);
	GetMesh()->SetRelativeLocationAndRotation(FVector(0.0f, 0.0f, -88.0f), FRotator(0.0f, -90.0f, 0.0f));
	m_SpringArm->TargetArmLength = 200.0f;
	m_SpringArm->SetRelativeLocationAndRotation(FVector(0.0f,0.0f,40.0f),FRotator(-25.0f, 0.0f, 0.0f));

그래서 위치와 거리를 맞춰준다!

 

카메라에 표시된 것을 확인하니 설정한 위치가 맞다.
나중에 게임 하면서 안맞으면 다시 바꾸어 줄 생각


사용할 캐릭터를 만들었으니, 

마지막으로 게임모드에서 디폴트 폰을 설정한다

캐릭터 헤더를 게임모드 Cpp에 추가를 한후

디폴트 폰을 설정해 준다

방법은 아래처럼 2가지가 있다. (더 있을 수도 있음)

 

#include "KGameMode.h"
#include "KCharacter.h"

AKGameMode::AKGameMode()
{
	//방법1
    static ConstructorHelpers::FClassFinder<APawn> PlayerPawnClassFinder(TEXT("/Game/FirstPersonCPP/Blueprints/FirstPersonCharacter"));
	DefaultPawnClass = PlayerPawnClassFinder.Class;

	//방법2
	DefaultPawnClass = AKCharacter::StaticClass();
}

 

그리고 월드세팅에서 게임모드를 바꾸어 주면 된다

 

 

 

 

실행화면


캐릭터 좌 우 2개는 미리 배치해둔 캐릭터이다


아직 컨트롤러는 설정을 안했으므로 움직이지는 않는다.

'Unreal > Game 2 ' 카테고리의 다른 글

4.1 기존 바인딩 함수 이동  (0) 2019.06.18
4. 캐릭터 애니메이션  (0) 2019.06.17
3. 플레이어 컨트롤러 (바인딩 방법 2개)  (0) 2019.06.15
1. 게임준비 및 디버깅로그 세팅  (0) 2019.06.14
0. 게임 기획?  (0) 2019.06.14

+ Recent posts