Enhanced Input을 사용할 때 입력을 등록하는 부분에서 문제가 발생했다. 입력을 등록하는 템플릿 함수를 만들어서 사용하려 했다. 템플릿 함수는 정상적으로 선언하여 컴파일이 됬지만 Enhanced Input에 등록하는 코드가 들어가니 문제가 발생했다.

 

 

입력 BindAction 템플릿 함수에서 발생한 문제


 

 

문제 상황

 

Enhanced Input을 사용할 때 입력을 등록하는 부분에서 문제가 발생했다.

 

입력을 등록하는 템플릿 함수를 만들어서 사용하려 했다.

템플릿 함수는 정상적으로 선언하여 컴파일이 됬지만 Enhanced Input에 등록하는 코드가 들어가니 문제가 발생했다.

 

 

 

아래는 Enhanced Input에 함수를 바인딩하는 부분의 클래스다.

#pragma once
#include "CoreMinimal.h"
#include "Components/GameFrameworkInitStateInterface.h"
#include "Components/PawnComponent.h"
#include "XZPawnExtensionComponent.generated.h"

UCLASS()
class PROJECTXZ_API UXZPawnExtensionComponent : public UPawnComponent, public IGameFrameworkInitStateInterface
{
	GENERATED_BODY()

public:
	UXZPawnExtensionComponent(const FObjectInitializer& ObjectInitializer);
	TObjectPtr<AXZCharacter> GetXZCharacter();

	//*****************************************************
	//** IGameFrameworkInitStateInterface
	virtual void CheckDefaultInitialization() override;
	//*****************************************************

	void SetupPlayerInputComponent(UInputComponent* PlayerInputComponent);

	/** Pawn data used to create the pawn. Specified from a spawn function or on a placed instance. */
	//UPROPERTY(EditInstanceOnly, ReplicatedUsing = OnRep_PawnData, Category = "Lyra|Pawn")
	//TObjectPtr<const ULyraPawnData> PawnData;

private:
	void Input_Move(const FInputActionValue& InputActionValue);
	void Input_Jump(const FInputActionValue& InputActionValue);
	void Input_StopJumping(const FInputActionValue& InputActionValue);
	void Input_LookMouse(const FInputActionValue& InputActionValue);
	void Input_Crouch(const FInputActionValue& InputActionValue);

	void Input_EquipSlot1(const FInputActionValue& InputActionValue);
	void Input_EquipSlot2(const FInputActionValue& InputActionValue);

	void Input_WeaponFire(const FInputActionValue& InputActionValue);
	void Input_WeaponReload(const FInputActionValue& InputActionValue);

	void Input_Aim(FGameplayTag InputTag);
	void Input_StopAiming(FGameplayTag InputTag);

	UPROPERTY(EditDefaultsOnly, Category = "Input", meta = (AllowPrivateAccess = true))
	TObjectPtr<UInputMappingContext> DefaultIMC;

	UPROPERTY(EditDefaultsOnly, Category = "Input", meta = (AllowPrivateAccess = true))
	TObjectPtr<UXZDA_InputConfig> InputConfig;

	UPROPERTY()
	TObjectPtr<AXZCharacter> XZCharacter;
};

 

 

#include "XZPawnExtensionComponent.h"
#include "EnhancedInputComponent.h"
#include "EnhancedInputSubsystems.h"
#include "XZCharacter.h"
#include "ProjectXZ/Component/XZInputComponent.h"
#include "ProjectXZ/Component/XZWeaponComponent.h"
#include "ProjectXZ/GameplayTag/XZGameplayTags.h"

UXZPawnExtensionComponent::UXZPawnExtensionComponent(const FObjectInitializer& ObjectInitializer)
	: Super(ObjectInitializer) { }

TObjectPtr<AXZCharacter> UXZPawnExtensionComponent::GetXZCharacter() { }

void UXZPawnExtensionComponent::CheckDefaultInitialization() { }

