엔진의 세팅 → 월드 세팅 → Game Mode에는 어떤 게임을 만들것인가에 대한 세팅이라고 보면 된다.
클래스를 통해 GameMode를 설정할 수 있는데, 기본적으로 프로젝트의 GameMode가 C++ 클래스 디렉토리 안에 들어있다. ('프로젝트 경로'\Source\UnrealIntroduction)
Ctrl + N으로 새로운 맵을 만들 수 있고, 세팅 → 프로젝트 세팅 → 맵 & 모드 → Default Maps에서 에디터 시작 맵과 게임 기본 맵을 설정할 수 있다.
오브젝트를 생성해서, 키보드로 움직이게 하고 싶다면, 클래스를 생성할 때, Actor보다는 빙의하여 입력받는 기능이 추가된 Pawn을 사용하는 것이 좋다.
스크립트를 보면, Pawn의 경우에는 Actor와 달리 header에 SetupPlayerInputComponent가 생성되어있다. 이것이 입력에 따라 플레이어를 움직이는 역할을 한다.
GameModeBase라는 클래스를 생성하고, GameModeBase cpp파일에 생성자를 생성해보자.
#include "MyGameModeBase.h"
#include"MyPawn.h"
AMyGameModeBase::AMyGameModeBase()
{
DefaultPawnClass = AMyPawn::StaticClass();
}
위 코드를 보면 생성자 안에 AMyPawn의 StaticClass를 DefaultPawnClass로 받아온다. StaticClass는 언리얼에 포함된 스크립트라면 가지고 있는 것 같은데 아직 뭔지 잘 모르겠고, DefaultPawnClass는 GameModeBase.h에 선언되어있다.
TSubclassOf와 같은 형식은 Template에 익숙하지 않아 아직은 모르는 부분이 많다.
참고로 공부하는 중에 visual studio의 Visual Assist라는 것을 알게 되었다. 이 툴을 통해서 리펙토링 등 다양한 기능을 사용할 수 있나보다.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Pawn.h"
#include "MyPawn.generated.h"
UCLASS()
class UNREALINTRODUCTION_API AMyPawn : public APawn
{
GENERATED_BODY()
public:
// Sets default values for this pawn's properties
AMyPawn();
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;
/// ---추가---
void UpDown(float Value);
void LeftRight(float Value);
///
private:
UPROPERTY(EditAnywhere)
UStaticMeshComponent* Mesh;
};
MyPawn.h에 UpDown, LeftRight 함수를 추가했다. 각 함수에 대해서 cpp 파일에 정의문을 작성한다.
void AMyPawn::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);
// 키보드 Axis와 함수를 연결시키는 구문
PlayerInputComponent->BindAxis(TEXT("UpDown"), this, &AMyPawn::UpDown);
PlayerInputComponent->BindAxis(TEXT("LeftRight"), this, &AMyPawn::LeftRight);
//
}
void AMyPawn::UpDown(float Value)
{
if (Value == 0.f)
return;
UE_LOG(LogTemp, Warning, TEXT("UpDown %f"), Value);
}
void AMyPawn::LeftRight(float Value)
{
if (Value == 0.f)
return;
UE_LOG(LogTemp, Warning, TEXT("LeftRight %f"), Value);
}
위 작성한 함수를 PlayerInputComponent BindAxis를 통해 키보드 입력과 연결시킨다.
세팅 → 프로젝트 세팅 → 엔진 → 입력 →바인딩에 축 매핑을 통해 함수와 키보드 입력을 연결시킬 수 있다.
액션도 비슷한데 액션은 키를 버튼처럼 누르는것, 축은 조이스틱처럼 조작하는 것이다.
만약 스크립트를 작성하다가, 헤더에 포함되지 않는 클래스를 헤더에 선언하는 경우 cpp파일에 해당 함수가 포함된 헤더를 include하고, 헤더에서 class를 함수 앞에 붙여 재정의한다.
// UFloatingPawnMovement를 MyPawn.h 헤더에 선언하려는데 에러
UFloatingPawnMovement* Movement;
// 아래 header를 MyPawn.cpp에 추가
#include "GameFramework/FloatingPawnMovement.h"
// MyPawn.h 헤더에서 다음과 같이 처리
class UFloatingPawnMovement* Movement;
Pawn이 직접 움직이도록 하기위해 MyPawn.cpp의 생성자에 UFloatingPawnMovement 컴포넌트(?)를 할당한다.
AMyPawn::AMyPawn()
{
// Set this pawn to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
Mesh = CreateDefaultSubobject<UStaticMeshComponent>((TEXT("MESH")));
// Pawn이 움직일 수 있도록
Movement = CreateDefaultSubobject<UFloatingPawnMovement>(TEXT("MOVEMENT"));
RootComponent = Mesh;
static ConstructorHelpers::FObjectFinder<UStaticMesh> SM(TEXT("StaticMesh'/Game/StarterContent/Props/SM_Couch.SM_Couch'"));
if (SM.Succeeded()) {
Mesh->SetStaticMesh(SM.Object);
}
}
그리고 UpDown, LeftRight함수에 AddMovementInput함수로 Value만큼 이동하도록 설정한다.
void AMyPawn::UpDown(float Value)
{
if (Value == 0.f)
return;
UE_LOG(LogTemp, Warning, TEXT("UpDown %f"), Value);
AddMovementInput(GetActorForwardVector(), Value);
}
void AMyPawn::LeftRight(float Value)
{
if (Value == 0.f)
return;
UE_LOG(LogTemp, Warning, TEXT("LeftRight %f"), Value);
AddMovementInput(GetActorRightVector(), Value);
}
컴파일 후 실행하면 키보드 입력에 따라 Pawn이 움직인다.
'개발 · 컴퓨터공학' 카테고리의 다른 글
Learning Unreal 4 언리얼 공부일지 - 블루프린트 알기 (0) | 2022.01.20 |
---|---|
Learning Unreal 4 언리얼 공부일지 - 캐릭터 움직이기 (0) | 2022.01.19 |
Learning Unreal 4 언리얼 공부일지 - Log, Debug (0) | 2022.01.17 |
Learning Unreal 4 언리얼 공부일지 - UCLASS와 class 내용 변경 (0) | 2022.01.16 |
네트워크 프로그래밍 - Address Resolution Protocol (0) | 2021.12.04 |