
※ 해당 기록은 Unreal 5.5.4 버전을 기준으로 작성되었습니다.
무기 장착을 관리하는 EquipComponent를 만들어 무기 줍고 버리는 기능을 구현했다.
사용자의 입력을 받아 장비중이 아니면 바닥의 무기를 주워 장착하고, 장비 중이라면 무기를 다시 바닥에 내려두는 역할을 하는 컴포넌트다.
처음에 장착/해제를 구현할 때, 두 기능을 각각의 함수로 분리하여 구현하고, 두 함수를 같은 키에 바인딩했다. 물론 bool변수를 두어 true일 땐 UnEquip()에서는 return하는, 반대의 경우에도 마찬가지로 동작하게 구현했다.
// 이전의 구현방식
void UEquipComponent::SetupInputBinding(class UEnhancedInputComponent* Input)
{
Super::SetupInputBinding(Input);
Input->BindAction(IA_Equip, ETriggerEvent::Started, this, &UEquipComponent::Equip);
Input->BindAction(IA_Equip, ETriggerEvent::Started, this, &UEquipComponent::UnEquip);
}
위와 같이 만들었을 때 문제가 발생했다. 예상 가능한 문제는 우선 하나의 키에 두 액션을 바인딩한 점이었다. 의도로는 무기를 갖고있으면 버리는 함수가, 무기가 없다면 무기를 줍는 액션이 수행되기를 바랐다. 하지만 무기를 버리는 액션은 실행이 마치 continue되는 느낌이었다.
검색으로 찾아보니 우선순위가 낮은 액션에 대해 Input을 소모할 가능성이 있었다. 즉 우선순위가 높다면 그것이 처리되고 다른 액션은 처리하지 않는 것이다.

위 이미지는 InputAction에서의 설정이다. Consume Lower Priority Enhanced Input Mapping이 기본으로 체크 되어 있어서 평소에 크게 관심갖지 않았던 부분이라 무심코 넘겼다. 아마 이 부분이 두 가지의 ETriggerEvent::Started로 바인딩 된 함수 중에 먼저 바인딩된 Equip만 실행되게 한 듯 하다. InputAction을 두 개로 분리하고, 각각의 다른 키에 바인딩 해서 실행했을 때는 정상적으로 실행되었다. 로직은 문제가 없었으나 내부의 처리의 이슈였던게 맞았다.
그래서 두 함수를 하나의 함수로 합쳐서 역시 bool값으로 분기하여 장착과 해제를 실행하도록 했다. 다시 InputAction과 키를 하나로 합쳐서 실행시켰다.

무기를 잡고, 버리는 기능이 제대로 실행되는 것을 볼 수 있다.
무기의 근본이 되는 WeaponBase를 만들고, 무기의 데이터 정보를 갖는 WeaponDataAsset을 만들 예정이다. WeaponBase를 상속해 여러 종류의 무기를 구현해야 한다.