BossFight - 적 Class 기초 작성

김대겸·2025년 4월 17일

적 Class 기초 작성

BaseCharacter를 상속 받아 적 캐릭터 Class를 작성 해보자.

🎮 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를 생성하고 위와 같이 기초적인 코드를 작성 하였다.

다음으로 필요한 PawnEquipmentComponent와 PawnUIComponent를 상속 받아 Enemy용 Component를 추가하고, 각 Interface에 필요한 함수를 정의 해주자.

🎮 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에 함수를 정의 하였다.

다음으로 BFGameplayAbility를 상속받아 Enemy가 사용할 EnemyAbility Class를 작성 하자.

🎮 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를 상속 받아 작성 하면 된다.

다음에는 EnemyAbility를 통해 Enemy의 무기를 스폰 및 장착하는 Ability를 작성해볼 예정이다.

0개의 댓글