본문 바로가기

언리얼레퍼런스/게임플레이프레임워크

UE5 Enhanced Input

Enhanced Input은 이전의 'Action And Axis' 매핑과 완전히 역호환 됩니다.

Unreal Engine5에서 기존의 Input은 Deprecated 조치되었으며, Enhanced Input을 사용하기를 권장합니다.

 

입력시스템의 동작 방식

플레이어의 입력은 컨트롤러를 통해 폰으로 전달됨

입력을 컨트롤러가 처리할 수도, 폰이 처리할 수도 있는데, 일반적으로는 폰이 처리하도록 설정

다양한 사물에 빙의하는 게임의 경우 폰이 유리

 

 

 

입력 매핑 컨텍스트 : 입력 매핑 컨텍스트를 이용하여, 런타임에 각 설정에 맞는 입력장치를 설정할 수 있습니다.

(예 : 게임패드용 입력 매핑 컨텍스트, 키보드용 입력 매핑 컨텍스트)

 

입력값 변조(Modifier) : 우리가 AD / WS 입력값을 받아낼 때 이 값을 Y축과 X축으로 변경, 값 반전등을 설정하는데

입력값 변조 (액션) 이 이 행위를 설정한다.

 

이벤트 활성화(Trigger) : 들어온 입력이 일반 버튼인지, 축 이동인지, 일정 이상 눌러야 하는지 등을 확인하여 이벤트를 활성화 시키고, 게임 로직의 Input 함수로 호출합니다.

 

과거에는 이러한 행위들을 게임 로직에서 처리했는데 별도의 액션을 통해서 관리할 수 있게 함으로써 게임 로직의 부담을 줄이고, 런타임에 원하는 설정들을 자유롭게 변경할 수 있도록 입력 시스템을 향상 시켰다고 생각하면 된다.

 

 

설치 및 기본 세팅

플러그인 세팅에서 Enhanced Input을 찾아 설치하고 언리얼 엔진을 재시작한다.

UE5.2 에서는 이 Enhanced Input이 기본으로 설치되어있고 기본 입력 시스템으로 설정되어 있으므로 할 필요는 없다.

(5.1에서는 해야한다)

 

프로젝트 설정의 Input에서 Default Classes가 Enhanced* 인지 확인하고 설정한다.

 

복잡한 입력 처리나 런타임 제어 리매핑 등 보다 고급 입력 기능이 필요한 언리얼 엔진 5 (UE5) 프로젝트에 적합한 향상된 입력(Enhanced Input) 은 개발자에게 업그레이드 경로와 언리얼 엔진 4 (UE4) 기본 입력 시스템과의 하위 호환성을 제공합니다.

이 플러그인은 방사상 데드존, 조화된 액션, 컨텍스트에 따른 입력 및 우선순위 지정뿐 아니라 에셋 기반 환경에서 원시(raw) 입력 데이터의 자체 필터링 및 처리 확장 등의 기능을 구현합니다.

다이내믹 및 컨텍스트에 따른 입력 매핑

향상된 입력을 사용하면 런타임 시 플레이어에 대한 매핑 컨텍스트(Mapping Contexts) 를 추가하고 제거할 수 있습니다. 이를 통해 수많은 액션(Action)을 더 쉽게 관리할 수 있습니다. 플레이어의 현재 스테이트에 따라 특정 입력 동작 방식을 변경할 수 있습니다.

예를 들어 걷고 달리고 엎드릴 수 있는 플레이어 캐릭터가 있다고 합시다. 이러한 각 캐릭터 무브먼트(Character Movement) 타입에 대해 매핑 컨텍스트를 교체하여 CTRL 키로 다른 액션을 수행하게 할 수 있습니다. 걷는 중에 CTRL 키를 누르면 웅크리게 하거나, 달리는 중에 CTRL 키를 누르면 슬라이딩하게 하거나, 엎드린 상태에서 CTRL 키를 누르면 다시 일어나게 할 수 있습니다.

향상된 입력 에셋 생성하기

향상된 입력은 기본적으로 활성화됩니다. 콘텐츠 브라우저에서 추가 (+ )를 클릭하고 입력(Input) 카테고리로 이동하여 입력 에셋을 생성할 수 있습니다.

