언리얼 향상된 입력 시스템

Stupidiot·2025년 6월 5일

Unreal & C++

목록 보기
3/5
post-thumbnail

개요


언리얼에는 기존의 액션 및 축을 매핑하는 방식의 입력을 확장한 향상된 입력 시스템이라는 플러그인이 존재합니다.

👓 기존 방식(UE4)

  • 키보드/마우스 입력을 직접 바인딩
  • 복잡한 입력 조합 처리가 어려움
  • 런타임에 키 변경이 제한적

사용 방법


향상된 입력은 디폴트로 활성화되어 있으며, 콘텐츠 브라우저에서 위와 같은 방식으로 추가 가능합니다.

4가지 핵심 구성요소


향상된 입력 시스템은 입력 액션(Input Actions) , 입력 매핑 컨텍스트(Input Mapping Contexts) , 입력 모디파이어(Input Modifiers) , 그리고 입력 트리거(Input Triggers) 이렇게 4가지 주요 콘셉트로 이루어져 있습니다.

입력 액션(Input Actions)


입력 액션은 데이터 에셋이라는 점만 다를 뿐, 액션 및 축(Axis) 매핑 이름과 개념적으로 같습니다.

각 입력 액션은 공격, 점프, 웅크리기 같은 사용자가 할 수 있는 행동을 나타냅니다.
입력 액션의 상태가 변경될 때 블루프린트 또는 C++에 입력 리스너(Input Listeners) 를 추가할 수 있습니다.

📖 입력 리스너(Input Listeners)
입력 리스너(Input Listeners) 는 입력 액션의 상태 변화를 "감지하고 반응하는 함수"

// 입력 리스너 등록
InputComponent->BindAction(JumpAction, ETriggerEvent::Started, this, &AMyCharacter::StartJump);
InputComponent->BindAction(JumpAction, ETriggerEvent::Completed, this, &AMyCharacter::StopJump);

