
오늘은 어제에 이어서 캐릭터 구현 후 이동을 구현하였다. 이동에는 크게 사방향이동(WASD키로 이동(걷기)), 점프, 달리기가 있다. 이 동작을 수행하기 위해 키 맵핑과 해당 함수를 입력하였다.
SetupInputComponent()함수를 오버라이드하여, 블루프린트에서는 이벤트 그래프를 통해 입력 로직을 구현UnPossess() 함수를 호출하여 Pawn과의 연결을 해제한 뒤, 다른 Pawn으로 바꿔 탈 수 있음헤더파일
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/PlayerController.h"
#include "Sparta_PlayerController.generated.h"
UCLASS()
class SPARTA_PROJECT_API ASparta_PlayerController : public APlayerController
{
GENERATED_BODY()
}
cpp파일
#include "Sparta_PlayerController.h"
GameMode 헤더파일
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/GameMode.h"
#include "Sparta_GameMode.generated.h"
UCLASS()
class SPARTA_PROJECT_API ASparta_GameMode : public AGameMode
{
GENERATED_BODY()
public:
ASparta_GameMode();
};
GameMode cpp파일
#include "Sparta_GameMode.h"
#include "Sparta_Character.h"
#include "Sparta_PlayerController.h" // 플레이어컨트롤 클래스를 사용
ASparta_GameMode::ASparta_GameMode()
{
DefaultPawnClass = ASparta_Character::StaticClass();
PlayerControllerClass = ASparta_PlayerController::StaticClass();
}
PlayerControllerClass : GameMode가 제공하는 속성, 게임 시작 시 - PlayerController 타입을 지정
ASparta_PlayerController::StaticClass() : 언리얼 엔진이 ASparta_PlayerController 클래스의 정보를 런타임에 참조할 수 있도록 제공하는 정적 함수
PlayerController Blueprint 생성 : C++로 만든 Sparta_PlayerController를 더 손쉽게 편집할 수 있도록, 블루프린트로 래핑
아래 설정에서 PlayerConroller Class를 BP_Sparta_PlayerController로 지정

PlayerController 동작 확인

Project Settings -> Input 시스템을 대체하거나 확장하기 위해 Enhanced Input System이 제공



플레이어컨트롤러 헤더파일
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/PlayerController.h"
#include "Sparta_PlayerController.generated.h"
class UInputMappingContext; //IMC 전방선언
class UInputAction; // IA 전방선언
UCLASS()
class SPARTA_PROJECT_API ASparta_PlayerController : public APlayerController
{
GENERATED_BODY()
public:
ASparta_PlayerController();
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Input")
UInputMappingContext* InputMappingContext; //에디터에서 세팅할 IMC
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Input")
UInputAction* MoveAction; // Move 지정할 변수
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Input")
UInputAction* JumpAction; // Jump 지정할 변수
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Input")
UInputAction* LookAction; //Look 지정할 변수
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Input")
UInputAction* SprintAction; //IA_Sprint 지정할 변수
};
플레이어컨트롤러 cpp파일
#include "Sparta_PlayerController.h"
#include "EnhancedInputSubsystems.h"
ASparta_PlayerController::ASparta_PlayerController()
:InputMappingContext(nullptr),
MoveAction(nullptr),
JumpAction(nullptr),
LookAction(nullptr),
SprintAction(nullptr)
{
}

BeginPlay() 함수 추가 CPP파일에 구현 내용 작성Local Player Subsystem을 통해 Input Mapping Context를 활성화플레이어컨트롤러 헤더파일
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/PlayerController.h"
#include "Sparta_PlayerController.generated.h"
class UInputMappingContext;
class UInputAction;
UCLASS()
class SPARTA_PROJECT_API ASparta_PlayerController : public APlayerController
{
GENERATED_BODY()
public:
ASparta_PlayerController();
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Input")
UInputMappingContext* InputMappingContext;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Input")
UInputAction* MoveAction;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Input")
UInputAction* JumpAction;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Input")
UInputAction* LookAction;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Input")
UInputAction* SprintAction;
protected:
virtual void BeginPlay() override; //IMC 활성화를 위한 함수 추가
};
플레이어 컨트롤러 cpp파일
#include "Sparta_PlayerController.h"
#include "EnhancedInputSubsystems.h"
ASparta_PlayerController::ASparta_PlayerController()
:InputMappingContext(nullptr),
MoveAction(nullptr),
JumpAction(nullptr),
LookAction(nullptr),
SprintAction(nullptr)
{
}
void ASparta_PlayerController::BeginPlay()
{
Super::BeginPlay();
// 현재 플레이어컨트롤러에 연결된 로컬 플레이어 객체를 가져오기
if (ULocalPlayer* LocalPlayer = GetLocalPlayer())
{
// 로컬 플레이어에서 인핸드스 인풋 로컬 플레이어 서브시스템을 획득
if (UEnhancedInputLocalPlayerSubsystem* SubSystem = LocalPlayer->GetSubsystem<UEnhancedInputLocalPlayerSubsystem>())
{
if(InputMappingContext)
{
// 서브시스템을 통해 우리가 할당한 IMC 활성화
// 우선순위 0으로 가장 높은 순위
SubSystem->AddMappingContext(InputMappingContext, 0);
}
}
}
}
키 입력 매핑 코드가 많이 복잡하다. 따라해보면서 대소문자 구분, 오타를 잘 보고 작성해야겠다. 키 설정은 언리얼 엔진 안에서 셋팅하는게 좋은 것 같다.
강의 듣기(아이템 생성), 7번째 과제 진행 및 6번째 과제 도전 기능 추가하기