언리얼 엔진 5/개발 일지

[UE5] 블루아카이브 TPS게임 개발일지 (7.5) - 사격 애니메이션 추가(Additive Animation)

ciel45 2023. 12. 18. 21:38

(개발일지 7편이 글이 너무 길어져서 분리)

 

 

이제 발사 애니메이션을 만들 차례이다.

현재 권총 조준 애니메이션은 Anim Starter Pack의 것을 사용하고 있는데, 아쉽게도 여기에는 권총의 사격 애니메이션은 들어있지 않다.

 

그래서 조준 애니메이션을 베이스로 팔꿈치, 손목, 허리 뼈대를 조금 조작하여 직접 만들었다.

사격 애니메이션 시퀀스

 

참고로, 사격 애니메이션 시퀀스의 디테일 패널에서도 Additive Setting을 아까 에임 오프셋 포즈를 만들 때와 비슷하게 설정해주어야 한다.(다만 Additive Anim Type는 Local Space로) 자세한 내용은 후술하도록 하겠다.

 

그리고 이 애니메이션 시퀀스로 애니메이션 montage를 만들었다.

사격 애니메이션 montage

 

여기서 Blend Time을 0으로 해둔 것을 볼 수 있다. 

 

사격을 한다는 의미는 이미 조준중이므로 블렌딩이 필요하지 않다.

 

오히려 블렌딩 시간이 길어지면 안된다. 사격 애니메이션은 상대적으로 굉장히 짧기 때문에, 그 짧은 시간 안에 블렌딩을 하려다보면 사격 애니메이션이 불완전하게 재생될 수 있다. 따라서 0으로 맞춰두었다.

 

 

 

이제 캐릭터가 조준한 채로 사격 버튼을 누를 시 이 애니메이션 montage가 재생되도록 하면 된다.

 

그런데 여기서 고려해야 할 점이 있다. 사격 애니메이션도 애니메이션의 특정 부분만 재생되어야 한다. 무빙샷을 한다면 하체는 계속 이동하면서 총을 발사해야 하고, 위, 아래를 조준하면서 발사를 한다면 상체의 각도가 에임 오프셋의 것대로 유지되면서 총을 발사해야한다.

 

단순히 Play Animation Montage를 실행하면, 캐릭터가 원래의 자세를 잃고 갑자기 기계적으로 정면을 바라본 채로 총을 쏘게 된다.

 

이런 경우에 설정해줄 것이 애니메이션 시퀀스의 Additive Anim Type이다. (에셋 디테일 목차에 관련 내용 있음)

https://docs.unrealengine.com/5.3/ko/animation-sequence-editor-in-unreal-engine/

 

애니메이션 시퀀스 에디터

언리얼 엔진의 애니메이션 시퀀스 에디터를 자세하게 살펴봅니다.

docs.unrealengine.com

 

공식 문서 내용 중 일부

 

정리하자면, 베이스 애니메이션과 현재 애니메이션 간에는 뼈의 위치의 차이가 있을 것이다. 이를 델타라고 한다.

애디티브 애님 타입을 설정해주면 현재 자세에 그 델타의 차를 적용시켜준다.

 

현재 조준 애니메이션이 베이스 애니메이션이고, 사격 애니메이션이 현재 애니메이션이다.

 

사격 애니메이션과 조준 애니메이션 간의 차이인 델타가 있다. 현재 상황에서 델타는 아까 사격 애니메이션을 만들때 조작한 팔꿈치, 손목, 허리의 각도의 차이이다.

 

지금 캐릭터가 조준한 채로 게걸음을 하고있든, 하늘을 쳐다보고있든 어떤 포즈던 간에 거기에 델타의 차를 적용시켜주는 것이다.

 

결과적으로, 어떤 포즈이던 간에 플레이어가 사격 버튼을 누르면 그 포즈에 자연스럽게 사격 애니메이션이 조합되는 것이다.

 

 

아까 에임 오프셋을 만들 때도 이 덕분에 자연스럽게 상체가 회전할 수 있었고, 지금 사격 애니메이션에도 세팅이 잘 되어있기 때문에 이제 남은 일은 조준한 채로 마우스 왼쪽 버튼을 누를 시 AM_Fire가 재생되도록 하는 것 뿐이다.

 

Input Action 추가
Input Mapping Context에 Input Action 추가, 키 할당

 

UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Input)
UInputAction* FireAction;
    
/*input callback*/
void Fire();

캐릭터 헤더에 InputAction 포인터 FireAction 추가, 콜백 함수 생성

	UPROPERTY(EditDefaultsOnly, Category = Montages)
	UAnimMontage* FireMontage;

AnimMontage 포인터 FireMontage도 추가

 

 

 

EnhancedInputComponent->BindAction(FireAction, ETriggerEvent::Triggered, this, &AKannaCharacter::Fire);

캐릭터 .cpp에서 Input Action과 콜백 함수 Fire() 바인딩

void AKannaCharacter::Fire() // 여기서는 상태 전환, 애니메이션만 재생
{
	if (ActionState != EActionState::EAS_Aiming) return; // 조준 중일 때만 사격 가능
		
	UAnimInstance * AnimInstance = GetMesh()->GetAnimInstance();

	if (AnimInstance && FireMontage)
	{
		AnimInstance->Montage_Play(FireMontage);
	}
}

Fire() 콜백 함수. 조준 상태 확인 후 FireMontage 재생

 

 

실행 결과: