관리 메뉴

Mini

[UE5] Input바인딩용 클래스 생성, 클릭이벤트 발생 테스트 본문

UE5/Gameplay Abilities

[UE5] Input바인딩용 클래스 생성, 클릭이벤트 발생 테스트

Mini_96 2024. 6. 9. 04:30

*  Input 바인딩용 클래스 생성

기존 : PC에서 바인딩해줬음

void AAuraPlayerController::SetupInputComponent()
{
    Super::SetupInputComponent(); // 부모 클래스의 SetupInputComponent() 함수 호출

    // InputComponent를 UEnhancedInputComponent 형으로 변환하고 검사합니다.
    //Get 인핸스드 인풋 컴포넌트
    UEnhancedInputComponent* EnhancedInputComponent = CastChecked<UEnhancedInputComponent>(InputComponent);

    // MoveAction이 발생할 때 AAuraPlayerController 클래스의 Move() 함수를 바인딩합니다.
    //옵션 : 트리거(누르고있을때), 컴플리트(눌렀다 뗏을때)
    //특정키가(에디터IMC에서 설정한) 눌럿을때, Data 목록 중 Move함수를 실행해라.
    EnhancedInputComponent->BindAction(InputActions->InputMove, ETriggerEvent::Triggered, this, &AAuraPlayerController::Move);
    EnhancedInputComponent->BindAction(InputActions->RightClickThenMoveThere, ETriggerEvent::Triggered, this, &AAuraPlayerController::RightClickMove);
}

- 개선 : 바인딩전용 클래스를 만들고 거기안에서 바인딩함

키눌렀을때, 누르는중, 뗏을때 바인딩하는 함수 구현

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "AuraInputConfig.h"
#include "EnhancedInputComponent.h"
#include "AuraInputComponent.generated.h"

/**
 * 
 */
UCLASS()
class AURA_API UAuraInputComponent : public UEnhancedInputComponent
{
    GENERATED_BODY()

public:
    template<class UserClass, typename PressedFuncType, typename ReleasedFuncType, typename HeldFuncType>
    void BindAbilityActions(const UAuraInputConfig* InputConfig, UserClass* Object, PressedFuncType PressFunc,
       ReleasedFuncType ReleasedFunc, HeldFuncType HeldFunc); //헤더포함 => 템플릿 함수 만들려고
};

//UserCLass에 아무 Class나 들어올수있음! 유사 template<class T>
template <class UserClass, typename PressedFuncType, typename ReleasedFuncType, typename HeldFuncType>
void UAuraInputComponent::BindAbilityActions(const UAuraInputConfig* InputConfig, UserClass* Object,
    PressedFuncType PressFunc, ReleasedFuncType ReleasedFunc, HeldFuncType HeldFunc) //키눌렀을때, 누르눈중, 뗏을때 바인딩해주는 함수
{
    check(InputConfig); //입력받은 매개변수 체크

    for(const FAuraInputAction& Action : InputConfig->AbilityInputActions)
    {
       if(Action.InputAction && Action.InputTag.IsValid())
       {
          if(PressFunc) //눌렀을때 콜백됨
          {
             BindAction(Action.InputAction, ETriggerEvent::Started, Object, PressFunc,Action.InputTag);
          }

          if(ReleasedFunc) 
          {
             BindAction(Action.InputAction, ETriggerEvent::Completed, Object, ReleasedFunc,Action.InputTag);
          }
          
          if(HeldFunc) 
          {
             BindAction(Action.InputAction, ETriggerEvent::Triggered, Object, HeldFunc,Action.InputTag);
          }
       }
    }
}

https://github.com/DongHoonYu96/GameplayAbilitySystem_Aura/commit/81f1c121dcf6a6149fdcd188d2061d2063375b7c

 

feat : 키눌렀을때, 누르는중, 뗏을때 바인딩하는 함수 구현 · DongHoonYu96/GameplayAbilitySystem_Aura@81f1c12

Bisu96 committed Jun 8, 2024

github.com

 

 

* PC에서 콜백함수 구현(클릭이벤트 발생 테스트)

IC(액션-태그 매칭)를 PC의 변수추가

변수추가시 BP에서 의존성 주입 잊지말것!

UPROPERTY(EditDefaultsOnly,Category="Input")
TObjectPtr<UAuraInputConfig> InputConfig;

-3개의 콜백함수 구현

//3개의 콜백 함수
void AbilityInputTagPressed(FGameplayTag InputTag);
void AbilityInputTagReleased(FGameplayTag InputTag);
void AbilityInputTagHeld(FGameplayTag InputTag);

- 한꺼번에 바인딩!

EnhancedInputComponent를 [EnhancedInputComponent를 상속받은 AuraInputComponent로 교체함]

void AAuraPlayerController::SetupInputComponent()
{
    Super::SetupInputComponent(); // 부모 클래스의 SetupInputComponent() 함수 호출

    // InputComponent를 UEnhancedInputComponent 형으로 변환하고 검사합니다. -> 를 상속받은 AuraInput으로 cast
    //Get 인핸스드 인풋 컴포넌트
    UAuraInputComponent* AuraInputComponent = CastChecked<UAuraInputComponent>(InputComponent);

    // MoveAction이 발생할 때 AAuraPlayerController 클래스의 Move() 함수를 바인딩합니다.
    //옵션 : 트리거(누르고있을때), 컴플리트(눌렀다 뗏을때)
    //특정키가(에디터IMC에서 설정한) 눌럿을때, Data 목록 중 Move함수를 실행해라.
    AuraInputComponent->BindAction(InputActions->InputMove, ETriggerEvent::Triggered, this, &AAuraPlayerController::Move);
    AuraInputComponent->BindAbilityActions(InputConfig,this,&ThisClass::AbilityInputTagPressed, &ThisClass::AbilityInputTagReleased,
       &ThisClass::AbilityInputTagHeld);
}

매개변수를 채워주면 된다. 함수포인터를 변수로 채우면 된다.

- 디버깅용 코드 작성

void AAuraPlayerController::AbilityInputTagPressed(FGameplayTag InputTag)
{
    GEngine->AddOnScreenDebugMessage(1,3.f,FColor::Red, *InputTag.ToString());
}

void AAuraPlayerController::AbilityInputTagReleased(FGameplayTag InputTag)
{
    GEngine->AddOnScreenDebugMessage(2,3.f,FColor::Blue, *InputTag.ToString());

}

void AAuraPlayerController::AbilityInputTagHeld(FGameplayTag InputTag)
{
    GEngine->AddOnScreenDebugMessage(3,3.f,FColor::Green, *InputTag.ToString());

}

- 프로젝트세팅에서도 EnhancedInputComponent를 Aura로 바꿔야함.

 

- nullptr 에러 -> InputConfig를 set 안해줬음

IC set
결과 처음누르면파랑, 누르는중빨강, 놓으면 파랑이 뜨는모습!