언리얼 엔진 5/개발 일지

[UE5] 블루아카이브 TPS게임 개발일지 (18) - 적 이동 애니메이션

ciel45 2023. 12. 27. 23:57

지금까지 Enemy 블루프린트의 애니메이션에 애니메이션 시퀀스 하나만 박아두었었다.

 

슬슬 체계화된 애니메이션이 필요할 것 같아, 애니메이션 블루프린트를 만들기로 했다.

 

우선 Mixamo에서 Idle, 걷기, 달리기 애니메이션을 가져와, 총 사이즈에 맞게 적절히 수정해주었다.

Idle
Walk
Run

 

 

 

그리고 이 세 애니메이션을 기반으로 한 Blend Space 1D를 만들었다.

 

Blend Space는 일전에 칸나의 무빙샷 애니메이션에 사용한 바가 있다. https://ciel45.tistory.com/15

 

블루아카이브 TPS게임 개발일지 (6) - 조준 개선 (Layered Blend, Blend Space)

·지금까지 조준 기능이 카메라 줌 인 부분만 구현되어있었다. 이번에는 조준한 채로 걸어다닐 수 있고, 카메라를 좌우로 돌리면 그 방향을 조준하도록 하였다. 먼저 조준한 채로 걸어다니는 애

ciel45.tistory.com

 

다만 그 때와는 다르게 이번엔 1D버전을 사용한다.

 

적의 이동은 정면으로만 움직이도록 할 것이기에, 애니메이션이 속도 한 가지 요소에만 좌우될 것이기 때문이다.

컨텐츠 브라우저 우클릭 -> Legacy를 통해 생성 메뉴에 접근할 수 있다.

 

가로 축을 Speed라 칭하고, 0~400으로 범위를 정한 다음 왼쪽부터 순서대로 Idle, Walk, Run 애니메이션을 삽입하였다.

 

 

이제 이 Blend Space를 애니메이션 블루프린트에서 사용하면 된다.

 

애니메이션 블루프린트 ABP_Enemy를 만들고 Move State에 이 블렌드 스페이스를 집어넣었다.

AnimGraph의 MainState 스테이트 머신 내 스테이트 중 MoveState의 내부.

 

 

Ground Speed는 이 애니메이션 블루프린트의 부모클래스인 C++ 클래스에서 틱마다 뿌려주고있는 값이다.

C++ 코드는 다음과 같다.

// EnemyAnimInstance.cpp


#include "Character/EnemyAnimInstance.h"
#include "Character/Enemy.h"
#include "GameFramework/CharacterMovementComponent.h"
#include "Kismet/KismetMathLibrary.h"

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

	EnemyCharacter = Cast<AEnemy>(TryGetPawnOwner());

	if (EnemyCharacter)
	{
		EnemyCharacterMovement = EnemyCharacter->GetCharacterMovement();
	}
}

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

	if (EnemyCharacterMovement)
	{
		GroundSpeed = UKismetMathLibrary::VSizeXY(EnemyCharacterMovement->Velocity);
	}
}

 

 

애니메이션이 적당히 만들어졌으니, 적이 플레이어를 쫒아오는 것을 테스트해보았다.

 

언리얼의 NavMeshBoundsVolume을 이용하면 어떤 Pawn이 패스파인딩 알고리즘을 통해 목표지점으로 향하게 할 수 있다.

PlaceActorsPanel에서 불러올 수 있다. 현재 월드에 배치해 크기를 늘려준 상태이다. 자동으로 장애물이 있는 곳은 지나갈 수 없도록 하여 초록색 표시가 없는 것을 볼 수 있다.

 

적이 플레이어를 쫒아오도록 하는 로직은 간단히 블루프린트로 만들었다.

게임이 시작하면, 2초마다 적이 플레이어 반경 1000 유닛거리 주변으로 이동한다.

 

 

아래는 테스트 영상이다.

https://www.youtube.com/watch?v=khUjFUT1e_Y