[Unreal] VR 프로젝트 - 3버튼 공격

Cassis_Soda·2025년 3월 24일

VR 프로젝트

목록 보기
3/3
post-thumbnail

※ 해당 기록은 Unreal 5.5.4 버전을 기준으로 작성되었습니다.


0. 서론

     버튼 3개의 입력으로 공격이 나가도록 구현하고자 했다. 해당 기능은 1차 프로젝트 때 구현하고자 했지만, 언리얼을 처음으로 배우던 때인지라 적당한 방법을 생각해내지 못하고 포기했었다. 그 당시에는 2버튼이었지만 이번엔 더 나아간 3버튼이다.

1. 트러블 슈팅

     첫 번째로 사용한 방법은 하나의 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개 있고 시간차 안이라면 실행하기 였다. 이 방법도 앞의 방법보단 개선이 있었지만 해결하진 못했다.

2. 해결

     그래서 마지막으로 시도한 것이 각 키를 개별의 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. 앞으로의 구현

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

0개의 댓글