
※ 해당 기록은 Unreal 5.5.4 버전을 기준으로 작성되었습니다.
버튼 3개의 입력으로 공격이 나가도록 구현하고자 했다. 해당 기능은 1차 프로젝트 때 구현하고자 했지만, 언리얼을 처음으로 배우던 때인지라 적당한 방법을 생각해내지 못하고 포기했었다. 그 당시에는 2버튼이었지만 이번엔 더 나아간 3버튼이다.
첫 번째로 사용한 방법은 하나의 InputAction에 키를 세 개를 할당하고, WasInputKeyJustPressed()과 WasInputKeyJustReleased()를 사용해서 키가 눌리고 떼질 때 bool변수의 값을 바꿔서 세 변수의 and연산이 true일 때 공격이 나가도록 구현했다. 이 방식으로 했을 때의 문제는, 입력이 칼타이밍으로 받아져야 한다는 것이었다. 버튼을 세 개를 동시에 눌러도 두 개까지 입력이 들어가는 경우가 많았고, 여러 번 눌러도 10 ~ 15번 중 한 번만이 세 개가 입력되었다.
두 번째로 사용한 방법은 조합 허용 시간을 지정해서 각각 입력이 들어오는 시간의 차가 허용 시간보다 작을 경우 공격이 나가도록 구현했다.
if (PlayerController->WasInputKeyJustPressed(EKeys::Q))
{
bIsQPressed = true;
LastQTime = CurrentTime;
}
...
if (bIsQPressed && bIsEPressed && bIsXPressed &&
FMath::Abs(LastQTime - LastETime) <= ComboWindow &&
FMath::Abs(LastETime - LastXTime) <= ComboWindow &&
FMath::Abs(LastQTime - LastXTime) <= ComboWindow)
...
위 같은 방식으로 각각의 키간의 입력시간의 차가 허용시간보다 작다면 실행하는 것인데, 첫 번째 방법보다는 개선되었지만 이것도 원하는 것처럼 누를 때마다 원하는 대로 입력이 들어가지 않았다.
다음으로 시도한 것은 2번의 방법에 Tarray를 사용하는 것이었다. 플레이어가 키를 입력하면 이를 Tarray에 넣고, 그 안에 값이 3개 있고 시간차 안이라면 실행하기 였다. 이 방법도 앞의 방법보단 개선이 있었지만 해결하진 못했다.
그래서 마지막으로 시도한 것이 각 키를 개별의 InputAction으로 분리한 것이다. B버튼, RightTrigger, RightGrip으로 분리하고, 분리한 키에 대해 함수를 각각 할당하여 처리했다. 버튼을 누를 때 Tarray안에 없으면 넣어주도록하고, 버튼을 뗄 때는 안에 있는 버튼이 있으면 제거하면서 버튼이 눌렸는지 판단하는 bool변수의 값도 그에 맞춰 바뀌도록 했다.
void ASHPlayer::OnBPressed(const FInputActionValue& InputValue)
{
if (!RightPressedKeys.Contains(EKeys::Q))
{
isBPressed = true;
RightPressedKeys.Add(EKeys::Q);
}
}
void ASHPlayer::OnBReleased(const FInputActionValue& InputValue)
{
if (RightPressedKeys.Contains(EKeys::Q))
{
RightPressedKeys.RemoveSingle(EKeys::Q);
isBPressed = false;
isDelay = false;
}
ShiftDilation ();
}
...
// Tick()에서
bRightPunch = isBPressed && isRGripPressed && isRTriggerPressed;
if (!isGrapping && bRightPunch && RightPressedKeys.Contains (EKeys::Q) &&
RightPressedKeys.Contains (EKeys::E) && RightPressedKeys.Contains (EKeys::C))
{
RightPunch ();
}
Tick에서 세 bool변수가 true인지 검사하고, Tarray안에 세 키가 모두 있다면 실행하도록 했다. 이 방법은 꽤나 유효해서 원하는 결과를 내주었다. 아래의 gif를 보면 키를 순차적으로 누를 때도 문제 없이 주먹을 쥐는 것을 볼 수 있다.

이것저것 시도하고 찾아보면서 문제를 해결하는데 3일정도 걸렸다. 금방 끝날 줄 알았는데 생각보다 오래 걸렸다. 주먹을 쥐고, 콜리전까지 추가해둔 상태라 휘두르고 충돌 처리에서 이어지는 체력 감소 처리까지 구현해야한다.