본문 바로가기
포트폴리오 제작/Project_P

Project_P 인터페이스를 활용하여 의존성 낮추기

by k99812 2025. 1. 16.

기존 AnimInstance의 문제점

https://k99812.tistory.com/93

 

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);
    • 인터페이스 함수를 통해 자기자신을 넘긴다