BossFight - 적 AnimBlueprint

김대겸·2025년 4월 22일

적 AnimBlueprint

BFCharacterAnimInstance를 상속 받아 BFEnemyAnimInstance Class를 생성 하였다. 앞으로 적 캐릭터는 해당 Class를 상속받는 AnimBlueprint를 통해 애니메이션을 제어 할 예정이다.

🎮 UBFEnemyAnimInstance.h

class ABFEnemyCharacter;

UCLASS()
class BOSSFIGHT_API UBFEnemyAnimInstance : public UBFCharacterAnimInstance
{
	GENERATED_BODY()

public:
	virtual void NativeInitializeAnimation() override;
	virtual void NativeThreadSafeUpdateAnimation(float DeltaSeconds) override;

protected:
	UPROPERTY(VisibleDefaultsOnly, BlueprintReadOnly, Category = "Anim Data | Refrence")
	ABFEnemyCharacter* OwningEnemyCharacter;
};

🎮 UBFEnemyAnimInstance.cpp

void UBFEnemyAnimInstance::NativeInitializeAnimation()
{
	Super::NativeInitializeAnimation();
	if (OwningCharacter)
	{
		OwningEnemyCharacter = Cast<ABFEnemyCharacter>(OwningCharacter);
	}
}

void UBFEnemyAnimInstance::NativeThreadSafeUpdateAnimation(float DeltaSeconds)
{
	Super::NativeThreadSafeUpdateAnimation(DeltaSeconds);

	if (OwningEnemyCharacter)
	{
		// TODO AnimBlueprint 변수 최신화
	}
}

위와 같이 BFEnemyAnimInstance를 구현 해주었다. 다음으로 해당 Class를 상속 받아 AnimBlueprint를 생성 해주자.

이전과는 다르게 특정 스켈레톤을 통해 생성하지 않고 템플릿 형태로 생성 해, 이름을 ABP_Enemy_Base로 지정 해주었다.

이렇게 생성하면 로직을 ABP_Enemy_Base에서 작성하고, 해당 AnimBlueprint를 [스켈레톤으로 자손 애님 블루프린트 생성] 버튼을 통해 스켈레톤을 할당 해주면 같은 로직을 가지는 AnimBlueprint를 간편하게 작성 할 수 있다.

Locomation 내부

위와 같이 AnimBlueprint에 로직을 구현 하였다.

다음으로 EnemyCharacter의 AI를 제어할 Enum을 추가하고, AnimBlueprint에서 특정 상태일때, Strafing 상태로 넘어가도록 구현 해보자.

UENUM(BlueprintType)
enum class EBFEnemyAIState : uint8
{
	Idle, //대기 상태 (플레이어 인식 X )
	Strafing, // 플레이어 주변 배회(플레이어 인식 O)
	Chase, // 플레이어 추적(플레이어 인식 O)
	Attack // 공격 (플레이어 인식 O)
};

우선은 위와같이 간단하게 Enum을 작성 하였다. 해당 Type의 변수를 BFEnemyAnimInstance에 추가하고, 제어 해보자.

🎮 UBFEnemyAnimInstance.cpp

void UBFEnemyAnimInstance::NativeThreadSafeUpdateAnimation(float DeltaSeconds)
{
	Super::NativeThreadSafeUpdateAnimation(DeltaSeconds);

	if (OwningEnemyCharacter)
	{
		bIsStrafing = (AIState == EBFEnemyAIState::Strafing) ? true : false;
	}
}

위와 같이 AIState가 EBFEnemyAIState::Strafing이면 true를 아니면 false를 반환 하도록 구현 하였다.

이후 간단하게 BlendSpace를 작성하여 할당 해주고 태스트 해보았다.

작동 영상

문제없이 대기 애니메이션이 출력 된다.

다음에는 EnemyAIController를 작성하여, 플레이어를 인식 하도록하는 AI를 작성 해보겠다.

0개의 댓글