Home [UE5 TPS 제작기] 6. 위, 아래를 볼 때 캐릭터 이동 속도가 느려지는 버그 수정법
Post
Cancel

[UE5 TPS 제작기] 6. 위, 아래를 볼 때 캐릭터 이동 속도가 느려지는 버그 수정법

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

img

땅을 바라보게 되면 로그는 아래와 같이 찍힌다

LogTemp: Direction: X=-0.000 Y=0.002 Z=-1.000

img_1

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

img_2

수정 후 영상

This post is licensed under CC BY 4.0 by the author.

[UE5 TPS 제작기] 7. AnimInstance

[UE5 TPS 제작기] 8. Animation Blueprint을 사용해 애니메이션 적용해보기