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 |
---|