Unreal

9. The Pawn Class & Enhanced Input System (1)

Kelvin의 게임개발 2024. 1. 3. 00:26
728x90
반응형

1. Binding Input

 

게임을 시작하게 되면 AController가 생성되고 Player에 할당된다 그리고 Controller는 Possess(빙의)할 Pawn을 선택한다 

 

Pawn은 Actor와 다르게 Controller에 의해 빙의될 수 있다

 

Pawn에 Controller가 빙의하면 해당 Pawn을 제어하고 입력을 받을 수 있다

 

Pawn은 Auto Possess Player라는 변수가 있고 이를 Player0로 지정하면 Pawn의 Player를 월드의 첫번째 Player로 지정할 수 있다
(멀티플레이 게임같은 경우 순서대로 Player0, Player1, Player2로 늘어나게 된다)

 

Pawn의 DetailTab에서 Auto Possess Player를 지정할 수 있다 (기본은 Disabled)

 

Player0으로 지정하게 되면 해당 Pawn에 Player는 빙의된다 (Default Pawn도 더 이상 생성되지 않는다)

 

AutoPossessPlayer = EAutoReceiveInput::Player0;

이렇게 코드로 AutoPossessPlayer를 지정할 수 있다

 

 

Edit -> ProjectSetting -> Input에서 키/마우스/조이스틱 매핑이 가능하다

 

Axis Mapping에는 한 개 이상의 키를 할당할 수 있다

 

float을 매개변수로 가지는 함수 (콜백함수)를 만들고 이 함수를 지정한 AxisMapping에 Bind해준다

이때 Bind는 APawn::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)에서 처리한다


AxisMapping에 지정한 키를 누를때마다 Bind해준 함수가 매 프레임 호출된다


이때 AxisMapping의 scale이 1이라면 float 매개변수 값은 해당 키를 누르면 1.0을 가지게 되고 누르지 않으면 0.0을 가진다 (scale에 따라 값이 변한다, scale은 음수도 가능하다)

 

이 float 매개변수를 이용하여 0이면 멈추고 0이 아니면 Pawn을 움직이는 등 다양한 처리를 할 수 있다

 

void MoveForward(float Value); //float을 매개변수로 가지는 AxisBind용 함수


//해당 함수는 게임 초기에 호출되어 UInputComponent*타입의 PlayerInputComponent를 받는다
void ABird::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
	Super::SetupPlayerInputComponent(PlayerInputComponent);

	PlayerInputComponent->BindAxis(FName("MoveForward"), this, &ABird::MoveForward);
}

void ABird::MoveForward(float Value)
{
	//매개변수로 넣은 float 변수는 키를 누르면 scale * Value값, 누르지 않으면 0을 반환한다
	UE_LOG(LogTemp, Warning, TEXT("%f"), Value);
}

 

 

PlayerInputComponent->BindAxis() : AxisMapping에 원하는 함수를 Bind 시켜준다

 

const FName (AxisBinding 이름), UserClass *Object (this), typename FInputAxisHandlerSignature::TMethodPtr< UserClass > Func (class이름으로 정규화 된 함수의 주소)

 

 

2. Enhanced Input System

 

위의 방식의 Input System은 UE4의 방식으로 현재는 Deprecated되었고 Enhanced Input System을 권장한다

(UE5부터 기본 설정으로 되어 있음)

 

Enhanced Input(향상된 입력)은 UE5에서 런타임 리매핑, 복잡한 입력 처리(동시 입력) 등 향상된 입력 기능을 제공하는 플러그인이다

 

UE5.1 이상 버전에는 자동 설치

 

ProjectSetting - Input에도 Default Player Input Class, Component Class가 Enhanced로 변경되어 있다

 

새로운 EnhancedPlayerInput/Component Class는 기존의 Input/Component Class를 상속받는다

 

Enhanced Input은 크게 4가지 특징을 가진다

 

 

Input Actions

InputAction(입력 액션)은 액션이 할당되는 부분이다

 

입력받는 정보는 bool, float, Vector 2D, Vector 3D 를 받을 수 있게 되며, 어떤 입력값을 받을지에 따라 이를 정할 수 있다

ex) 아이템 줍기와 같은 동작은 bool 값으로 지정하면 되고, 이동같은 동작은 Vector 2D로 설정해주면 된다

 

이와 같은 방식으로 InputAction을 만들 수 있다

 

만들어진 InputAction을 열고 

Value Type에서 입력 데이터의 타입을 지정할 수 있다 (bool, 1D, 2D, 3D)

 