핵심 콘셉트

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

입력 액션

입력 액션 은 향상된 입력 시스템과 프로젝트 코드 간의 통신 링크입니다. 입력 액션은 데이터 에셋이라는 점만 다를 뿐, 액션  축(Axis) 매핑 이름과 개념적으로 같습니다. 각 입력 액션은 '웅크리기'나 '무기 발사' 같은 사용자가 할 수 있는 행동을 나타내야 합니다. 입력 액션의 스테이트가 변경될 때 블루프린트 또는 C++에 입력 리스너(Input Listeners) 를 추가할 수 있습니다.

입력 액션은 여러 타입이 될 수 있으며, 타입에 따라 액션의 동작이 결정됩니다. 단순한 부울 액션을 만들 수도 있고 더욱 복잡한 3D 축을 만들 수도 있습니다. 액션 타입이 그 값을 결정합니다. 부울 액션은 단순한 bool 값을 갖고, Axis1D  float 값을, Axis2D  FVector2D , 그리고 Axis3D 는 전부 FVector 입니다.

입력 액션은 다양한 값 타입이 될 수 있으며, 이러한 타입이 액션의 동작을 결정합니다.

on 또는 off 스테이트를 갖는 입력에는 부울 액션을 사용해야 합니다. 이는 레거시 입력 시스템의 예전 액션 매핑과 같습니다. 게임패드 썸스틱 값 같은 컨트롤에는 2D 축 액션을 사용하여 썸스틱 위치의 X 및 Y값을 보유할 수 있습니다. 3D 축을 사용하면 모션 컨트롤러 정보 같은 더 복잡한 데이터를 보유할 수 있습니다.

 

예를 들어, '아이템 집기' 액션은 사용자가 자신의 캐릭터가 무언가를 집기 원하는지 아닌지를 나타내는 on/off 상태만 필요하겠지만, '걷기' 액션은 자신의 캐릭터가 걷기 원하는 속력과 방향을 설명하는 2D 축이 필요할 수 있습니다.

 

트리거 스테이트

트리거 스테이트(Trigger State)  시작됨(Started), 진행 중(Ongoing), 트리거됨(Triggered), 완료됨(Completed)  취소됨(Canceled) 같이 액션의 현재 스테이트를 나타냅니다. '트리거됨' 스테이트를 자주 사용할 것입니다. C++과 블루프린트 모두에서 특정 스테이트에 바인딩할 수 있습니다.

  • 트리거됨: 액션이 트리거되었습니다. 즉, 모든 트리거 요구 사항 평가를 완료했다는 뜻입니다. 예를 들어, 사용자가 키를 놓으면 '키 누르고 떼기(Press and Release)' 트리거가 전송됩니다.
  • 시작됨: 트리거 평가를 시작한 이벤트가 발생했습니다. 예를 들어, '두 번 탭(Double tap)' 트리거를 처음 누르면 '시작됨' 스테이트가 한 번 호출됩니다.
  • 진행 중: 트리거를 여전히 처리 중입니다. 예를 들어, 지정된 기간이 끝나기 전에 사용자가 버튼을 누르고 있는 동안에는 '길게 누르기(Press and hold)' 액션이 진행 중입니다. 이 이벤트는 트리거에 따라 입력 값을 수신하면 작업이 평가되는 동안 틱마다 발동됩니다.
  • 완료됨: 트리거 평가 프로세스가 완료되었습니다.
  • 취소됨: 트리거링이 취소되었습니다. 예를 들어, 사용자가 '길게 누르기' 액션이 트리거되기 전에 버튼을 놓는 경우가 있습니다.

입력 리스너 추가하기

블루프린트에서 입력 액션 리스너를 추가하려면 블루프린트 이벤트 그래프에서 우클릭하고 입력 액션 데이터 에셋 이름을 입력하면 됩니다.

입력 액션 이벤트를 추가하고 Print String을 실행하도록 설정합니다.

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) 옵션을 펼치고 입력 매핑 컨텍스트(Input Mapping Context) 를 선택합니다.

