[CH4-04] AnimGraph & AnimInstance

김여울·2025년 9월 11일
0

내일배움캠프

목록 보기
74/114

애님그래프 추가하기

Attack

Dance

몽타주 연결하기

애님그래프에서는 몽타주 연결이 안돼서 일단 캐릭터 블루프린트로 연결함


AnimInstance 코드 추가하기

AnimInstance.h

#pragma once

#include "CoreMinimal.h"
#include "Animation/AnimInstance.h"
#include "DCAnimInstance.generated.h"

class ADCCharacter;
class UCharacterMovementComponent;

/**
 * DC 전용 AnimInstance
 * - 캐릭터의 런타임 상태를 읽어와 ABP 애님그래프/스테이트머신에서 사용
 * - UE 5.5.4 기준
 */
UCLASS()
class DC_API UDCAnimInstance : public UAnimInstance
{
    GENERATED_BODY()

public:
    // 애님 인스턴스 초기화(캐싱)
    virtual void NativeInitializeAnimation() override;

    // 틱마다 캐릭터 상태를 동기화
    virtual void NativeUpdateAnimation(float DeltaSeconds) override;

protected:
    /** 소유 캐릭터 포인터 캐싱 */
    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Transient, Category="Owner")
    TObjectPtr<ADCCharacter> OwnerCharacter;

    /** 이동 컴포넌트 캐싱 */
    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Transient, Category="Owner")
    TObjectPtr<UCharacterMovementComponent> OwnerCharacterMovement;

    /** 이동 속도 (애님블루프린트 BlendSpace/스테이트 전이용) */
    //UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Transient, Category="Anim")
    //float Speed = 0.f;

    /** 공중 여부(점프/낙하) */
    //UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Transient, Category="Anim")
    //bool bIsInAir = false;

    /** 춤추는 중? (캐릭터의 복제된 상태를 미러링) */
    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Transient, Category="Gameplay")
    bool bIsDancing = false;

    /** 공격 가능? (캐릭터의 복제된 상태를 미러링) */
    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Transient, Category="Gameplay")
    bool bCanAttack = false;

    /** 슬라이드 중? (캐릭터의 복제된 상태를 미러링) */
    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Transient, Category="Gameplay")
    bool bIsSliding = false;
};

AnimInstance.cpp

#include "DCAnimInstance.h"
#include "Character/DCCharacter.h"
#include "GameFramework/CharacterMovementComponent.h"

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

    if (APawn* P = TryGetPawnOwner())
    {
        OwnerCharacter = Cast<ADCCharacter>(P);
        if (OwnerCharacter)
        {
            OwnerCharacterMovement = OwnerCharacter->GetCharacterMovement();
        }
    }
}

void UDCAnimInstance::NativeUpdateAnimation(float DeltaSeconds)
{
    Super::NativeUpdateAnimation(DeltaSeconds);

    if (!OwnerCharacter)
    {
        if (APawn* P = TryGetPawnOwner())
        {
            OwnerCharacter = Cast<ADCCharacter>(P);
            OwnerCharacterMovement = OwnerCharacter ? OwnerCharacter->GetCharacterMovement() : nullptr;
        }
        if (!OwnerCharacter)
        {
            return;
        }
    }

    // 캐릭터 상태 미러링
    bIsDancing = OwnerCharacter->GetIsDancing();
    bCanAttack = OwnerCharacter->GetCanAttack();
    bIsSliding = OwnerCharacter->GetIsSliding();
}

0개의 댓글