1. 버그
제목이 잘 와닿지 않을 수 있는데 영상으로 보면 바로 보이는 버그이다.
영상을 보면 하늘 또는 땅을 바라볼수록 캐릭터의 이동속도가 줄어드는 것을 볼 수 있다.
하늘,땅을 보면 이동속도가 계속 느려진다
2. 문제점 확인
문제점은 간단한데 일단 현재 구현된 이동 관련 메서드를 확인해 보자.
1
2
3
4
5
6
7
8
9
10
11
12
13
void APlayerCharacter::MoveForward(float AxisValue)
{
const FVector direction = FRotationMatrix(Controller->GetControlRotation()).GetUnitAxis(EAxis::X);
AddMovementInput(direction, FMath::Clamp(AxisValue * _movementSpeed, -1.f * _movementSpeed, 1.f * _movementSpeed));
}
void APlayerCharacter::MoveRight(float AxisValue)
{
const FVector direction = FRotationMatrix(Controller->GetControlRotation()).GetUnitAxis(EAxis::Y);
AddMovementInput(direction, FMath::Clamp(AxisValue * _movementSpeed, -1.f * _movementSpeed, 1.f * _movementSpeed));
}
위의 현재 구현된 코드에서 캐릭터의 Rotation을 통해 방향(direction)을 구하고 있다.
문제는 그 방향의 Z 값이 포함되어 있다는 것이다.
이게 진짜 문제가 되는 건지 로그를 통해 확인해 보자
1
2
3
4
5
6
7
8
void APlayerCharacter::MoveForward(float AxisValue)
{
FVector direction = FRotationMatrix(Controller->GetControlRotation()).GetUnitAxis(EAxis::X);
// 로그 추가
UE_LOG(LogTemp, Log, TEXT("Direction: %s"), *direction.ToString());
AddMovementInput(direction, FMath::Clamp(AxisValue * _movementSpeed, -1.f * _movementSpeed, 1.f * _movementSpeed));
}
전방을 바라보고 있을 때 direction 값은 아래와 같이 들어온다
LogTemp: Direction: X=0.027 Y=0.997 Z=0.073
땅을 바라보게 되면 로그는 아래와 같이 찍힌다
LogTemp: Direction: X=-0.000 Y=0.002 Z=-1.000
3. 해결
Z 값이 문제인 것을 알았으니 아래와 같이 코드를 수정해 주자.
테스트를 위해 로그도 추가해 주었다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void APlayerCharacter::MoveForward(float AxisValue)
{
FVector direction = FRotationMatrix(Controller->GetControlRotation()).GetUnitAxis(EAxis::X);
direction.Z = 0;
direction.Normalize();
// 실제로 해결이 되었는지 확인을 위한 로그
UE_LOG(LogTemp, Log, TEXT("Direction: %s"), *direction.ToString());
AddMovementInput(direction, FMath::Clamp(AxisValue * _movementSpeed, -1.f * _movementSpeed, 1.f * _movementSpeed));
}
void APlayerCharacter::MoveRight(float AxisValue)
{
FVector direction = FRotationMatrix(Controller->GetControlRotation()).GetUnitAxis(EAxis::Y);
direction.Z = 0;
direction.Normalize();
AddMovementInput(direction, FMath::Clamp(AxisValue * _movementSpeed, -1.f * _movementSpeed, 1.f * _movementSpeed));
}
컴파일 후 플레이를 해보면 아래와 같이 로그가 발생하는 것을 볼 수 있다
LogTemp: Direction: X=-0.003 Y=1.000 Z=0.000
수정 후 영상