입력 매핑 컨텍스트의 기본 구조는 최상위 레벨에 입력 액션 목록이 있는 계층구조입니다. 입력 액션 레벨 아래에는 키, 버튼, 이동 축과 같이 각 입력 액션을 트리거할 수 있는 사용자 입력 목록이 있습니다.

최하위 레벨에는 각 사용자 입력에 대한 입력 트리거와 입력 모디파이어 목록이 포함되어 있습니다. 이를 사용하여 입력 원시 값의 필터링 방식이나 처리 방식, 그리고 최상위 계층구조에서 입력 액션을 구동하기 위해 충족해야 하는 제한 사항을 결정할 수 있습니다.

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

여기에서 입력 액션 바인딩에 대한 실제 키를 구현하고 각 액션에 대한 추가 트리거 또는 모디파이어를 지정합니다. 향상된 입력 서브시스템에 입력 매핑 컨텍스트를 추가할 때 우선순위를 지정할 수도 있습니다. 같은 입력 액션에 여러 컨텍스트를 매핑한 경우, 입력 액션이 트리거되면 가장 우선순위가 높은 컨텍스트가 고려되고 다른 컨텍스트는 무시됩니다.

예를 들어, 수영하고 걷고 운전하는 캐릭터에 여러 입력 매핑 컨텍스트를 줄 수 있습니다. 하나는 사용할 수 있으며 항상 동일한 사용자 입력에 매핑되는 일반 액션이며, 다른 하나는 각각의 개별 이동 모드에 대한 것입니다.

개발자는 비히클 관련 입력 액션을 별도의 입력 매핑 컨텍스트에 배치할 수 있으며, 이 입력 매핑 컨텍스트는 차량에 탑승할 때 로컬 플레이어에 추가되고 비히클에서 내릴 때 로컬 플레이어에게서 제거됩니다.

이렇게 하면 최적화에 도움이 되며 부적절한 입력 액션이 실행되지 않도록 하여 버그를 방지할 수 있습니다. 또한, 상호 배타적인 입력 매핑 컨텍스트를 사용하는 것도 입력 충돌 방지에 도움이 되는데, 사용자 입력이 다른 입력 액션에 사용될 때 그 입력이 실수로 잘못된 액션을 트리거하지 않기 때문입니다.

블루프린트나 C++에서 플레이어에 매핑 컨텍스트를 추가할 수 있습니다

// 매핑 컨텍스트를 헤더 파일에 프로퍼티로 노출합니다...
    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);
            }
        }
    }

입력 모디파이어

입력 모디파이어 는 입력 트리거로 보내기 전에 UE 에서 받는 원시 입력 값을 변경하는 프리 프로세서입니다. 향상된 입력 플러그인에는 축의 순서를 변경하고, '데드존'을 구현하고, 축 입력을 월드 스페이스로 변환하는 등 다양한 작업을 수행하기 위한 다양한 입력 모디파이어가 있습니다.

입력 모디파이어는 민감도 세팅을 적용하거나 여러 프레임에 걸쳐 입력을 스무딩하거나 플레이어 스테이트에 따라 입력 동작 방식을 변경하는 데 유용합니다. 자체 모디파이어를 만들 때 UPlayerInput 클래스에 액세스하므로 보유한 플레이어 컨트롤러(Player Controller)에 액세스하고 원하는 게임 스테이트를 가져올 수 있습니다.

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

또한, Input Modifier 를 부모로 두고 Blueprint Child Class 를 생성하여 자신만의 입력 모디파이어를 생성할 수도 있습니다.

다음으로 내 블루프린트(My Blueprint) > 함수(Functions) > 오버라이드(Override)  드롭다운 메뉴 에서 Modify Raw 함수를 선택합니다.

출력 파라미터는 벡터(Vector) 와 매우 비슷한, 3개의 float 값을 포함하는 입력 액션 값(Input Action Value) 입니다. 함수의 입력 파라미터에는 플레이어 입력(Player Input) 오브젝트, 입력 하드웨어 또는 이전 입력 모디파이어의 현재 값(Current Value) , 그리고 델타 시간(Delta Time) 값이 포함되어 있습니다.