// 실제 반응 함수들
void AMyCharacter::StartJump() {    // 점프 시작 로직 }

void AMyCharacter::StopJump() {    // 점프 종료 로직  }

또한 입력 액션은 여러 타입을 가질 수 있으며, 타입에 따라 액션의 동작이 결정됩니다.
기본적으로 bool 타입을 가지며 복잡한 3D축도 만들 수 있습니다.

타입별 실제 사용 예시


Digital (bool) - 켜짐/꺼짐

  • 점프, 공격, 아이템 줍기
  • "했다/안했다"만 중요한 행동

Axis1D (float) - 1차원 값

  • 앞/뒤 이동, 가속/감속
  • -1.0 ~ 1.0 사이의 값

Axis2D (Vector2D) - 2차원 값

  • 이동 방향 (앞뒤 + 좌우)
  • 마우스/카메라 회전

Axis3D (Vector) - 3차원 값

  • VR 컨트롤러 위치
  • 복잡한 3D 입력

👾
IA_Jump: 점프 → Digital (bool)
IA_Move: 이동 → Axis2D (Vector2D)
IA_Look_Mouse: 마우스 시점 → Axis2D (Vector2D)
.IA_Crouch: 웅크리기 → Digital (bool)

트리거 스테이트


트리거 스테이트(Trigger State) 는 액션의 현재 상태를 나타냅니다.
->( 보통 Triggered 상태를 자주 사용합니다.)
C++과 블루프린트 모두 특정 스테이트에 바인딩 가능합니다.

아래는 트리거 스테이트의 종류입니다.

  • Triggered : 액션이 트리거되었습니다. 즉, 모든 트리거 요구 사항 평가를 완료했다는 뜻입니다.
  • Started : 스페이스바 누르기 시작
  • Ongoing : 스페이스바 계속 누르고 있음
  • Completed : 스페이스바에서 손을 뗌
  • Canceled : 예를들어 길게 누르기라는 액션이 트리거되기 전에 버튼을 놓는 경우입니다.

입력 리스너 추가하기


블루 프린트에서 입력 리스너를 추가할 수도 있지만 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>();
 
	// 여기서 멋진 작업을 수행하세요!
} 

입력 매핑 컨텍스트(Input Mapping Contexts)


입력 매핑 컨텍스트 는 플레이어가 처할 수 있는 특정 컨텍스트를 나타내는 입력 액션 컬렉션으로, 주어진 입력 액션의 트리거 규칙을 설명합니다.

각 사용자에게 매핑 컨텍스트를 동적으로 추가하거나 제거하거나 우선순위를 지정할 수 있습니다.


입력 매핑 컨텍스트에서 각 입력 액션들을 키, 버튼, 이동 축같은 사용자 입력 목록으로 트리거할 수 있도록 매핑 가능합니다.

기본적으로 입력 매핑 컨텍스트는 최상위 레벨에 입력 액션 목록이 있는 계층구조이며,
입력 액션 - 사용자 입력 목록 - 입력 트리거, 입력 모디파이어 순으로 이루어져 있습니다.

향상된 입력 로컬 플레이어 서브시스템(Enhanced Input Local Player Subsystem) 을 통해 이런 입력 매핑 컨텍스트를 하나 이상의 로컬 플레이어에게 적용 가능합니다. 또한 컨텍스트의 우선순위를 지정하여 같은 입력을 사용하려는 여러 액션 간의 충돌을 해결 가능합니다.

💡 최적화

  • IMC_OnFoot (도보 컨텍스트)
IA_Move → WASD키
IA_Jump → Space키
IA_Interact → E키
  • IMC_Swimming (수영 컨텍스트)
IA_Move → WASD키 (물속에서 이동)
IA_Dive → Shift키 (잠수)
IA_Surface → Space키 (수면으로)

이런 상황에서 물 안에 들어갔을 때 아래와 같이 컨텍스트를 지정하면 메모리와 CPU를 절약할 수 있습니다..

RemoveMappingContext(OnFootContext); // 도보 제거 
AddMappingContext(SwimmingContext, 1); // 수영 추가

입력 모디파이어(Input Modifiers)


입력 모디파이어 는 입력 트리거로 보내기 전에 언리얼 에디터에서 받는 원시 입력 값을 변경하는 프리 프로세서입니다.

위의 모디파이어를 선택해서 지정 가능합니다.

1. Dead Zone (데드존)

  • 아날로그 스틱의 작은 움직임을 무시
  • 특정 범위에 입력값이 속하면 0으로 처리

2. Negate (반전)

  • 입력값을 음수로 변환
  • WASD에서 A키(왼쪽), S키(아래쪽)를 음수로 만들 때 사용

3. Swizzle Input Axis Values (축 순서 변경)

  • 입력 축의 순서를 바꿈 (X→Y, Y→Z 등)
  • W,S키가 Y축으로 인식되도록 할 때 사용

4. Scalar (스케일링)

  • 입력값에 특정 배수를 곱해서 크기 조정
  • 민감도 설정에 주로 사용

5. Smooth (스무딩)

  • 여러 프레임에 걸쳐 입력값을 부드럽게 만듦
  • 급작스러운 입력 변화를 완화

6. Response Curve - Exponential (지수 곡선)

  • 입력값에 지수 곡선을 적용
  • 조작감을 세밀하게 조정

7. Response Curve - User Defined (사용자 정의 곡선)

  • 사용자가 직접 만든 곡선으로 입력값 변환
  • 복잡한 조작감 구현 가능

8. FOV Scaling (시야각 스케일링)

  • 카메라 FOV에 따라 입력값 조정
  • 줌 레벨에 맞는 마우스 감도

9. To World Space (월드 공간 변환)

  • 입력 좌표를 월드 좌표계로 변환
  • 카메라 방향 기준 이동 구현

기타 모디파이어들

  • Modifier Collection: 여러 모디파이어를 묶어서 관리
  • Aim Assist: 조준 보조 기능
  • Input Filter: 입력 필터링
  • Custom Modifiers: 사용자 정의 모디파이어들

커스텀 입력 모디파이어

C++나 블루프린트에서 UInputModifier 클래스의 서브클래스를 만들고 ModifyRaw_Implementation 함수를 오버라이드하여 커스텀 입력 모디파이어를 만들 수 있습니다.

아래는 라이라 게임 샘플에서 사용한 입력 모디파이어 예시입니다.

/** 라이라 공유 게임 세팅의 설정에 따라 축 값 반전을 적용합니다 **/

UCLASS(NotBlueprintable, MinimalAPI, meta = (DisplayName = "Lyra Aim Inversion Setting"))
class ULyraInputModifierAimInversion : public UInputModifier
{
	GENERATED_BODY()
	 
protected:
	virtual FInputActionValue ModifyRaw_Implementation(const UEnhancedPlayerInput* PlayerInput, FInputActionValue CurrentValue, float DeltaTime) override
	{
		ULyraLocalPlayer* LocalPlayer = LyraInputModifiersHelpers::GetLocalPlayer(PlayerInput);
		if (!LocalPlayer) return CurrentValue;
		 
		ULyraSettingsShared* Settings = LocalPlayer->GetSharedSettings();
		ensure(Settings);
	 
		FVector NewValue = CurrentValue.Get<FVector>();
		 
		if (Settings->GetInvertVerticalAxis())
			NewValue.Y *= -1.0f;
		 
		if (Settings->GetInvertHorizontalAxis())
			NewValue.X *= -1.0f;

		return NewValue;
	}
}; 

간단한 이동 입력 구현


입력 트리거(Input Triggers)


입력 트리거는 위에서 모디파이어 목록을 모두 거치고, 사용자 입력이 IMC에서 해당 입력 액션을 활성화할지 여부를 결정합니다.
-> 즉, 언제 액션이 실행될지 결정하는 규칙

💡 흐름
원시 입력 → 모디파이어들트리거액션 실행

주요 입력 트리거 타입들

// 기본 제공되는 트리거들
- Press (누르기)
- Release (놓기) 
- Hold (길게 누르기)
- Tap (짧게 누르기)
- Pulse (펄스)
- Down (눌려있는 동안)
- Combo (조합)

실제 사용 예시

점프 액션 - Press 트리거

IA_Jump + Space키 + Press 트리거
→ 스페이스바를 누르는 순간에만 점프

대시 액션 - Tap 트리거

IA_Dash + Shift키 + Tap 트리거 (0.2초 이내)
→ Shift를 빠르게 눌렀다 떼면 대시

차징 공격 - Hold 트리거

IA_ChargeAttack + 마우스좌클릭 + Hold 트리거 (2초)
→ 마우스를 2초 이상 누르고 있으면 차징 공격
profile
행복하세요

0개의 댓글