void UXZPawnExtensionComponent::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
	check(PlayerInputComponent);
	
	const APlayerController* PC = GetController<APlayerController>();
	check(PC);

	UEnhancedInputLocalPlayerSubsystem* Subsystem = ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(PC->GetLocalPlayer());
	if (IsValid(Subsystem))
	{
		Subsystem->AddMappingContext(DefaultIMC, 0);
	}

	UXZInputComponent* XZInputComponent = Cast<UXZInputComponent>(PlayerInputComponent);
	if (false == IsValid(XZInputComponent)) UE_LOG(LogTemp, Warning, TEXT("nullptr == XZInputComponent"));

	if (IsValid(XZInputComponent))
	{
		XZInputComponent->BindPressActions(InputConfig, FXZTags::GetXZTags().InputTag_Move, ETriggerEvent::Triggered, this, &ThisClass::Input_Move);
		XZInputComponent->BindPressActions(InputConfig, FXZTags::GetXZTags().InputTag_Jump, ETriggerEvent::Triggered, this, &ThisClass::Input_Jump);
		XZInputComponent->BindPressActions(InputConfig, FXZTags::GetXZTags().InputTag_Look_Mouse, ETriggerEvent::Triggered, this, &ThisClass::Input_LookMouse);
		XZInputComponent->BindPressActions(InputConfig, FXZTags::GetXZTags().InputTag_Crouch, ETriggerEvent::Triggered, this, &ThisClass::Input_Crouch);

		// Weapon
		XZInputComponent->BindPressActions(InputConfig, FXZTags::GetXZTags().InputTag_1, ETriggerEvent::Triggered, this, &ThisClass::Input_EquipSlot1);
		XZInputComponent->BindPressActions(InputConfig, FXZTags::GetXZTags().InputTag_2, ETriggerEvent::Triggered, this, &ThisClass::Input_EquipSlot2);
		XZInputComponent->BindPressActions(InputConfig, FXZTags::GetXZTags().InputTag_Weapon_Fire, ETriggerEvent::Triggered, this, &ThisClass::Input_WeaponFire);
		XZInputComponent->BindPressActions(InputConfig, FXZTags::GetXZTags().InputTag_Weapon_Reload, ETriggerEvent::Triggered, this, &ThisClass::Input_WeaponReload);

		// Jump
		//XZInputComponent->BindPressReleaseActions(InputConfig, this, &ThisClass::Input_Jump, &ThisClass::Input_StopJumping);
		XZInputComponent->BindPressReleaseActions(InputConfig, this, &ThisClass::Input_Aim, &ThisClass::Input_StopAiming);
	}
}

void UXZPawnExtensionComponent::Input_Move(const FInputActionValue& InputActionValue) { }

void UXZPawnExtensionComponent::Input_Jump(const FInputActionValue& InputActionValue) { }

void UXZPawnExtensionComponent::Input_StopJumping(const FInputActionValue& InputActionValue) { }

void UXZPawnExtensionComponent::Input_LookMouse(const FInputActionValue& InputActionValue) { }

void UXZPawnExtensionComponent::Input_Crouch(const FInputActionValue& InputActionValue) { }

void UXZPawnExtensionComponent::Input_EquipSlot1(const FInputActionValue& InputActionValue) { }

void UXZPawnExtensionComponent::Input_EquipSlot2(const FInputActionValue& InputActionValue) { }

void UXZPawnExtensionComponent::Input_WeaponReload(const FInputActionValue& InputActionValue) { }

void UXZPawnExtensionComponent::Input_Aim(const FInputActionValue& InputActionValue) { }

void UXZPawnExtensionComponent::Input_StopAiming(const FInputActionValue& InputActionValue) { }

void UXZPawnExtensionComponent::Input_WeaponFire(const FInputActionValue& InputActionValue) { }

 


 

 

원인 및 해결방안

 

Enhanced Input에 입력을 바인딩할 때 등록하는 함수의 매개변수가 문제가 되었다.

 

해당 경우는 일반적으로 사용하는  FInputActionValue 타입이 아니다.

게임 플레이 태그가 해당 함수에 필요하게 만들었으니 매개변수는 FGameplayTag가 되어야 한다.

 

변경 전

	void Input_Aim(const FInputActionValue& InputActionValue);
	void Input_StopAiming(const FInputActionValue& InputActionValue);

 

 

변경 후

	void Input_Aim(FGameplayTag InputTag);
	void Input_StopAiming(FGameplayTag InputTag);
    //void Input_Aim(const FGameplayTag& InputTag); // 사용x
	//void Input_StopAiming(const FGameplayTag& InputTag); // 사용x

 


 

 

컴파일 성공