Modify Raw 에서 반환된 입력 액션 값은 다음 입력 모디파이어(있는 경우)나 첫 번째 입력 트리거로 이동합니다.

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

    /** 라이라 공유 게임 세팅의 설정에 따라 축 값 반전을 적용합니다 ** /
    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;
    }
    }
    };

방향 입력

입력 모디파이어의 좋은 사용 사례는 단일 입력 액션을 사용하는 2차원 방향 입력입니다. 마우스나 게임패드의 아날로그 스틱으로 2차원 이동을 읽는 것은 최소한 두 개의 축을 지원하는 입력 액션을 만들고 입력 매핑 컨텍스트에 적절한 입력을 추가하는 간단한 문제입니다.

향상된 입력은 키보드의 방향키나 많이 사용하는 'WASD' 키 환경설정 같은 1차원 소스의 입력을 지원합니다. 올바른 입력 모디파이어를 적용하여 이러한 컨트롤 체계를 완성할 수 있습니다. 구체적으로는 부정(Negate) 을 사용하여 일부 키를 음수로 등록하고 입력 축 값 스위즐(Swizzle Input Axis Values) 을 사용하여 일부 키를 기본 X축 대신 Y축으로 등록합니다.

문자 키방향키원하는 입력 해석필요한 입력 모디파이어

W 위쪽 양의 X축 Swizzle Input Axis Values(YXZ 또는 ZXY)
A 왼쪽 음의 X축 Negate
S 아래쪽 음의 Y축 Negate Swizzle Input Axis Values(YXZ 또는 ZXY)
D 오른쪽 양의 X축 (없음)

이러한 방향키 또는 'WASD' 키의 해석을 통해 1차원 입력이 2차원 입력 액션에 매핑될 수 있습니다.

각 키가 양의 1차원 값을 보고하기 때문에, 이 값은 항상 X축을 차지하고 모든 주어진 틱에서 0.0이나 1.0 값을 갖게 됩니다. 왼쪽과 아래쪽 입력 값을 무효화하고 입력의 X축 값이 위쪽과 아래쪽 입력의 Y축으로 이동하도록 축 순서를 전환하면 입력 모디파이어를 사용하여 1차원 입력 세트를 하나의 2차원 입력 값으로 해석할 수 있습니다.

입력 트리거

입력 트리거(Input Trigger)는 선택적 입력 모디파이어 목록을 패스스루(pass-through)한 후 사용자 입력이 입력 매핑 컨텍스트 내에서 해당 입력 액션을 활성화해야 할지 여부를 결정합니다. 대부분의 입력 트리거는 입력 자체를 분석하여 최소 발동 값을 확인하고, 짧은 탭 동작이나 길게 누르기 또는 전형적인 '누르기'나 '놓기' 이벤트 같은 패턴을 검증합니다. 이 규칙의 한 가지 예외는 다른 입력 액션을 통해서만 트리거되는 '조화된 액션' 입력 트리거입니다. 기본적으로 입력에 대한 모든 사용자 활동은 틱마다 트리거됩니다.

입력 트리거는 다음과 같은 세 가지 유형이 있습니다.

  • 명시(Explicit) 유형은 입력 트리거가 성공하면 입력이 성공합니다.
  • 암시(Implicit) 유형은 입력 트리거와 모든 암시 유형 입력 트리거가 성공할 때만 입력이 성공합니다.
  • 블로커(Blocker) 유형은 입력 트리거가 성공하면 입력이 실패합니다.

아래는 각 트리거 유형이 다른 트리거 유형과 상호작용하는 방식의 논리적 예시입니다.

 

   Implicits == 0, Explicits == 0 - 값이 0이 아닌 한 항상 발동됩니다.

    Implicits == 0, Explicits > 0 - 하나 이상의 명시가 발동되었습니다.

    Implicits > 0, Explicits == 0 - 모든 암시가 발동되었습니다.

    Implicits> 0, Explicits > 0 - 모든 암시와 하나 이상의 명시가 발동되었습니다.

    Blockers - 트리거를 강제로 실패시키기 위해 모든 다른 트리거를 오버라이드합니다.

사용자 입력 처리 후, 입력 트리거는 다음의 세 가지 상태 중 하나를 반환할 수 있습니다.

  • 없음(None) 은 입력 트리거의 조건이 충족되지 않아 입력 트리거가 실패했음을 나타냅니다.
  • 진행 중(Ongoing) 은 입력 트리거의 조건이 부분적으로 충족되었으며, 입력 트리거가 처리 중이지만, 아직 성공하지 않았음을 나타냅니다.
  • 트리거됨(Triggered) 은 모든 입력 트리거 조건이 충족되었으며 입력 트리거가 성공했음을 나타냅니다.

베이스 입력 트리거 클래스나 **입력 트리거 시간 베이스**를 확장하여 자신만의 입력 트리거를 생성할 수 있습니다.

입력 트리거 시간 베이스 는 입력을 받아들이고 진행 중 상태로 돌아가기 전에 특정 시간 동안 입력이 눌렸는지 확인합니다.

제공된 입력 트리거 시간 베이스 클래스는 트리거됨 상태를 반환하지 않습니다. 새로운 입력 트리거 자손 클래스 내의 함수를 오버라이드하여 사용자 입력에 반응하는 방식을 결정합니다. Get Trigger Type 함수는 입력 트리거 유형을 결정합니다. 상태 업데이트 는 플레이어의 입력 오브젝트와 현재 입력 액션 값 델타 시간을 받아 없음 , 진행 중 또는 트리거됨 상태를 반환합니다.

C++ 예시로 InputTriggers.h 에서 UInputTriggerHold 구현을 관찰할 수 있습니다.

UInputTriggerHold.H

    /** UInputTriggerHold
        입력이 HoldTimeThreshold 초 동안 계속 작동되면 트리거가 발동됩니다.
        선택적으로 트리거가 한 번 발동될 수도 있고, 반복해서 발동될 수도 있습니다.
    */
    UCLASS(NotBlueprintable, MinimalAPI, meta = (DisplayName = "Hold"))
    class UInputTriggerHold final : public UInputTriggerTimedBase
    {
        GENERATED_BODY()

        bool bTriggered = false;

    protected:

        virtual ETriggerState UpdateState_Implementation(const UEnhancedPlayerInput* PlayerInput, FInputActionValue ModifiedValue, float DeltaTime) override;

    public:
        virtual ETriggerEventsSupported GetSupportedTriggerEvents() const override { return ETriggerEventsSupported::Ongoing; }

        // 트리거를 발동하려면 입력을 누른 채로 있어야 하는 시간입니다.
        UPROPERTY(EditAnywhere, Config, BlueprintReadWrite, Category = "Trigger Settings", meta = (ClampMin = "0"))
        float HoldTimeThreshold = 1.0f;

        // 길게 누르기 시간 한계치를 충족하는 경우 이 트리거를 한 번만 발동할지 아니면 프레임마다 발동할지 여부입니다.
        UPROPERTY(EditAnywhere, Config, BlueprintReadWrite, Category = "Trigger Settings")
        bool bIsOneShot = false;

        virtual FString GetDebugState() const override { return HeldDuration ? FString::Printf(TEXT("Hold:%.2f/%.2f"), HeldDuration, HoldTimeThreshold) : FString(); }
    };

