이 문서는 KillKiss 프로젝트에서 사용자 입력을 처리하기 위한 커스텀 입력 시스템의 구조와 구현 방법을 설명합니다.
개요
입력 시스템은 사용자 입력(예: 키보드, 마우스, 게임패드)과 게임 플레이 액션(예: 이동, 점프, 공격) 간의 연결을 처리합니다. 이 시스템은 모듈화와 유지보수를 쉽게 하기 위해 설계되었습니다.
구조
Native Gameplay Tags
Input Config DataAsset
Custom Input Component (입력 바인딩 메서드 정의)
Binding Inputs (입력 콜백 정의)
Assign assets in editor (에디터에서 필요한 에셋 할당)
상세구현
입력 태그를 네이티브로 정의하여 코드와 설정의 일관성을 유지합니다.
헤더파일
namespace KKGameplayTags
{
/**Input Tags**/
KILLKISS_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(InputTag_Move)
KILLKISS_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(InputTag_Look)
}
Cpp
namespace KKGameplayTags
{
UE_DEFINE_GAMEPLAY_TAG(InputTag_Move, "Input.Move")
UE_DEFINE_GAMEPLAY_TAG(InputTag_Look, "Input.Look")
}
게임플레이 태그와 입력 액션을 매핑하는 구조체와 데이터 에셋입니다.
구조체 정의
USTRUCT(BlueprintType)
struct FKKInputActionConfig
{
GENERATED_BODY()
public:
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, meta=(Categories = "InputTag"))
FGameplayTag InputTag;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
UInputAction* InputAction;
};
태그로 입력 액션 찾기
UInputAction* UDataAsset_InputConfig::FindNativeInputActionByTag(const FGameplayTag& InInputTag)
{
for (const FKKInputActionConfig& NativeInputAction : NativeInputActions)
{
if (NativeInputAction.InputTag == InInputTag)
{
return NativeInputAction.InputAction;
}
}
return nullptr;
}
입력 액션과 콜백을 바인딩할 수 있는 커스텀 컴포넌트를 생성합니다.
public:
template <class UserObject, typename CallbackFunc>
void BindNativeInputAction(const UDataAsset_InputConfig* InInputConfig, const FGameplayTag& InInputTag,
ETriggerEvent TriggerEvent, UserObject* ContextObject, CallbackFunc Func);
};
template <class UserObject, typename CallbackFunc>
inline void UKKInputComponent::BindNativeInputAction(const UDataAsset_InputConfig* InInputConfig,
const FGameplayTag& InInputTag, ETriggerEvent TriggerEvent,
UserObject* ContextObject, CallbackFunc Func)
{
checkf(InInputConfig, TEXT("Input config data asset is null, can't bind"));
if (UInputAction* FoundAction = InInputConfig->FindNativeInputActionByTag(InInputTag))
{
BindAction(FoundAction, TriggerEvent, ContextObject, Func);
}
}
설정 방법

캐릭터의 SetupPlayerInputComponent 함수를 오버라이딩 하여 할당한다.
void AKKPlayerCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
checkf(InputConfigDataAsset, TEXT("입력 설정 데이터 에셋이 누락되었습니다."));
ULocalPlayer* LocalPlayer = GetController<AKKPlayerController>()->GetLocalPlayer();
UEnhancedInputLocalPlayerSubsystem* Subsystem =
ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(LocalPlayer);
check(Subsystem);
// 입력 매핑 컨텍스트 추가
Subsystem->AddMappingContext(InputConfigDataAsset->DefaultMappingContext, 0);
UKKInputComponent* KKInputComponent = CastChecked<UKKInputComponent>(PlayerInputComponent);
// 액션 바인딩
KKInputComponent->BindNativeInputAction(InputConfigDataAsset, KKGameplayTags::InputTag_Move,
ETriggerEvent::Triggered, this, &Input_Move);
KKInputComponent->BindNativeInputAction(InputConfigDataAsset, KKGameplayTags::InputTag_Look,
ETriggerEvent::Triggered, this, &Input_Look);
}
이 입력 시스템은 모듈화된 설계로 유지보수를 간소화하며, 새로운 입력 액션 추가 시 코드 수정이 최소화되도록 설계되었습니다.
Last modified: 07 December 2024