Home [UE5 TPS 제작기] 14. 에임 오프셋(Aim Offset) 구현해보기
Post
Cancel

[UE5 TPS 제작기] 14. 에임 오프셋(Aim Offset) 구현해보기

에임 오프셋(Aim Offset) 이란?

UE4 공식 문서 - 에임 오프셋

UE4 공식 문서에서 에임 오프셋이란,
캐릭터의 무기 조준시 도움이 되는 블렌딩가능 포즈 시리즈가 저장된 애셋입니다. 애니메이션 도중, 에임 오프셋 결과를 달리기, 걷기, 점프 등과 같은 다른 모션과 블렌딩하여 캐릭터가 어느 방향을 보더라도 부드럽게 보이도록 만드는 것입니다.
이라고 설명하고 있습니다.

즉 요약하면 사용하고 있는 애니메이션에 무기 조준에 해당하는 애니메이션을 블렌딩할 수 있는 에셋입니다.

Unreal Engine 공식 문서는 항상 설명이 자세히 잘 되어 있기 때문에
자세한 내용은 공식 문서를 참고해 주세요!

공식 문서를 토대로 에셋 만들기

에임 오프셋은 공식 문서를 기반으로 만들 것이고 공식 문서의 블루 프린트 처리는 C++로 진행할 예정입니다.

공식 문서에서는 에픽 런처 마켓 플레이스에서 받을 수 있는 Animation Starter Pack을 기반으로 설명하고 있으므로 Animation Starter Pack 설치가 필요합니다.

UE 마켓 플레이스 - Animation Starter Pack

설치를 완료하셨다면 아래 공식 문서를 기반으로 에셋을 구현하면 끝입니다.

UE4 공식 문서 - 에임 오프셋 만들기

에셋 구현을 완료하였다면 아래와 같은 에임 오프셋 에셋이 만들어져 있을 것입니다.
1

공식 문서 오류 수정하기

만약에 공식 문서에 적힌 대로 프레임을 제거해서 새로운 애니메이션을 만들었는데
아래와 같이 Idle 상태로 돌아가는 애니메이션이 생성되었다면 아래 절차를 통해 수정하실 수 있습니다. 2


  1. 보여주고자 하는 애니메이션 프레임을 Record 버튼을 누른다.
    3

  2. 새로운 애니메이션 파일의 생성 위치와 이름을 작성하고 녹화를 시작한다.
    4

  3. 녹화 후 0 Frame으로 이동한 후 1 ~ N Frame을 삭제한다.
    5

  4. 1 ~ 3단계를 반복해서 모든 애니메이션 파일을 만든다.


C++를 이용하여 에임 오프셋 구현하기

생성한 에임 오프셋을 캐릭터 애니메이션에 블렌딩시켜 주어야 합니다.

그러기 위해서는 위에서 만든 애님 오프셋에 X(Yaw), Y(Pitch) 파라미터 값을 구현해주어야 하는데요.

컨트롤러 Rotation 값 - 액터 Rotation 값

에임 오프셋의 X(Yaw), Y(Pitch) 값에 컨트롤러 Rotation 값 - 액터 Rotation 값 결과 값을 넣어줘야 합니다.

컨트롤러 Rotation 값 - 액터 Rotation 값 결과 값 일까요?

하나씩 살펴보자면,
만약 우리가 아래처럼 캐릭터가 바라보는 방향을 바라보게 된다면
7
컨트롤러와 액터가 바라보는 방향은 아래와 같습니다.
8

그리고 캐릭터는 그대로 있고 하늘을 바라보게 마우스를 조작한다면 아래와 같은 화면을 볼 수 있는데

에임 오프셋이 이미 적용되어 있는 모습입니다.

9

이 때 컨트롤러와 액터가 바라보는 방향은 아래와 같습니다.

에임 오프셋이 이미 적용되어 있는 모습입니다.

10

실제로도 그런지 로그를 찍어보면 아래와 같이 나오는 것을 볼 수 있습니다.
11

로그를 보면, Y(Yaw) 값은 둘 다 동일하고 P(Pitch) 값이 다른 걸 볼 수 있습니다.

P(Pitch)는 X축의 회전 값입니다. 그러므로 Pitch 값 변화는 하늘 또는 땅을 바라볼 때 발생합니다.
12
13

그러므로, 컨트롤러 Rotation - 액터 Rotation을 하면 P(Pitch) = 89가 됨으로 하늘을 바라보게 됩니다.

에임 오프셋에서 Y 값은 Pitch입니다.
Yaw = 0 Pitch = 89 이므로 하늘을 바라보게 된다는 의미입니다.

1
2
3
4
5
void UCharacterAnimInstance::UpdateProperties(float DeltaSeconds)
{
	auto Delta = PlayerPawn->GetControlRotation() - PlayerPawn->GetActorRotation();
	Delta.Normalize();
}

이후 급격하게 변화하지 않고 서서히 변화할 수 있도록 RInterpTo를 이용하여 보간 값을 적용시켜 줍니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* AimDirection은 FRotator 입니다.
*/
void UCharacterAnimInstance::UpdateProperties(float DeltaSeconds)
{
	auto Delta = PlayerPawn->GetControlRotation() - PlayerPawn->GetActorRotation();
	Delta.Normalize();

	AimDirection = FMath::RInterpTo(AimDirection, Delta, DeltaSeconds, AimInterpolateSpeed);
	AimDirection = FRotator(
		FMath::ClampAngle(AimDirection.Pitch,-90,90),
		FMath::ClampAngle(AimDirection.Yaw,-90,90),
		0);
}

컴파일 후 AimDirection 값을 에임 오프셋에 적용시켜 줍니다.
6

결과

에임 오프셋이 기존 애니메이션과 잘 블렌딩되어 적용된 것을 확인할 수 있습니다.

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