UInputTriggerHold.cpp

ETriggerState UInputTriggerHold::UpdateState_Implementation(const UEnhancedPlayerInput* PlayerInput, FInputActionValue ModifiedValue, float DeltaTime)
    {
        // HeldDuration을 업데이트하고 기본 상태를 파생합니다
        ETriggerState State = Super::UpdateState_Implementation(PlayerInput, ModifiedValue, DeltaTime);

        // HeldDuration이 한계치에 다다르면 트리거됩니다
        bool bIsFirstTrigger = !bTriggered;
        bTriggered = HeldDuration >= HoldTimeThreshold;
        if (bTriggered)
        {
            return (bIsFirstTrigger || !bIsOneShot) ? ETriggerState::Triggered : ETriggerState::None;
        }

        return State;
    }

플레이어 매핑 가능 입력 환경설정(PMI)

매핑 가능 환경설정은 하나의 매핑 '환경설정' 또는 '프리셋'을 나타내는 입력 매핑 컨텍스트의 컬렉션입니다. 예를 들어, 조준 시 서로 다른 입력 매핑 컨텍스트를 가진 '기본(Default)' 및 '왼손잡이(Southpaw)' 매핑 가능 환경설정을 보유할 수 있습니다.

이러한 환경설정을 사용하면 입력 매핑 컨텍스트 배열을 수동으로 추가하는 대신, 컨텍스트 세트와 그 우선순위를 미리 정의하여 한 번에 이러한 환경설정을 추가할 수 있습니다. 매핑에서는 프로그래밍 UI 세팅 화면을 간편하게 만들 수 있는 다양한 메타데이터 옵션을 선택할 수 있습니다.

