본문 바로가기
Unreal/입력

[Unreal] 향상된 입력

by 카피마스터 2024. 7. 8.

C++ 에서 향상된 입력 사용

모듈 EnhancedInput
헤더 #include "EnhancedInputSubsystems.h"

 

그 외 필요 헤더

UInputMappingContext #include "InputMappingContext.h"
FInputActionInstance #include "InputAction.h"
UEnhancedInputComponent #include "EnhancedInputComponent.h"

 

 

입력 처리 과정

1. InputAction을 만든다(이동, 공격 등)

2. InputMappingContext를 만들고 1에서 만든 액션을 등록.

- 해당 액션이 발동할 실제 키를 연결

- 트리거(길게 누르기, 그냥 눌렀을때 등)를 설정

- 모디파이어를 통해 값을 변경

3. 액션 핸들러를 블루프린트나 C++로 등록

 

주요 4가지 개념

1. InputAction

2. InputMappingContext

3. InputModifier

4. InputTrigger

 

1. InputAction

데이터 에셋이라는 점만 다르고 기존 '액션/축 매핑' 과 동일하게

실제키가 입력되면 연결된 액션이 발동하고 값을 넘겨준다

 

추가 

콘텐츠 브라우저 -> 추가(or 창에서 우클릭) -> 입력 -> 입력 액션

 

설정 창

 

값 타입

액션이 발동시 해당 타입의 값이 넘어온다

이 값들은 모디파이어에 의해서 수정될 수 있다

타입 기본 값
Digital true
Axis1D 1
Axis2D 1, 0
Axis3D 1, 0, 0

 

 

핸들러 추가

 

블루프린트

이벤트 그래프에서 우클릭 후 액션 이름을 검색하여 추가

 

C++

void AFooBar::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
	UEnhancedInputComponent* Input = Cast<UEnhancedInputComponent>(PlayerInputComponent);

	// 여기에서 'ETriggerEvent' 열거형 값을 변경하여 원하는 트리거 이벤트를 바인딩할 수 있습니다.
	Input->BindAction(AimingInputAction, ETriggerEvent::Triggered, this, &AFooBar::SomeCallbackFunc);
}

		
void AFooBar::SomeCallbackFunc(const FInputActionInstance& Instance)
{
	// 여기에서 원하는 타입의 입력 액션 값을 가져옵니다...
	FVector VectorValue = Instance.GetValue().Get<FVector>();
	FVector2D 2DAxisValue = Instance.GetValue().Get<FVector2D>();
	float FloatValue = Instance.GetValue().Get<float>(); 
	bool BoolValue = Instance.GetValue().Get<bool>();

	// 여기서 멋진 작업을 수행하세요!
}

 

 

트리거 스테이트

상태 설명
Triggerd 액션이 트리거 됨
Started 트리거 평가를 시작
Ongoing 트리거를 처리중. 작업이 평가되는 동안 틱마다 발동
Canceled 트리거링이 취소
예를 들어 사용자가 '길게 누르기' 액션이 트리거 되기 전에 버튼을 놓는경우 호출
Completed 트리거 평가 프로세스가 완료

 

 

2. InputMappingContext

특정 상황에서 사용되는 액션들의 모음

여기서 키와 액션을 매핑하고 트리거 규칙(InputTrigger), 액션 값의 수정(InputModifire) 설정

 

추가 

콘텐츠 브라우저 -> 추가(or 창에서 우클릭) -> 입력 -> 입력 매핑 컨텍스트

 

설정창

 

위는 Enter를 클릭시 IA_ValueAxis1 액션이 호출

 

사용할 InputMappingContext를 설정

Blueprint

 

C++

// header
// 매핑 컨텍스트를 헤더 파일에 프로퍼티로 노출합니다...
UPROPERTY(EditAnywhere, Category="Input")
TSoftObjectPtr<UInputMappingContext> InputMapping;
	 
	 
// cpp
if (ULocalPlayer* LocalPlayer = Cast<ULocalPlayer>(Player))
{
	if (UEnhancedInputLocalPlayerSubsystem* InputSystem = LocalPlayer->GetSubsystem<UEnhancedInputLocalPlayerSubsystem>())
	{
		if (!InputMapping.IsNull())
		{
			InputSystem->AddMappingContext(InputMapping.LoadSynchronous(), Priority);
		}
	}
}

 

3. InputModifier

액션이 발동할때 발생하는 값을 수정

타입 설명
FOV 스케일링 축별 입력 값에 FOV 종속 스케일링을 적
데드 존 범위내 입력값을 0 ~ 1로 다시 매핑
델타 시간으로 스케일링 입력값과 이프레임의 델타시간을 곱
반응 커브 - 사용자 정의 축별 입력 값에 커스텀 반응커브를 적용
반응 커브 - 이스포넨셜 축별 입력 값에  익스포넨셜 반응 커브를 적용
부정 축별 입력 값을 반
스무드 여러 프레임에 걸친 스무드 입력
스위즐 입력 축 값 입력 축을 설정에 맞게 바꿈
스칼라 입력을 스케일
월드 스페이 입력스페이스를 월드스페이스로 변환

 

 

 

4. InputTrigger

설정된 조건에 따라 사용자 입력의 활성화 여부를 결정

타입 설명
길게 누르기 설정된 시간만큼 누르고 있으면 발동
길게 누르기 및 해제 설정된 시간만큼 루르고 있다가 해제될때 발동
눌림 설정된 작동 한계치가 넘어갔을때 한번 발동(여러번 발동되지 않음)
다운 설정된 작동 한계치를 초과하면 트리거가 발동(여러번 발동됨)
코딩된 액션 트리거 되어야 하는 코드 액션을 적용
콤보(베타) 이 트리거가 켜져 있는 액션을 트리거하려면 지정된 콤보 완료 이벤트에 기반하여 콤보 배열의 모든 액션을 완료해야 한다
트리거되려면 입력이 작동된 후 해제 되기까지 걸리는 시간이 TapReleaseTimeThreshold 초 이내여야 한
펄스 입력이 작동되는 동안 초 단위 간격으로 발동되는 트리거
해제 입력이 작동 한계치를 초과하고 있는 동안 트리거가 Ongoing을 반

 

 

'Unreal > 입력' 카테고리의 다른 글

[Unreal] 입력 처리  (0) 2023.08.12