less than 1 minute read

개인 프로젝트의 enhanced input 관련 내용입니다.

Enhanced Input 선택 이유

  • 언리얼 엔진 5.1 버전부터 권장하는 Input 방식
  • 플랫폼 별로 Input Mapping Context 를 달리해 설정 가능
  • 플레이어의 현재 상태에 따라 키 매핑을 다르게 하기 쉬움.
  • 이전 입력 시스템과 호환되며, 다양한 입력을 구현해야 하는 대규모 게임에 적합하다고 알려져 있음.

FireRate 구현 과정

  • InputAction의 InputTrigger를 UInputTriggerPulse 로 설정했습니다.
    • UInputTriggerPulse는 Interval 초 단위로 트리거를 발동합니다.
  • UInputTriggerPulse 클래스는 UInputTrigger 클래스를 상속하고 있으며,
  • UInputAction 클래스는 UInputTrigger들을 TArray<TObjectPtr<UInputTrigger>> 로 보관하고 있습니다.
  • UInputTriggerPulse의 Interval에 접근해 무기의 FireRate를 설정하였습니다.
  • 인게임에서 무기 교체 등에 따라 FireRate가 달라지면 Interval도 그에 맞게 수정해 주어야 합니다.
  • 코드에서 Interval에 접근하기 위해 UInputTrigger 포인터를 UInputTriggerPulse 포인터로 캐스트해 접근했습니다.
static ConstructorHelpers::FObjectFinder<UInputAction> IA_SHOOT(TEXT("/Game/LS/Input/Actions/IA_SHOOT.IA_SHOOT"));
if ( IA_SHOOT.Succeeded())
{
	ShootAction = IA_SHOOT.Object;
    // check nullptr
	LSCHECK(ShootAction->Triggers.Num() > 0);
	TObjectPtr<UInputTriggerPulse> InteractInputTrigger = Cast<UInputTriggerPulse>(ShootAction->Triggers[0]);
    // check nullptr
	LSCHECK(nullptr != InteractInputTrigger);
	InteractInputTrigger->Interval = FireRate;
}

얻은점

  • 온라인 상 자료가 많지 않아 사용하기 위해 소스코드를 분석할 기회가 되었습니다.
  • 그 과정속에서 엔진이 Enhanced Input을 어떻게 구현했는 지 구조를 알 수 있었고,
  • 포인터 캐스트를 통해 자식 클래스의 멤버에 접근하는 방법을 익힐 수 있었습니다.

Leave a comment