< AnimInstance 구조 >
UBFBaseAnimInstance -> 모든AnimInstance의 기초 Class
UBFCharacterAnimInstance -> UBFBaseAnimInstance를 상속받은 Character의 애님 인스턴스 Class
UBFPlayerAnimInstance -> 플레이어의 AnimInstance(UBFCharacterAnimInstance 상속)
UBFEnemyAnimInstance -> 적 캐릭터의 AnimInstance(UBFCharacterAnimInstance 상속) (* 추가 예정)
🎮 UBFBaseAnimInstance.h
UCLASS() class BOSSFIGHT_API UBFBaseAnimInstance : public UAnimInstance { GENERATED_BODY() protected: UFUNCTION(BlueprintPure, meta = (BlueprintThreadSafe)) bool DoseOwnerHasTag(FGameplayTag TagToCheck) const; };🎮 UBFBaseAnimInstance.cpp
bool UBFBaseAnimInstance::DoseOwnerHasTag(FGameplayTag TagToCheck) const { if (APawn* OwningPawn = TryGetPawnOwner()) { return UBFFunctionLibrary::NativeDoseActorHaveTag(OwningPawn, TagToCheck); } return false; }Base에서는 큰 기능을 추가하지는 않고 현재 OwningPawn에 특정 Tag가 있는지 확인하는 기능만 추가하였다. 앞으로 몇몇 상황에서는 Tag를 통해 애니메이션을 제어 할 것이다.
🎮 UBFCharacterAnimInstance.h
class ABFBaseCharacter; class UCharacterMovementComponent; UCLASS() class BOSSFIGHT_API UBFCharacterAnimInstance : public UBFBaseAnimInstance { GENERATED_BODY() public: virtual void NativeInitializeAnimation() override; virtual void NativeThreadSafeUpdateAnimation(float DeltaSeconds)override; protected: UPROPERTY() ABFBaseCharacter* OwningCharacter; UPROPERTY() UCharacterMovementComponent* OwningMovementComponent; UPROPERTY(VisibleDefaultsOnly, BlueprintReadOnly, Category = "Anim Data | LocomationData") float GroundSpeed; UPROPERTY(VisibleDefaultsOnly, BlueprintReadOnly, Category = "Anim Data | LocomationData") bool bHasAcceleration; UPROPERTY(VisibleDefaultsOnly, BlueprintReadOnly, Category = "Anim Data | LocomationData") float LocomationDirection; };🎮 UBFCharacterAnimInstance.cpp
void UBFCharacterAnimInstance::NativeInitializeAnimation() { OwningCharacter = Cast<ABFBaseCharacter>(TryGetPawnOwner()); if (OwningCharacter) { OwningMovementComponent = OwningCharacter->GetCharacterMovement(); } } void UBFCharacterAnimInstance::NativeThreadSafeUpdateAnimation(float DeltaSeconds) { if (!OwningCharacter || !OwningMovementComponent) { return; } GroundSpeed = OwningCharacter->GetVelocity().Size2D(); bHasAcceleration = OwningMovementComponent->GetCurrentAcceleration().SizeSquared2D() > 0.0f; }캐릭터가 사용할 AnimInstance의 상위 Class다 기본적으로 현재 캐릭터, 캐릭터 무브먼트 컴포넌트, 이동 속도, 가속 여부 등 공통적으로 변수를 저장 및 업데이트하도록 하였다.
🎮 UBFPlayerAnimInstance.h
class ABFPlayerCharacter; UCLASS() class BOSSFIGHT_API UBFPlayerAnimInstance : public UBFCharacterAnimInstance { GENERATED_BODY() public: virtual void NativeInitializeAnimation() override; virtual void NativeThreadSafeUpdateAnimation(float DeltaSeconds) override; protected: UPROPERTY(VisibleDefaultsOnly, BlueprintReadOnly, Category = "Anim Data | Refrence") ABFPlayerCharacter* OwningPlayerCharacter; };🎮 UBFPlayerAnimInstance.cpp
void UBFPlayerAnimInstance::NativeInitializeAnimation() { Super::NativeInitializeAnimation(); if (OwningCharacter) { OwningPlayerCharacter = Cast<ABFPlayerCharacter>(OwningCharacter); } } void UBFPlayerAnimInstance::NativeThreadSafeUpdateAnimation(float DeltaSeconds) { Super::NativeThreadSafeUpdateAnimation(DeltaSeconds); }플레이어가 사용할 AnimInstance이다 현재는 OwnerCharacter가 유효하면 PlayerCharacter로 형변환 하여 OwningPlayerCharacter에 저장 하는 기능만 구현 하였다.
🎮 UBFAnimLinkedLayer.h
class UBFPlayerAnimInstance; UCLASS() class BOSSFIGHT_API UBFAnimLinkedLayer : public UBFBaseAnimInstance { GENERATED_BODY() public: UFUNCTION(BlueprintPure, meta = (NotBlueprintThreadSafe)) UBFPlayerAnimInstance* GetPlayerAnimInstance() const; };🎮 UBFAnimLinkedLayer.cpp
UBFPlayerAnimInstance* UBFAnimLinkedLayer::GetPlayerAnimInstance() const { return Cast<UBFPlayerAnimInstance>(GetOwningComponent()->GetAnimInstance()); }



