작성
·
239
·
수정됨
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 으로 변해서 오른쪽으로 잘 이동 하는데, 오른쪽 방향키를 누른 채로 왼쪽 방향키를 누르면 벡터 값이 변하지 않아 계속 오른쪽으로 갑니다. 똑같이 앞 방향키를 누른 채로 뒷 방향키를 누르면 뒤로 가지는데, 뒷 방향키를 누른채로는 앞으로 갈 수가 없습니다. 물론 따로따로 한 버튼씩 서로 역이 되는 방향키를 누를 때는 값이 알맞게 잘 변경됩니다.
원하는 로직은 두 가지 중에 하나입니다.
동시입력이 들어왔을 경우 마지막 입력 방향으로 이동
동시입력이 서로 반대 방향으로 들어왔을 경우 상쇄되어 정지
로직을 어떻게 수정해야 할까요?
동시입력(오른쪽 홀드+왼쪽이동, 뒤쪽홀드 + 앞쪽이동) 할 때만 벡터값이 제대로 변하지 않는 이유를 못 찾겠습니다..
답변 2
0
음.. Axis 입력을 사용하기 때문에, 사실 왼쪽과 오른쪽을 개별적으로 컨트롤 하기는 어렵습니다.
왼쪽과 오른쪽은 하나의 입력 축의 범주 내에서 동작하기 때문에 동시에 누른다는 것을 식별할 수 없습니다.
움직임 입력의 경우 스틱의 썸스틱에 연동된다는 점을 생각해보시면 왼쪽 방향과 오른쪽 방향을 동시에 누른 다는 것은 아예 고려되어있지 않다고 볼 수 있지요.
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);
}
}
위 코드 예시에서는 동시에 반대 방향으로 입력된 경우를 감지해 상쇄시키는 로직을 추가하였습니다. 하지만, 실제로는 입력 값의 처리 방식이나 게임 엔진의 입력 시스템 구성에 따라 접근 방법이 다를 수 있으므로 적절하게 조정이 필요할 것입니다.
게임 로직 개발 시 원하는 동작을 정확히 이해하고 구현하는 것이 중요합니다. 상세한 설명이나 추가적인 문의가 필요하시면 언제든지 질문해 주세요!
감사합니다! 다른 방식으로 구현해 보도록 하겠습니다!