인프런 커뮤니티 질문&답변

차태관님의 프로필 이미지
차태관

작성한 질문수

이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해

enhanced input 키 동시입력

작성

·

245

·

수정됨

0

안녕하세요 교수님,

 


void APACharacterPlayer::Move(const FInputActionValue& Value)
{
   FVector2D MovementVector = Value.Get<FVector2D>();

   const FRotator Rotation = Controller->GetControlRotation();
   const FRotator YawRotation(0, Rotation.Yaw, 0);

   FVector ForwardDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X);
   FVector RightDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y);

   if (bIsRunning)
   {
      if (MovementVector.Y != 0) MovementVector.Y = 0;
      if (MovementVector.X == -1) MovementVector.X = 1;

      AddMovementInput(ForwardDirection, MovementVector.X);
   }
   else
   {
      if (MovementVector.Y != 0 || MovementVector.X == -1) bCanSprint = false;
      else bCanSprint = true;

      
      AddMovementInput(ForwardDirection, MovementVector.X);
      AddMovementInput(RightDirection, MovementVector.Y);

      UE_LOG(LogTemp, Log, TEXT("X =  %f  y =  %f"),ForwardDirection.X, RightDirection.Y);
      
   }
}

 

위 코드는 3인칭 게임플레이를 위해 강의 기반으로 작성한 코드입니다. bCanSprint 및 Running 로직은 무시하셔도 됩니다.

발생한 문제는 키의 동시 입력을 받을 때 입니다. 왼쪽 방향키를 누른 채로 오른쪽 방향키를 누르면 MovementVector 값이 1.0 으로 변해서 오른쪽으로 잘 이동 하는데, 오른쪽 방향키를 누른 채로 왼쪽 방향키를 누르면 벡터 값이 변하지 않아 계속 오른쪽으로 갑니다. 똑같이 앞 방향키를 누른 채로 뒷 방향키를 누르면 뒤로 가지는데, 뒷 방향키를 누른채로는 앞으로 갈 수가 없습니다. 물론 따로따로 한 버튼씩 서로 역이 되는 방향키를 누를 때는 값이 알맞게 잘 변경됩니다.

 

원하는 로직은 두 가지 중에 하나입니다.

  1. 동시입력이 들어왔을 경우 마지막 입력 방향으로 이동

  2. 동시입력이 서로 반대 방향으로 들어왔을 경우 상쇄되어 정지

 

로직을 어떻게 수정해야 할까요?

동시입력(오른쪽 홀드+왼쪽이동, 뒤쪽홀드 + 앞쪽이동) 할 때만 벡터값이 제대로 변하지 않는 이유를 못 찾겠습니다..

 

 

 

 

답변 2

0

이득우님의 프로필 이미지
이득우
지식공유자

음.. Axis 입력을 사용하기 때문에, 사실 왼쪽과 오른쪽을 개별적으로 컨트롤 하기는 어렵습니다.
왼쪽과 오른쪽은 하나의 입력 축의 범주 내에서 동작하기 때문에 동시에 누른다는 것을 식별할 수 없습니다.
움직임 입력의 경우 스틱의 썸스틱에 연동된다는 점을 생각해보시면 왼쪽 방향과 오른쪽 방향을 동시에 누른 다는 것은 아예 고려되어있지 않다고 볼 수 있지요.

 

차태관님의 프로필 이미지
차태관
질문자

감사합니다! 다른 방식으로 구현해 보도록 하겠습니다!

차태관님의 프로필 이미지
차태관
질문자

안녕하세요 교수님,

if (PC->IsInputKeyDown(EKeys::W) && PC->IsInputKeyDown(EKeys::S)) return;

if (PC->IsInputKeyDown(EKeys::A) && PC->IsInputKeyDown(EKeys::D)) return;



위와 같은 방식으로 해결 했습니다! 감사합니다!

이득우님의 프로필 이미지
이득우
지식공유자

네 기획 내용은 잘 모르겠지만, 버튼으로 하는 게 가장 손쉬울 것 같았습니다.

0

안녕하세요, 인프런 AI 인턴입니다.

자, 차태관님의 경우에는 MovementVector 값이 오른쪽과 왼쏜 방향키, 또는 앞과 뒤 방향키가 동시에 눌릴 때 서로 상쇄되어 정지하거나 마지막 입력 방향으로 이동하게 하고 싶으신 것 같네요.

우선, 두 방향키가 동시에 입력될 경우 상쇄되어 정지하게 하려면, MovementVector 값의 변화를 감지해 동시에 눌릴 경우 값을 0으로 설정해주는 로직이 필요합니다. 두 키가 반대 방향으로 동시에 눌렸을 경우 MovementVector의 X 또는 Y 값이 서로 상쇄되어 0이 될 것입니다. 이를 코드에 적용하기 위해서는 현재 MovementVector 값을 확인하여 그 값이 0인 경우 추가적인 이동 입력을 받지 않도록 해야 합니다.

동시 입력 중 마지막 입력 방향으로 이동하게 하려면, 가장 최근의 입력 값으로 MovementVector를 갱신하는 로직을 추가해야 합니다. 이는 입력이 감지될 때마다 MovementVector 값을 업데이트하면서, 동시에 눌린 경우 마지막으로 감지된 입력 방향에 따라 이동하도록 구현할 수 있습니다.

해당 로직을 기반으로 일부 코드를 수정해 보겠습니다. 만약 상쇄되어 정지하게 하고 싶다면, 아래와 같은 방식으로 수정해 볼 수 있습니다.

void APACharacterPlayer::Move(const FInputActionValue& Value)
{
   FVector2D MovementVector = Value.Get<FVector2D>();

   // 동시에 반대 방향이 입력되면 MovementVector를 0으로 설정
   if ((MovementVector.X > 0 && MovementVector.X < 0) || (MovementVector.Y > 0 && MovementVector.Y < 0)) {
       MovementVector = FVector2D(0,0);
   }

   const FRotator Rotation = Controller->GetControlRotation();
   const FRotator YawRotation(0, Rotation.Yaw, 0);

   FVector ForwardDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X);
   FVector RightDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y);

   if (bIsRunning)
   {
      if (MovementVector.Y != 0) MovementVector.Y = 0;
      if (MovementVector.X == -1) MovementVector.X = 1;

      AddMovementInput(ForwardDirection, MovementVector.X);
   }
   else
   {
      if (MovementVector.Y != 0 || MovementVector.X == -1) bCanSprint = false;
      else bCanSprint = true;


      AddMovementInput(ForwardDirection, MovementVector.X);
      AddMovementInput(RightDirection, MovementVector.Y);

      UE_LOG(LogTemp, Log, TEXT("X =  %f  y =  %f"),ForwardCourseDirection.X, RightDirection.Y);

   }
}

위 코드 예시에서는 동시에 반대 방향으로 입력된 경우를 감지해 상쇄시키는 로직을 추가하였습니다. 하지만, 실제로는 입력 값의 처리 방식이나 게임 엔진의 입력 시스템 구성에 따라 접근 방법이 다를 수 있으므로 적절하게 조정이 필요할 것입니다.

게임 로직 개발 시 원하는 동작을 정확히 이해하고 구현하는 것이 중요합니다. 상세한 설명이나 추가적인 문의가 필요하시면 언제든지 질문해 주세요!

차태관님의 프로필 이미지
차태관

작성한 질문수

질문하기