[UE] 입력 BindAction 템플릿 함수에서 발생한 문제
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
컴파일 성공
'⭐ Unreal Engine > UE Debugging Log' 카테고리의 다른 글
[UE] Build.cs에 PublicDependencyModuleNames 추가해도 컴파일이 되지 않음 (0) | 2024.09.20 |
---|---|
[UE] GameplayTag를 날리면서 발생한 문제, OnRep 함수 안 불림, 컴포넌트 클래스 Replicate (0) | 2024.07.31 |
[UE] SpawnActor 시점에 에러 발생 (0) | 2024.07.26 |
[UE] 몽타주 생성 시 A-pose 하는 문제 (0) | 2024.07.26 |
[UE] Gameplay Tag: TagName=Illegal name (block index out of range) (1) | 2024.07.24 |
댓글
이 글 공유하기
다른 글
-
[UE] Build.cs에 PublicDependencyModuleNames 추가해도 컴파일이 되지 않음
[UE] Build.cs에 PublicDependencyModuleNames 추가해도 컴파일이 되지 않음
2024.09.20 -
[UE] GameplayTag를 날리면서 발생한 문제, OnRep 함수 안 불림, 컴포넌트 클래스 Replicate
[UE] GameplayTag를 날리면서 발생한 문제, OnRep 함수 안 불림, 컴포넌트 클래스 Replicate
2024.07.31 -
[UE] SpawnActor 시점에 에러 발생
[UE] SpawnActor 시점에 에러 발생
2024.07.26 -
[UE] 몽타주 생성 시 A-pose 하는 문제
[UE] 몽타주 생성 시 A-pose 하는 문제
2024.07.26