





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

#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;
};
#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();
}