KillKiss Help

Input System

이 문서는 KillKiss 프로젝트에서 사용자 입력을 처리하기 위한 커스텀 입력 시스템의 구조와 구현 방법을 설명합니다.

개요

입력 시스템은 사용자 입력(예: 키보드, 마우스, 게임패드)과 게임 플레이 액션(예: 이동, 점프, 공격) 간의 연결을 처리합니다. 이 시스템은 모듈화와 유지보수를 쉽게 하기 위해 설계되었습니다.

구조

  • Native Gameplay Tags

    • InputConfigDataAsset 에 매핑될 입력 태그를 정의합니다.

  • Input Config DataAsset

    • 네이티브 게임플레이 태그를 특정 입력 액션에 매핑하는 데이터 에셋입니다. 입력 태그와 입력 시스템을 연결하는 다리 역할을 합니다.

  • Custom Input Component (입력 바인딩 메서드 정의)

    • 입력 액션을 게임 플레이 로직에 바인딩하는 커스텀 컴포넌트입니다. 입력 설정 데이터 에셋의 매핑 정보를 처리하여 적절한 콜백을 트리거합니다.

  • Binding Inputs (입력 콜백 정의)

    • 특정 입력이 발생했을 때 실행될 함수를 정의합니다.

    • 예시: Jump 입력이 발생하면 플레이어 캐릭터가 점프하는 함수를 실행합니다.

  • Assign assets in editor (에디터에서 필요한 에셋 할당)

    • 입력 시스템에 필요한 에셋을 에디터에서 할당합니다.

상세구현

Native Gameplay Tags

입력 태그를 네이티브로 정의하여 코드와 설정의 일관성을 유지합니다.

헤더파일

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") }

Input Config DataAsset

게임플레이 태그입력 액션을 매핑하는 구조체와 데이터 에셋입니다.

구조체 정의

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; }

Custom Input Component

입력 액션과 콜백을 바인딩할 수 있는 커스텀 컴포넌트를 생성합니다.

  • 주요 기능:

    • BindNativeInputAction : 입력 설정 데이터 에셋에서 태그를 검색하고, 해당 입력 액션을 콜백 함수에 바인딩합니다.

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); } }

설정 방법

SetCustomInputConfig.png

Binding Inputs

캐릭터의 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