enhanced input 키 동시입력
436
작성한 질문수 11
안녕하세요 교수님,
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 입력을 사용하기 때문에, 사실 왼쪽과 오른쪽을 개별적으로 컨트롤 하기는 어렵습니다.
왼쪽과 오른쪽은 하나의 입력 축의 범주 내에서 동작하기 때문에 동시에 누른다는 것을 식별할 수 없습니다.
움직임 입력의 경우 스틱의 썸스틱에 연동된다는 점을 생각해보시면 왼쪽 방향과 오른쪽 방향을 동시에 누른 다는 것은 아예 고려되어있지 않다고 볼 수 있지요.
1
안녕하세요 교수님,
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);
}
}
위 코드 예시에서는 동시에 반대 방향으로 입력된 경우를 감지해 상쇄시키는 로직을 추가하였습니다. 하지만, 실제로는 입력 값의 처리 방식이나 게임 엔진의 입력 시스템 구성에 따라 접근 방법이 다를 수 있으므로 적절하게 조정이 필요할 것입니다.
게임 로직 개발 시 원하는 동작을 정확히 이해하고 구현하는 것이 중요합니다. 상세한 설명이나 추가적인 문의가 필요하시면 언제든지 질문해 주세요!
무한맵 제작과정중에 GetWorld 가 Nullptr 을 반환합니다.
0
47
2
12강 행동트리에서 질문이 있습니다.
0
52
1
위젯 사이즈랑 위치 질문드려요.
0
82
3
행동트리의 데코레이션 관련하여 질문이 있습니다.
0
94
3
VS 2026 의 문제일까요?
0
489
2
에셋참조 블루프린트질문
0
67
2
애님 몽타주 콤보 관련질문
0
70
2
ThirdPerson CDO 에러가 생깁니다.
0
95
3
캐릭터가 움직이지 않습니다.
0
182
4
쿠킹 폴더 지정시 , Item 이외에는 지정하지 않는지 궁금합니다.
0
62
2
TSoftObjectPtr 를 사용했음에도, 메모리에 로드 됩니다.
0
95
2
7강에 나오는 생성자에 대해서 궁금합니다.
0
78
2
6강을 마무리하며 트레이스 채널 을 이해하지 못했습니다.
0
73
2
3강을 마무리 하며, 카메라가 움직이지 않습니다.
0
71
2
Use Controller Rotation 옵션값이 궁금합니다.
0
84
2
3강 입력 시스템 적용 중, 5.6 버전은 입력 매팅이 2개 입니다.
0
65
2
PlayerController 에 대헤 제가 잘못 이해한 것 같습니다.
0
78
2
13강 UpdateStat 부분에서 문제를 겪고 있습니다.
0
64
2
BP_PlayerController의 CustomEvent노드 이유가 궁금합니다.
0
66
1
콤포넌트 포인터 선언시 TObjectPtr<>과 UStaticMeshComponent* 차이점
0
73
2
CharacterMovementComponent의 RotationRate관련해서 질문이 있습니다.
0
115
2
언리얼 공부방법에 대해 질문드립니다.
0
87
2
4강 에서 이상한 그림자가 남습니다.
0
47
1
2강에서 카메라 회전안되시는분 참고
2
91
2





