728x90
이 글은 Inflearn - Rookiss : 언리얼 엔진4 입문 강의를 듣고 정리한 글입니다.

 

목차.

  1. Game Mode란?
  2. Game Mode 새로 만들기
  3. 키 입력으로 Pawn 움직이기

 

Game Mode란?

 

월드 세팅창에서 보면 GameMode라는 항목을 볼 수 있다.

GameMode는 일종의 규칙이라고 볼 수 있다.

 

배틀그라운드의 규칙으로 자기장이 나온다.

카스의 규칙으로 폭탄이 터지면 이긴다 등의 규칙들이 있는데, Game Mode는 이러한 규칙들을 설정할 수 있는 Mode라고 보면 된다.

 

게임모드에 따라 아래에 있는 Class들이 변경이 되며 게임 자체를 관제하게 된다.

 

 

 

 

Game Mode 새로 만들기

 

콘텐츠 브라우저 창에서 빈 공간 우클릭 -> 새로운 C++클래스 -> Game Mode Base 클릭

 

 

그러면 게임패드 아이콘의 C++ 클래스가 생성됩니다.

 

 

새로운 레벨에서 작업을 계속하겠습니다.

 

Ctrl+ M을 누르면 새로운 레벨을 생성하고 이동합니다.

 

 

생성한 레벨을 폴더에 저장을 합니다.

 

언리얼 에디터 창을 종료하고 다시 시작했을 때 해당 레벨로 바로 이동하는 방법은

 

세팅 -> 프로젝트 세팅 -> 맵& 모드 -> Default Maps -> 에디터 시작맵, 게임 기본 맵 설정

 

 

 

방금 생성한 맵을 시작맵과 기본맵으로 설정해 주었습니다.

 

이제 방금 만든 게임모드를 적용해 보겠습니다.

 

 

그러면 아래에 클래스들이 모두 Default 상태로 됩니다.

 

Default Pawn Class를 새로 추가하기 위해서 새로운 Pawn Class를 만들었고, 클래스를 열어보니 Actor와 다른 점은 

Pawn 클래스의 상속을 받고 있다는 점과 SetupPlayerInputComponent라는 함수가 있다는 점입니다.

 

 

 

생성한 Pawn 클래스도 Mesh가 있어야 하기 때문에 전에 작성해 둔 Actor의 StaticMesh 생성 코드를 불러오겠습니다.

 

전에 작성한 글은 아래를 참고하시면 됩니다.

 

 

[UE4] 언리얼 엔진 기초 : C++을 활용한 Actor 생성

이 글은 Inflearn - Rookiss : 언리얼 엔진4 입문 강의를 듣고 정리한 글입니다. 목차. C++ 클래스 생성과 구조 클래스에서 StaticMeshComponent 추가하기 클래스에서 Static Mesh Load 하기 지역변수 외부 노출과

wookeee.tistory.com

 

새로운 Pawn 클래스에 Static Mesh를 추가하니 아래와 같이 아이콘이 설정한 Mesh로 변경되었습니다.

 

 

이제 GameMode의 Default Pawn Class를 설정해 보겠습니다.

 

MyPawn.h를 추가한 이유는 AMyPawn클래스의 StaticClass에 접근하기위함

 

이제 언리얼 엔진으로 돌아와 컴파일 후 게임을 실행하면

 

 

Default Pawn Class가 MyPawn으로 제가 생성한 폰 클래스로 설정된 것을 볼 수 있고,

 

게임을 실행해 보면 

 

 

기존 회색 공이 생겼었지만 이제는 직접 만든 폰이 생성되는 것을 볼 수 있습니다.

 

 

키 입력으로 Pawn 움직이기 

 

유니티에서는 Input.Get~~ 과 같이 Update문을 통해서 입력을 처리했었습니다.

 

하지만 그런 방법은 클래스와 입력받는 코드와 연관성이 생기고, 종속성이 생긴다는 문제가 있습니다.

 

언리얼의 경우 입력을 조금 더 구조화하였는데,

 

void AMyPawn::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
	Super::SetupPlayerInputComponent(PlayerInputComponent);
}

 

위 코드와 같이  입력받는것을 별도의 컴포넌트로 구분한 것을 볼 수 있습니다.

 

처음 SetupPlayerInputComponent 함수를 통해 어떤 키를 눌렀을 때 어떤 함수 호출이 되어야 하는지를 맵핑하는 식으로 작업을 할 수 있다.

 

그럼 간단하게 W, A, S, D 키 입력을 통해 Pawn 클래스가 움직이는 코드를 작성해 보겠습니다.

 

.h

	void UpDown(float Value);
	void LeftRight(float Value);

 

.cpp

// Called to bind functionality to input
void AMyPawn::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
	Super::SetupPlayerInputComponent(PlayerInputComponent);

	PlayerInputComponent->BindAxis(TEXT("UpDown"), this, &AMyPawn::UpDown);
	PlayerInputComponent->BindAxis(TEXT("LeftRight"), this, &AMyPawn::LeftRight	);
}

void AMyPawn::UpDown(float Value)
{
	if (Value == .0f) //키 입력이 없다면 return
		return;
	UE_LOG(LogTemp, Warning, TEXT("UpDown %f"), Value);
}

void AMyPawn::LeftRight(float Value)
{
	if (Value == .0f) //키 입력이 없다면 return
		return;
	UE_LOG(LogTemp, Warning, TEXT("LeftRight %f"), Value);
}​

 

 

PlayerInputComponent ->BindAxis 함수를 통해서 움직임을 구현할 것이고

 

일단 정상적으로 호출되는지 확인을 위해 LOG를 출력해 보겠습니다.

 

이대로 게임을 실행해도 로그는 찍히지 않습니다.

 

세팅을 통해 키를 바인딩해야 합니다.

 

세팅 -> 입력 -> 축 매핑

바인딩에 보면 액션 매핑과 축 매핑이 있는데 Axis를 통해 키입력을 하기 때문에 축 매핑으로 키입력을 받아오겠습니다.

 

이제 키 입력을 하면 

 

 

로그가 잘 찍히는 것을 볼 수 있습니다.

 

함수 호출이 정삭적으로 되는 것을 확인했으니 이제 움직이는 코드로 변경해 보겠습니다.

 

.h

private:
	UPROPERTY(VisibleAnywhere);
	class UFloatingPawnMovement* Movement;

 

.cpp

#include "GameFramework/FloatingPawnMovement.h" 

AMyPawn::AMyPawn()
{
 .....
 Movement = CreateDefaultSubobject<UFloatingPawnMovement>(TEXT("MOVEMENT"));
 .....
 }
 void AMyPawn::UpDown(float Value)
{
	if (Value == .0f)
		return;
	AddMovementInput(GetActorForwardVector(), Value); //1이 입력되면 앞으로 -1은 뒤로
}

void AMyPawn::LeftRight(float Value)
{
	if (Value == .0f)
		return;
	AddMovementInput(GetActorRightVector(), Value); //1이 입력되면 오른쪽 -1은 왼쪽
}

 

결과

 

defalut로 생성된 pawn이 키 입력 시 잘 움직이는 것을 볼 수 있습니다.

 

728x90

+ Recent posts