๐ก C++๋ก ํ๋ ์ด์ด์ ์บ๋ฆญํฐ๋ฅผ ์กฐ์ํ ์ ์๋๋ก ๋ง๋ค์ด ๋ณด์.
C++์ ์ฌ์ฉํด์ ํ๋ ์ด์ด์ ์บ๋ฆญํฐ์๊ฒ W,A,S,D์ Space, ๋ง์ฐ์ค๋ฅผ ์ฌ์ฉํด์ ํ์์ ์ธ ์กฐ์์ด ๊ฐ๋ฅํ๋๋ก ํด๋ณด๊ฒ ์ต๋๋ค.
์ด๋ฒ์๋ Enhanced Input System์ ์ฌ์ฉํด์ ๊ตฌํํด๋ณด๊ฒ ์ต๋๋ค.
1. Old Input System์ผ๋ก ์กฐ์ ๊ตฌํ
2. Enhanced Input System์ผ๋ก ์กฐ์ ๊ตฌํ
์บ๋ฆญํฐ๋ฅผ ์กฐ์ํ๊ธฐ ์ํ Key ์ถ๊ฐ๋ Blueprint๋ก ๊ตฌํํ ๋์ ๋์ผํ๊ฒ Unreal ์๋ํฐ์์ ์งํํด์ฃผ์ด์ผ ํฉ๋๋ค.
IA_Move, IA_Look,_IA_Jump 3๊ฐ๋ฅผ ๋ง๋ค์ด ์ฃผ์ธ์.
์๋ ์ฌ์ง๊ณผ ๊ฐ์ด ์ค์ ํด์ฃผ์ธ์.
ํค๋ํ์ผ์ ์๋จ์ InputActionValue.h๋ฅผ includeํด์ฃผ์ธ์
#include "InputActionValue.h"
#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "MyPlayer.generated.h"
ํจ์ ๋ํ ๋ณ์์ ๊ฐ์ด ํค๋ํ์ผ์์ ์ ์ธ ํ ์ ์ ๋จ๊ณ๋ฅผ ๊ฑฐ์นฉ๋๋ค.
์์์ ํค๋ ํ์ผ์ ์ถ๊ฐํ๋ฉด GENERATED_BODY()๊ฐ ๋นจ๊ฐ์ค์ด ์ง ๊ทธ์ด๋ฉด์ ์ค๋ฅ๊ฐ ๋ํ๋ ๊ฒ๋๋ค.
์์ธํ ๋ด์ฉ์ ๋ฐ๋ก ํฌ์คํ ์ ํ๊ฒ ์ต๋๋ค.
๋น๋ ํ ์ธ๋ฆฌ์ผ๊ณผ ์ฐ๋ํ๋ฉด ์ค๋ฅ๊ฐ ํด๊ฒฐ๋ฉ๋๋ค.
์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ ํค์ ๋ ฅ์ ๋ํ Input Action์ ๋ฐ์์ฌ ๋ณ์๋ค์ ์์ฑํด์ค๋๋ค.
๋ํ IA๋ค์ ๋ฌถ์ด์ ๊ด๋ฆฌํด์ค IMC ๋ณ์๋ ๋ง๋ค์ด ์ค๋๋ค.
private:
// IMC
UPROPERTY(editanywhere,category=input, meta=(allowprivateaccess = true))
class UInputMappingContext* DefaultMappingContext;
// IA_Jump
UPROPERTY(editanywhere,category=input, meta = (allowprivateaccess = true))
class UInputAction* JumpAction;
// IA_Look
UPROPERTY(editanywhere,category=input, meta = (allowprivateaccess = true))
class UInputAction* LookAction;
// IA_Move
UPROPERTY(editanywhere,category=input, meta = (allowprivateaccess = true))
class UInputAction* MoveAction;
๊ฐ ํค์ ๋ ฅ์ ๋ํด์ ์คํ๋ ํจ์๋ค์ ์ ์ธํด์ฃผ์ธ์.
void Move(const FInputActionValue& value);
void Look(const FInputActionValue& value);
void Jump() override;
์์ค ํ์ผ์ ์๋์ ํค๋ 3๊ฐ๋ฅผ ์ถ๊ฐํด์ฃผ์ธ์.
#include "EnhancedInputComponent.h"
#include "EnhancedInputSubsystems.h"
#include "InputMappingContext.h"
์๋ง ์ค๋ฅ๊ฐ ๋์ ์ถ๊ฐ๊ฐ ์๋์๋ ๋ถ๋ค์ด ๊ณ์ค ์ ์๋๋ฐ ์ผ๋จ ๋นํฉํ์ง ๋ง์๊ณ ์ด์ด์ ์์ฑํ๊ฒ ์ต๋๋ค.
์์ฑํ IA๋ณ์๋ค์ ๋ํด์ ํ๋ก์ ํธ ๋ด์์ ์ ์๋ ์ ๋ ฅ ๋งคํ ์ปจํ ์คํธ์ ์ ๋ ฅ ์ก์ ๋ค์ ๋ก๋ํด์ ์ฐธ์กฐ๋ฅผ ํ ๋นํด์ฃผ์ด์ผ ํฉ๋๋ค.
ํ๋ ์ด์ด์ ์์ฑ์ ๋ถ๋ถ์์ ์ฝ๋๋ฅผ ์์ฑํด์ฃผ์ธ์.
AMyPlayer::AMyPlayer()
{
// ์๋ต
static ConstructorHelpers::FObjectFinder<UInputMappingContext>DEFAULT_CONTEXT(TEXT("/Script/EnhancedInput.InputMappingContext'/Game/Input/IMC_Player.IMC_Player'"));
static ConstructorHelpers::FObjectFinder<UInputAction>IA_MOVE(TEXT("/Script/EnhancedInput.InputAction'/Game/Input/IA_Move.IA_Move'"));
static ConstructorHelpers::FObjectFinder<UInputAction>IA_JUMP(TEXT("/ Script / EnhancedInput.InputAction'/Game/Input/IA_Jump.IA_Jump'"));
static ConstructorHelpers::FObjectFinder<UInputAction>IA_LOOK(TEXT("/ Script / EnhancedInput.InputAction'/Game/Input/IA_Look.IA_Look'"));
if (DEFAULT_CONTEXT.Succeeded())
{
DefaultMappingContext = DEFAULT_CONTEXT.Object;
}
if (IA_MOVE.Succeeded())
{
MoveAction = IA_MOVE.Object;
}
if (IA_JUMP.Succeeded())
{
JumpAction = IA_JUMP.Object;
}
if (IA_LOOK.Succeeded())
{
LookAction = IA_LOOK.Object;
}
}
์ ํฌ๊ฐ ๋ธ๋ฃจํ๋ฆฐํธ๋ก Enhanced Input์ ๊ตฌํํ ๋ ์๋ ์ฌ์ง์ฒ๋ผ ๊ตฌํํ ๊ฒ์ ๊ธฐ์ต๋์๋์?
์ด๊ฑธ ์ง์ ์ฝ๋๋ก ์์ฑํด์ฃผ์ด์ผ ํฉ๋๋ค.
BeginPlay()์์ ์์ฑํด์ฃผ์ธ์.
void AMyPlayer::BeginPlay()
{
Super::BeginPlay();
if (APlayerController* PlayerController = Cast<APlayerController>(GetController()))
{
if (UEnhancedInputLocalPlayerSubsystem* SubSystem =
ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(PlayerController->GetLocalPlayer()))
{
SubSystem->AddMappingContext(DefaultMappingContext, 0);
}
}
}
์ฝ๋๋ง ๋ณด๊ณ ๋ฐ๋ผํ์ ๋ค๋ฉด ์ด๊ฒ ๋ญ์ผ.. ํ์ค ์ ์๊ฒ ์ง๋ง ๊ฐ ์ฝ๋ ํ์ค ํ์ค์ด ๋ธ๋ฃจํ๋ฆฐํธ ์ฌ์ง๊ณผ ๋น๊ตํด๋ณด์๋ฉด ๋ฑ ๋๋์ด ์ค์ค ๊ฒ๋๋ค.
ํค ์ ๋ ฅ์ ๋ฐ์ ์ ์๋๋ก ๊ตฌํํ์์ผ๋ ์ ๋ ฅ๊ณผ ์คํ๋ ํจ์๋ฅผ ๋ฐ์ธ๋ฉ ํด์ฃผ๊ฒ ์ต๋๋ค.
SetupPlayerInputComponent๋ก ์ด๋ํด์ ์์ฑํด์ฃผ์ธ์.
void AMyPlayer::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);
if (UEnhancedInputComponent* EnhancedInputComponent = CastChecked<UEnhancedInputComponent>(PlayerInputComponent))
{
EnhancedInputComponent->BindAction(MoveAction, ETriggerEvent::Triggered, this, &AMyPlayer::Move);
EnhancedInputComponent->BindAction(LookAction, ETriggerEvent::Triggered, this, &AMyPlayer::Look);
EnhancedInputComponent->BindAction(JumpAction, ETriggerEvent::Triggered, this, &AMyPlayer::Jump);
}
}
Move ํจ์๋ฅผ ๊ตฌํํ๊ฒ ์ต๋๋ค.
์์ธํ ์ค๋ช
์ ์ฃผ์์ผ๋ก ๋์ฒดํ๊ฒ ์ต๋๋ค.
void AMyPlayer::Move(const FInputActionValue& Value)
{
// ์ด๋์ ์ฌ์ฉ๋ ๋ฐฉํฅ๊ณผ ์๋๋ฅผ ๋ํ๋
const FVector2D MovementVector = Value.Get<FVector2D>();
// ํ๋ ์ด์ด์ ํ์ฌ ๋ฐฉํฅ
const FRotator Rotation = Controller->GetControlRotation();
// Yaw๋ง์ ์ฌ์ฉํด ์๋ก์ด ํ์ ์์ฑ
const FRotator YawRotation(0.f, Rotation.Yaw, 0.f);
// Yawํ์ ์ ๊ธฐ์ค์ผ๋ก ์ ๋ฐฉ ๋ฐฉํฅ ๊ณ์ฐ
const FVector ForwardDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X);
// ์ ๋ฐฉ ๋ฐฉํฅ๊ณผ Y๊ฐ(์ ๋ฐฉ ์ด๋์๋)์ ์ฌ์ฉํ์ฌ ์ด๋
AddMovementInput(ForwardDirection, MovementVector.Y);
// Yawํ์ ์ ๊ธฐ์ค์ผ๋ก ์ฐ์ธก ๋ฐฉํฅ ๊ณ์ฐ
const FVector RightDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y);
// ์ฐ์ธก ๋ฐฉํฅ๊ณผ X๊ฐ(์ฐ์ธก ์ด๋์๋)์ ์ฌ์ฉํ์ฌ ์ด๋
AddMovementInput(RightDirection, MovementVector.X);
}
Lookํจ์๋ฅผ ๊ตฌํํ๊ฒ ์ต๋๋ค.
Yaw์ Pitch๋ฅผ ์กฐ์ ํด์ฃผ์ด์ผ ํฉ๋๋ค.
void AMyPlayer::Look(const FInputActionValue& Value)
{
// ํ์ ๋
const FVector2D LookVector = Value.Get<FVector2D>();
// X๊ฐ(์ํ ํ์ ๋)์ ์ฌ์ฉํด yawํ์ ์ถ๊ฐ > ์ํ ์์ ํ์
AddControllerYawInput(LookVector.X);
// Y๊ฐ(์์ง ํ์ ๋)์ ์ฌ์ฉํด pitchํ์ ์ถ๊ฐ > ์์ง ์์ ํ์
AddControllerPitchInput(LookVector.Y);
}
Jump๋ ์บ๋ฆญํฐ์ ์๋ ์ ํ๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ๋๋ก ํ๊ฒ ์ต๋๋ค.
void AMyPlayer::Jump()
{
Super::Jump();
}
์ฌ๊ธฐ๊น์ง๋ก ๊ตฌํ์ ๋ชจ๋ ๋๋ฌ์ต๋๋ค.
๊ทผ๋ฐ ๋นจ๊ฐ์ค์ด ๊ณณ๊ณณ์ ๊ทธ์ฌ ๊ณ์ ๋ถ๋ค์ด ๊ณ์ค๊ฒ๋๋ค.
๋ณธ์ธ ํ๋ก์ ํธ์ Games - Config - Source - <ํ๋ก์ ํธ๋ช
ํ์ผ>๋ก ์ด๋ํ๋ฉด ํ๋ก์ ํธ๋ช
.Build.cs๊ฐ ์์ต๋๋ค.
ํด๋น ํ์ผ์ ์ด์ด์ฃผ์ธ์.
๊ทธ๋ฆฌ๊ณ EnhancedInput์ ์ถ๊ฐ๋ก ์ ์ด์ฃผ์ธ์.
ํ์ํ ๋ชจ๋์ ์ถ๊ฐํด์ฃผ์ด์ผ ํฉ๋๋ค.
์ถํ ํ๋ฉด์ ํ์๋ ์์ ฏ์ ์ฌ์ฉํ ๋ UMG๋ฅผ ์ถ๊ฐ๋ก ์ ์ด ์ฃผ์ด์ผ ํฉ๋๋ค.
๊ป๋ค ์ผ๋ณด์ธ์. ์ด๊ฑฐ ์ค์ํฉ๋๋ค.
๋ค์ ๋น๋๋ฅผ ํด๋ณด์ธ์.
ํ๋ก์ ํธ ํ์ผ๋ก ์ด๋ํด์ ํ๋ก์ ํธ.exe๋ฅผ ์ฐํด๋ฆญํด์ Generate Visual Studio project files๋ฅผ ํด์ฃผ์ธ์.
์ปดํจํฐ๊ฐ ๊ฐ๋ ๊ฑฐ์ง๋ง์ ํฉ๋๋ค...
โ์ ์ฅ ํ ์คํโํด๋ณด๋ฉด ํ๋ ์ด์ด๋ฅผ ์กฐ์ํ ์ ์์ต๋๋ค.
์บ๋ฆญํฐ์๊ฒ Enhanced Input System์ ์ฌ์ฉํด์ ๊ธฐ์ด์ ์ธ ์์ง์์ด ๊ฐ๋ฅํ๋๋ก ๊ตฌํํ์ต๋๋ค.
์์ธ์ ์ ์๋ ์๋ ์๋ฌ๊ฐ ๋ง๊ตฌ๋ง๊ตฌ ๋ํ๋์ ์์ธ์ ํ์ ํ๊ณ ์ ๋ง์ด ์ฐ๊ตฌํด ๋ณผ ์ ์๋ ์๊ฐ์ด์์ต๋๋ค.
์ธ๋ฆฌ์ผ ์์ง์ ๋ฒ์ ์ ๋ฐ๋ผ, ๋ Visual Studio์ ๋ฒ์ ์ ๋ฐ๋ผ ๋ชจ๋ ๋ค๋ฅด๊ฒ ๋ํ๋๋ ์๋ฌ๋ผ๊ณ ํฉ๋๋ค.
1. Old Input System์ผ๋ก ์กฐ์ ๊ตฌํ
2. Enhanced Input System์ผ๋ก ์กฐ์ ๊ตฌํ