디버그 명령

작업 중인 입력 관련 비헤이비어 디버깅에 사용할 수 있는 몇 가지 입력 관련 디버그 명령이 있습니다.

showdebug enhancedinput 을 사용하면 프로젝트에서 사용하는 축 매핑과 사용할 수 있는 입력 액션을 표시합니다.

showdebug devices 명령 사용

입력 주입

향상된 입력은 플레이어에게 '입력 주입(Injecting Input)' 콘셉트도 함께 제공합니다. 이를 통해 블루프린트, C++ 또는 콘솔 커맨드에서 함수를 호출하여 플레이어의 입력을 시뮬레이션할 수 있습니다. Input.+key 콘솔 명령을 사용하여 입력 시뮬레이션을 시작할 수 있습니다.

아래는 Gamepad_Left2D 키 세팅 예시입니다.

 

    Input.+key Gamepad_Left2D X=0.7 Y=0.5

    Input.-key Gamepad_Left2D

키 이름은 실제 FKey 이름이면 무엇이든 괜찮습니다. 해당 이름은 InputCoreTypes.cpp 파일 또는 표시된 키 이름에서 공백을 제거한 경우 키 선택 툴 위젯에서 찾을 수 있습니다.

블루프린트에서 입력 주입

    UEnhancedInputLocalPlayerSubsystem* Subsystem = ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(PC->GetLocalPlayer());

    UEnhancedPlayerInput* PlayerInput = Subsystem->GetPlayerInput();

    FInputActionValue ActionValue(1.0f); // This can be a bool, float, FVector2D, or FVector
    PlayerInput->InjectInputForAction(InputAction, ActionValue); 

플랫폼 세팅

Nintendo Switch의 페이스 버튼을 회전하거나 모바일 디바이스에서 사용할 수 있는 액션을 변경하는 등, 플랫폼에 따라 입력 세팅을 다르게 해야 할 수 있습니다. 향상된 입력에서는 이러한 작업을 쉽게 할 수 있는 플랫폼별 매핑 컨텍스트 리디렉트(Mapping Context Redirect) 를 제공합니다.

향상된 입력 플랫폼 데이터(Enhanced Input Platform Data) 클래스를 기반으로 블루프린트를 만들 수 있습니다. 이는 게임에 플랫폼별 옵션을 추가하기 위해 빌드할 수 있는 베이스 클래스입니다. 기본적으로 여기에는 입력 매핑 컨텍스트의 맵이 포함되어 있어 하나의 컨테이너에서 다른 컨테이너로 리디렉션할 수 있습니다.

특정 플랫폼에서 매핑 컨텍스트를 참조할 때마다 매핑이 리빌드될 때 맵의 값으로 대체됩니다.

이 리디렉트를 적용하려면 프로젝트 세팅(Project Setting) > 향상된 입력(Enhanced Input) > 플랫폼 세팅(Platform Settings) > 입력 데이터(Input Data) 에 추가합니다.

이러한 프로젝트 세팅은 해당 플랫폼의 DefaultInput.ini 에 추가되므로 핫픽스가 가능하고 쉽게 변경할 수 있습니다. 플랫폼 세팅에서는 UEnhancedInputPlatformData 의 베이스 클래스를 제공하므로 고유한 블루프린트 또는 C++ 서브클래스를 생성하여 커스텀 플랫폼 세팅을 만들고 어디에서든 해당 세팅에 액세스할 수 있게 할 수 있습니다.