문제를 찾았으니 해결을 해보자
어제 우리가 찾은 문제의 발생 원인이 bOrientRotationToMovement의 값이 true로 되어있고 이것은 인풋이 유지되는 동안에 회전을 하기 때문에 인풋이 끝나면 자연스럽게 회전도 멈추는 것이었다. 하지만 우리가 벤치마킹한 게임에서는 해당 움직임이 아닌 인풋이 짧아도 해당 방향으로 회전을 반드시 해줘야 하기 때문에 bOrientRotationToMovement를 false로 설정해 두고 직접 회전을 구현해야 한다.
move함수에 직접 회전을 구현하자
자 그러면 어떻게 회전을 구현해주어야 할까 플레이어가 입력했던 방향을 기억해두었다가 해당 방향으로 회전을 Tick함수를 이용하여 구현하는 방향으로 구성해 보았다. 일단 마지막으로 입력된 방향벡터를 담을 변수 하나를 헤더 파일에 생성해 주고 생성자에서 초기화해준다.


이제 플레이어가 마지막으로 입력한 방향의 벡터를 구해줘야 하기에 이를 인자로 받는 move함수에서 기존의 이동 구현한 로직 밑에 새로운 로직을 작성해 준다.
FVector DesiredDirection = (Forward * MovementVector.X) + (Right * MovementVector.Y); //입력 값을 계산
if(!DesiredDirection.IsNearlyZero()) //인풋이 있을때만 최신화
{
TargetRotation = DesiredDirection.Rotation(); //계산된 입력값을 TargetRotation에 대입
}
자 이제 회전할 방향을 담아 주었으니 해당 방향으로 회전을 넣어주어야 한다 우리는 이를 Tick을 통해서 구현하고자 정했었다. 문제는 틱마다 회전하는 건 좋지만 딱딱하게 회전하기보다는 선형보간을 이용해서 부드럽게 회전하는 것이 심미적으로 훌륭할 것이다. 근데 RInterpTo와 RInterpConstantTo 중 무엇을 쓰는 게 좋을까?
RInterpTo와 RInterpContantTo
RInterpTo는 선형 보간을 해주는데 시작과 끝의 속도가 가속하듯 점점 증가했다가 정해둔 수치에서 회전하다 목표에 가까워지면 다시 감속하는 형태로 보간을 해준다. 이는 자연스러운 회전을 구현하기에 적정하다 반면에 RInterpConstantTo는 회전이 일정한 속도로 진행되게 된다는 차이가 존재한다. 둘 다 적용해서 사용해 본 결과 RInterpConstantTo가 대전게임에서는 좀 더 좋은 거 같아 이를 사용하기로 채택했다.
void ATTPlayerCharacter::Tick ( float DeltaTime )
{
Super::Tick (DeltaTime );
float TurnSpeed = GetCharacterMovement ()->RotationRate.Yaw;
FRotator NewRotation = FMath::RInterpConstantTo ( GetActorRotation () , TargetRotation , DeltaTime , TurnSpeed );
SetActorRotation ( NewRotation );
}
이렇게 구현하면 첫 번째 문제였던 짧은 인풋시 회전이 중단되는 현상은 해결되게 된다. 이제 두 번째 문제였던 미세하게 더 오래 눌리게 된 현상은 다른 게임은 어떤가 하며 테스트를 해본 결과 아이온 2와 몬스터헌터 와일즈에서도 동일한 현상이 있고 이는 게임플레이에 지장이 없다고 판단 해당 현상은 일단 그대로 두기로 결정하였다.
'unreal 5기' 카테고리의 다른 글
| 251215 언리얼엔진 본캠프 88일차 멀티플레이 팀프로젝트4 (1) | 2025.12.15 |
|---|---|
| 251211 언리얼엔진 본캠프 86일차 멀티플레이 팀프로젝트3 (0) | 2025.12.11 |
| 251209 언리얼엔진 본캠프 84일차 멀티플레이 팀프로젝트1 (2) | 2025.12.09 |
| 251208 언리얼엔진 본캠프 83일차 소켓(Socket) (0) | 2025.12.08 |
| 251203 언리얼엔진 본캠프 80일차 Replication Notify (0) | 2025.12.03 |