🎮 ABFEnemyCharacter.h
UCLASS() class BOSSFIGHT_API ABFEnemyCharacter : public ABFBaseCharacter { GENERATED_BODY() public: ABFEnemyCharacter(); protected: //~ Begin APawn Interface. virtual void BeginPlay() override; virtual void PossessedBy(AController* NewController) override; //~ End APawn Interface //~ Begin IPawnUIInterface virtual UPawnUIComponent* GetPawnUIComponent() const override; //~ End IPawnUIInterface //~ Begin IPawnEquipmentInterface virtual UPawnEquipmentComponent* GetPawnEquipmentComponent() const override; //~ End IPawnEquipmentInterface };🎮 ABFEnemyCharacter.cpp
ABFEnemyCharacter::ABFEnemyCharacter() { GetCapsuleComponent()->InitCapsuleSize(42.f, 96.f); bUseControllerRotationPitch = false; bUseControllerRotationRoll = false; bUseControllerRotationYaw = false; GetCharacterMovement()->bOrientRotationToMovement = true; GetCharacterMovement()->RotationRate = FRotator(0.0f, 500.0f, 0.0f); GetCharacterMovement()->MaxWalkSpeed = 250.0f; GetCharacterMovement()->BrakingDecelerationWalking = 2000.0f; } void ABFEnemyCharacter::BeginPlay() { Super::BeginPlay(); } void ABFEnemyCharacter::PossessedBy(AController* NewController) { Super::PossessedBy(NewController); } UPawnUIComponent* ABFEnemyCharacter::GetPawnUIComponent() const { return nullptr; } UPawnEquipmentComponent* ABFEnemyCharacter::GetPawnEquipmentComponent() const { return nullptr; }ABFBaseCharacter를 상속 받아 ABFEnemyCharacter Class를 생성하고 위와 같이 기초적인 코드를 작성 하였다.
🎮 UEnemyEquipmentComponent.h
UCLASS() class BOSSFIGHT_API UEnemyEquipmentComponent : public UPawnEquipmentComponent { GENERATED_BODY() public: virtual void RegisterWeapon(TArray<AWeaponBase*> NewWeapon) override; };🎮 UPawnEquipmentInterface.h
class UPawnEquipmentComponent; class UPlayerEquipmentComponent; class UEnemyEquipmentComponent; // This class does not need to be modified. UINTERFACE(MinimalAPI) class UPawnEquipmentInterface : public UInterface { GENERATED_BODY() }; class BOSSFIGHT_API IPawnEquipmentInterface { GENERATED_BODY() // Add interface functions to this class. This is the class that will be inherited to implement this interface. public: virtual UPawnEquipmentComponent* GetPawnEquipmentComponent() const = 0; virtual UPlayerEquipmentComponent* GetPlayerEquipmentComponent() const; virtual UEnemyEquipmentComponent* GetEnemyEquipmentComponent() const; };위와 같이 UEnemyEquipmentComponent를 작성 하고 IPawnEquipmentInterface에 EnemyEquipmentComponent를 반환 하는 함수를 정의 하였다.
위와 같은 방식으로 UEnemyUIComponent를 작성 하고 PawnUIInterface에 함수를 정의 하였다.
🎮 UBFEnemyAbility.h
class UEnemyEquipmentComponent; class ABFEnemyCharacter; UCLASS() class BOSSFIGHT_API UBFEnemyAbility : public UBFGameplayAbility { GENERATED_BODY() public: UFUNCTION(BlueprintPure, Category = "BossFight | Ability") ABFEnemyCharacter* GetEnemyCharacterFromActorInfo(); UFUNCTION(BlueprintPure, Category = "BossFight | Ability") UEnemyEquipmentComponent* GetEnemyEquipmentComponentFromActorInfo(); private: TWeakObjectPtr<ABFEnemyCharacter> CachedEnemyCharacter; };🎮 UBFEnemyAbility.cpp
ABFEnemyCharacter* UBFEnemyAbility::GetEnemyCharacterFromActorInfo() { if (!CachedEnemyCharacter.IsValid()) { CachedEnemyCharacter = Cast<ABFEnemyCharacter>(CurrentActorInfo->AvatarActor); } return CachedEnemyCharacter.IsValid() ? CachedEnemyCharacter.Get() : nullptr; } UEnemyEquipmentComponent* UBFEnemyAbility::GetEnemyEquipmentComponentFromActorInfo() { if (IPawnEquipmentInterface* PawnEquipmentInterface = Cast<IPawnEquipmentInterface>(GetEnemyCharacterFromActorInfo())) { return PawnEquipmentInterface->GetEnemyEquipmentComponent(); } else { return nullptr; } }PlayerAbility와 동일하게 EnemyCharacter와 EnemyEquipmentComponent를 반환하는 함수를 작성 하였다. 앞으로 Enemy가 사용할 Ability는 해당 Class를 상속 받아 작성 하면 된다.