만든 InputAction은 EventGraph에서 그대로 이벤트로 사용이 가능하다 이때 Event이름은 만든 InputAction의 이름을 그대로 사용한다

EnhancedInputAction Event : Triggered, Started, OnGoing, Canceled, Completed등 다양한 상태에 따라 원하는 logic을 실행시킬 수 있는 이벤트 노드이다

 

이때 ActionValue는 InputAction에서 지정한 Value에 따라 다르게 나온다 (bool, 1D, 2D, 3D)

 

Triggered :  Mapping된 키가 입력되고 Trigger 조건을 만족하면 계속 호출

Started : Mapping된 키가 입력되었을 때 한 번

OnGoing : Mapping된 키가 입력되고 Trigger 조건의 일부를 만족했을 때 호출된다 (TimeThreshold와  Actuation Threshold Time 사이의 조건)

Canceled : Mapping된 키가 입력되고 Trigger 조건을 만족하기 전에 키 입력이 취소될 때 호출

Completed : Mapping된 키가 입력되고 Trigger 조건을 만족한 후 입력이 취소될 때 호출

 

 

Input Mapping Context

Input Mapping Context는 사용자의 입력값을 만들어둔 Input Actions와 바인딩한다

 

이때 사용자는 여러개의 Input Mapping Context를 가질 수 있으며, 이들은 각각 우선순위가 있어 같은 키를 입력해도

어떤 액션이 나갈지를 지정할 수 있게 된다

 

ex) 플레이어는 걷기와 인벤토리를 탐색할 때 각각의 Input Mapping Context를 가질 수 있다
이때 같은 WASD를 누르더라도, 인벤토리를 열었다면 인벤토리를 탐색하도록 우선순위를 정할 수 있다

InputAction과 마찬가지로 이와 같은 방식으로 생성이 가능하다

 

Mappings에서 원하는 InputAction과 키를 매핑시킬 수 있다

 

이 각 InputAction에 매핑된 키들을 확장시키면

이 처럼 Triggers/Modifiers를 지정할 수 있다

 

 

Modifier

Modifier는 입력 받은 값을 변환해주는 장치이다

 

 

여기서 Modiefier는 Swizzle Input Axis Values로 지정되어 있고 Order는 YXZ로 되어 있다

이는 W를 눌렀을 때 Y X Z의 순서로 받게 만드는 것이다 (따라서 W를 누르면 Y값이 1이 된다)

 

 

S같은 경우에는 Swizzle Input Axis Values는 동일하지만 Negate가 추가되어 있다 이는 입력값을 반대로 처리해준다 (따라서 W를 누르면 Y값이 -1이 된다)

 

이처럼 Modifier를 적절하게 사용하면 하나의 입력액션으로 다양한 역할을 할 수 있다

 

 

 

Trigger 

Trigger  Modifier를 통해 입력 받은 값으로 Hold, Tap, Release, Pressed등과 같은 입력 패턴을 검증한다

 

Hold Time Threshold는 해당 Trigger가 발동하기 까지의 키 입력 시간

 

Is OneShot은 한번만 Trigger를 발동시킬지 True,False

 

Affected by Time Dilation은 Time Delay에 영향을 받을지 True,False

 

Actuation Threshold는 Trigger를 fire하는 시간 (따라서 Hold Time Threshold는 Actuation Threshold보다 크거나 같아야 한다)

 

 

이렇게 만든 Input System들을 사용하기 위해서는 PlayerController를 가져온 후 Enhanced Input LocalPlayer SubSystem을 가져오고 Mapping Context를 Add해주어야 한다

GetPlayerController : 원하는 Player의 PlayerController를 반환한다

 

PlayerIndex (int32)를 인자로 가지고 APlayerController*를 반환한다

 

GetEnhancedInputLocalPlayerSubSystem : Enhanced Input Local Player SubSystem을 반환한다

 

AddMappingContext : PlayerController의 Enhanced Input LocalPlayer SubSystem에 만들어 놓은 Mapping Context를 Add해준다

 

만든 MappingContext, Priority (int32), Options를 인자로 가진다

 

이때 Priority는 같은 키를 사용하는 Mapping Context가 여러개가 있을 때 우선순위를 줄 수 있다 (숫자가 클수록 우선순위가 높다)

ex) a를 사용하는 Mapping Context1, 2가 있을 때 Priority를 지정하여 해당 키를 어떤 Mapping Context에 적용하여 사용할 지 지정할 수 있다는 의미이다

 

런타임동안 MappingContext 변경이 가능하다

 

 

728x90
반응형