기존 AnimInstance의 문제점
Project_P 캐릭터 애니메이션 설정(1) Anim Instance 구현
Anim InstanceAnim Instance는 애니메이션 블루프린트를 생성할 때 상속받는 클래스다Anim Instance에서는 추후 애니메이션 블루프린트에서 사용할 액터, 컴포넌트를 받아올 수 있고받아온 액터, 컴포넌트
k99812.tistory.com
AnimInstance를 구현할때 방향에 따라 멈추는 애니메이션을 재생하기 위해 플레이어가 MoveInput이 Relesed 될때 델리게이트를 사용해 AnimInstance의 SaveLastDirection함수를 호출하는 로직이 있었다.
//헤더파일
TObjectPtr<class APPGASCharacterPlayer> Owner;
void UPPAnimInstance::NativeInitializeAnimation()
{
Super::NativeInitializeAnimation();
//AnimInstance가 생성될때 한번만 호출되어 포인터 변수들을 초기화할때 사용
//#include "Character/PPGASCharacterPlayer.h" 추가
Owner = Cast<APPGASCharacterPlayer>(GetOwningActor());
if (Owner)
{
//#include "GameFramework/CharacterMovementComponent.h" 추가
Movement = Owner->GetCharacterMovement();
Owner->InputReleasedDelegate.BindUObject(this, &UPPAnimInstance::SaveLastDirection);
}
}
이 과정에서 델리게이트를 가져오기 위해 APPGASCharacterPlayer를 직접 참조를 하여 구현을 하였다.
하지만 직접 참조하여 구현해서 추후 몬스터 애니메이션을 위해 이 클래스를 재사용했을때 Owner가 CharacterPlayer클래스만 직접 참조하여 문제가 발생하였다 그래서 인터페이스를 이용해 직접참조를 최소화 하여 문제를 해결하였다.
인터페이스 생성
언리얼 인터페이스를 상속받아 PPAnimInterface를 생성하였다
virtual void BindInputReleasedDelegate(class UPPAnimInstance* InAnimInstance) = 0;
순수가상함수로 AnimInstace를 넘겨줄 수 있게 BindInputReleasedDelegate함수를 생성
인터페이스 구현
PPGASCharacterPlayer 헤더파일
#include "Interface/PPAnimInterface.h"
DECLARE_DELEGATE(FInputReleasedDelegate);
class PROJECT_P_API APPGASCharacterPlayer : ... public IPPAnimInterface
// InputRelease Delegate
public:
FInputReleasedDelegate InputReleasedDelegate;
virtual void BindInputReleasedDelegate(class UPPAnimInstance* InAnimInstance) override;
- CharacterPlayer 클래스에서 생성한 인터페이스를 구현받고 가상함수를 상속받음
PPGASCharacterPlayer Cpp파일
void APPGASCharacterPlayer::BindInputReleasedDelegate(UPPAnimInstance* InAnimInstance)
{
InputReleasedDelegate.BindUObject(InAnimInstance, &UPPAnimInstance::SaveLastDirection);
}
- 들어온 AnimInstance를 사용하여 델리게이트에 AnimInstance의 함수를 델리게이트에 바인드 시킨다
UPPAnimInstance 헤더파일
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Character)
TObjectPtr<class ACharacter> Owner;
- Owner를 ACharacter 클래스로 변경
UPPAnimInstance Cpp파일
void UPPAnimInstance::NativeInitializeAnimation()
{
Super::NativeInitializeAnimation();
Owner = Cast<ACharacter>(GetOwningActor());
if (Owner)
{
Movement = Owner->GetCharacterMovement();
IPPAnimInterface* OwnerInter = Cast<IPPAnimInterface>(Owner);
if (OwnerInter)
{
OwnerInter->BindInputReleasedDelegate(this);
}
}
}
- IPPAnimInterface* OwnerInter = Cast<IPPAnimInterface>(Owner);
- 기존에 직접참조하던 코드를 바꿔 인터페이스로 캐스팅 한다
- OwnerInter->BindInputReleasedDelegate(this);
- 인터페이스 함수를 통해 자기자신을 넘긴다
'포트폴리오 제작 > Project_P' 카테고리의 다른 글
Project_P 재시작 UI 제작 (0) | 2025.02.10 |
---|---|
Project_P 캐릭터 사망시 UI 출력 및 재시작 (0) | 2025.02.07 |
Project_P 행동트리 모델 공격방향으로 로테이션 (0) | 2024.12.18 |
Project_P 몬스터 HPBar 기능 추가 (0) | 2024.12.18 |
Project_P HUD 위젯 제작 (0) | 2024.12.18 |