1. 인풋 컴포넌트 생성
인풋액션과 게임플레이 태그를 연결하였다. 이번에는 이 인풋에 콜백함수를 바인딩하도록 하자. 기본적인 이동은 플레이어 컨트롤러 클래스에서 하고 있는데 이제 이 작업을 플레이어 컨트롤러가 아닌 인풋 컴포넌트 클래스에서 진행하여 캡슐화를 이룰 것이다.
플레이어 컨트롤러는 입력을 받는 역할만 할 것이고 인풋 컴포넌트 클래스에서 이 입력을 처리하는 작업을 하는 것이다.
이제 클래스를 구성하자.
#include "CoreMinimal.h"
#include "AuraInputConfig.h"
#include "EnhancedInputComponent.h"
#include "AuraInputComponent.generated.h"
/**
*
*/
UCLASS()
class PRACTICE2_API UAuraInputComponent : public UEnhancedInputComponent
{
GENERATED_BODY()
public:
template<class UserClass, typename PressedFuncType, typename ReleasedFuncType, typename HeldFuncType>
void BindAbilityActions(const UAuraInputConfig* InputConfig, UserClass* Object, PressedFuncType PressedFunc, ReleasedFuncType ReleasedFunc, HeldFuncType HeldFunc);
};
인풋 데이터 에셋과 콜백함수를 넘기면 이 둘을 바인딩하는 템플릿 함수를 만들었다.
template <class UserClass, typename PressedFuncType, typename ReleasedFuncType, typename HeldFuncType>
void UAuraInputComponent::BindAbilityActions(const UAuraInputConfig* InputConfig, UserClass* Object,
PressedFuncType PressedFunc, ReleasedFuncType ReleasedFunc, HeldFuncType HeldFunc)
{
check(InputConfig);
for (const FAuraInputAction& Action : InputConfig->AbilityInputActions)
{
if (Action.InputAction && Action.InputTag.IsValid())
{
if (PressedFunc)
{
BindAction(Action.InputAction, ETriggerEvent::Started, Object, PressedFunc, Action.InputTag);
}
if (ReleasedFunc)
{
BindAction(Action.InputAction, ETriggerEvent::Completed, Object, ReleasedFunc, Action.InputTag);
}
if (HeldFunc)
{
BindAction(Action.InputAction, ETriggerEvent::Triggered, Object, HeldFunc, Action.InputTag);
}
}
}
}
이제 실제 콜백함수를 만들어보자.
2. 인풋을 위한 콜백함수 생성
이러한 콜백함수는 플레이어 컨트롤러에서 만들 것이다. 플레이어 컨트롤러에서는 인풋을 받고 인풋과 콜백함수를 연결하는 작업을 한다. 물론 실제 연결은 인풋 컴포넌트에서 하는 중이긴 하다.
바인딩할 액션과 함수를 만들어주자.
void AbilityInputTagPressed(FGameplayTag InputTag);
void AbilityInputTagReleased(FGameplayTag InputTag);
void AbilityInputTagHeld(FGameplayTag InputTag);
UPROPERTY(EditDefaultsOnly, Category="Input")
TObjectPtr<UAuraInputConfig> InputConfig;
셋업 인풋 컴포넌트 함수에서 이제 우리가 사용한 커스텀 인풋 컴포넌트를 사용할 것이다.
void AAuraPlayerController::SetupInputComponent()
{
Super::SetupInputComponent();
UAuraInputComponent* AuraInputComponent = CastChecked<UAuraInputComponent>(InputComponent);
AuraInputComponent->BindAction(MoveAction, ETriggerEvent::Triggered, this, &AAuraPlayerController::Move);
}
이제 우리가 만든 바인딩 함수를 호출해주면 된다.
AuraInputComponent->BindAbilityActions(InputConfig, this, &ThisClass::AbilityInputTagPressed, &ThisClass::AbilityInputTagReleased, &ThisClass::AbilityInputTagHeld);
ThisClass:: 의 경우 C++ 문법은 아니고 언리얼 엔진에서 매크로로 생성한 클래스 네임의 별칭이다.
이제 컴파일 하고 나머지 작업을 하자.
3. 인풋 컴포넌트 교체하기
인풋 컴포넌트를 향상된 인풋 컴포넌트에서 커스텀 인풋 컴포넌트를 사용할 것이기 때문에 에티터에서도 이를 설정할 것이다.
프로젝트 세팅의 인풋 부분에서 이를 바꾸자/
플레이어 컨트롤러에서 데이터 에셋을 설정하는 것도 잊지 마랒. 이제 이렇게 해서 커스텀 인풋 컴포넌트에서 바인딩 하는 작업을 완료하였다.
'게임프로그래밍 > 실습2' 카테고리의 다른 글
[실습2] 43. 발사체 생성 능력 만들기 (0) | 2024.12.03 |
---|---|
[실습2] 42. 마우스 클릭으로 움직이게 하기 (0) | 2024.12.03 |
[실습2] 40. 인풋과 게임플레이 태그 연결하기 (0) | 2024.12.03 |
[실습2] 39. 어빌리티 부여하기 (0) | 2024.12.03 |
[실습 2] 38. 어트리뷰트가 바뀌면 응답하기 (0) | 2024.12.02 |