언리얼 엔진 5/개발 일지

[UE5] 블루아카이브 TPS게임 개발일지 (7) - Aim Offset

ciel45 2023. 12. 16. 15:23

지난 시간에는 조준한 채로 좌우 회전 시 캐릭터도 같이 회전하는 것까지 작업했었다.

 

 

이번에는 조준한 채로 상하 회전 시 그 방향을 조준하도록 하였다.

 

 

이를 구현하기 위해서는 Aim Offset을 활용해야 한다.

https://docs.unrealengine.com/5.3/ko/creating-an-aim-offset-in-unreal-engine/

 

에임 오프셋 만들기

에임 오프셋을 사용하여, 캐릭터가 마우스 또는 컨트롤러 방향으로 무기를 조준하도록 합니다.

docs.unrealengine.com

 

기본 Aim Offset 이외에도 Legacy 탭에 Aim Offset 1D가 있다.

 

Aim Offset과 Aim Offset 1D가 있는데, 축이 2개이냐 1개이냐의 차이이다. 현재 필요한 변수는 시점의 상/하 방향 하나 뿐이므로, Aim Offset 1D를 사용하였다.

 

 

 

먼저 에임 오프셋 안에 들어갈 앞 방향 조준, 위 방향 조준, 아래 방향 조준 포즈를 만들어주어야 한다.

앞 방향
위 방향
아래 방향

 

각 포즈는 기본 조준 애니메이션을 1프레임만 남기고 다 잘라낸 뒤, Spine을 회전시켜 키를 추가하여 만들었다.

 

확인할 부분

 

 

그리고 각 포즈의 디테일 패널의 Additive Settings를 위의 이미지와 같이 설정해준다.

 

 

 

이제 이 세 포즈를 아까 만든 에임 오프셋 1D에 넣어준다.

Pitch 선의 왼쪽에 아래 방향, 가운데에 정면, 오른쪽에 위 방향 포즈를 넣어준다.

 

 

에임 오프셋이 완성되었으므로, 이것을 블루프린트에서 사용할 차례이다.

 

우선, Pitch 값을 블루프린트에서 쓸 수 있도록 C++ 코드를 작성해주었다.

 

	UPROPERTY(BlueprintReadonly)
	float Pitch;

애니메이션 블루프린트의 부모 클래스의 헤더에 Pitch 변수 추가

// Fill out your copyright notice in the Description page of Project Settings.


#include "Character/KannaAnimInstance.h"
#include "Character/KannaCharacter.h"
#include "GameFramework/CharacterMovementComponent.h"
#include "Kismet/KismetMathLibrary.h"

void UKannaAnimInstance::NativeInitializeAnimation()
{
	Super::NativeInitializeAnimation();

	KannaCharacter = Cast<AKannaCharacter>(TryGetPawnOwner());
	if (KannaCharacter)
	{
		KannaCharacterMovement = KannaCharacter->GetCharacterMovement();
	}
}

void UKannaAnimInstance::NativeUpdateAnimation(float DeltaTime)
{
	Super::NativeUpdateAnimation(DeltaTime);

	if (KannaCharacterMovement)
	{
		GroundSpeed = UKismetMathLibrary::VSizeXY(KannaCharacterMovement->Velocity);
		IsFalling = KannaCharacterMovement->IsFalling();
		CharacterState = KannaCharacter->GetCharacterState();
		ActionState = KannaCharacter->GetActionState();

		CharacterSpeed = KannaCharacter->GetVelocity().Length();
		CharacterDirection = CalculateDirection(KannaCharacter->GetVelocity(), KannaCharacter->GetActorRotation());
		Pitch = KannaCharacter->GetBaseAimRotation().Pitch;
	}
}

(최하단 줄) GetBaseAimRotation()는 Rotator를 리턴한다. 리턴받은 Rotator의 Pitch를 가져오면 된다.

 

 

AO_Pistol이 아까 만든 Aim Offset이다. 인풋 Pitch 노드에 C++ 코드 변수인 Pitch를 넣어준다.

 

지난 시간에 만든 상,하체 레이어 블렌딩과도 합쳐져야 하기 때문에, 그 Output 포즈를 에임 오프셋의 Base Pose로 넣어주고, 에임 오프셋의 Output 포즈를 최종 포즈로 연결해주면 된다.

 

 

다음은 적용 결과이다.

마우스를 위, 아래로 움직이면 상체도 잘 움직이는 것을 볼 수 있다.