BossFight - 적 Ability(무기 장착)

김대겸·2025년 4월 18일

적 Ability (무기 장착)

저번에 만든 EnemyAbility를 상속 받아 적 무기를 스폰 및 부착 하는 기능을 구현 해보자

우선 적이 사용할 EnemyWeapon을 구현 해보자. 적의 무기는 2종류로 StaticMesh가 있는 무기와, StaticMesh 없이 적 캐릭터에게 부착될 무기 총 두가지 종류이다.

현재 구현한 EnemyWeapon은 추가적으로 기능이나, 변수를 추가하진 않았다, 다만 후에 적 무기에만 특정한 기능이 필요 할 수 있으니 WeaponBase를 상속 받아 구현 하기로 하였다.

다음으로 EnemyEquipmentComponent의 RegisterWeapon을 구현 해주자

🎮 UEnemyEquipmentComponent.cpp

	for (AWeaponBase* Weapon : NewWeapon)
	{
		if (CurrentWeaponMap.Contains(Weapon->GetEquipType())) { continue; }
		CurrentWeaponMap.Add(Weapon->GetEquipType(), Weapon);
	}
}

현재로서는 단순히 들어온 NewWeapon배열을 등록 해주기만 하면 된다. 이때 이미 같은 부위에 무기가 장착 되어 있으면 continue를 통해 넘어가도록 하여, 중복으로 부착되는 것을 막아주자.

다음으로 EnemyAbility를 상속받아 GA_Enemy_WeaponSpawn Ability를 생성하여 아래와 같이 구현 하였다.

어빌리티 작동 규칙을 OnGiven으로 하여 부여됨과 동시에 작동 하도록 구현 하였다.

해당 Ability에서는 무기를 스폰 및 부착만 하면 되기에, GA_Player_WeaponSeleted와 같은 형식으로 구현 하였다.

이제 해당 Ability를 부여해주기만 하면 구현 완료이다. DataAsset_PlayerStartUp을 만든것 처럼 DataAsset_EnemyStartUp를 생성하여 해당 DataAsset에 Ability를 추가하고, 부여 해주도록 하자.

🎮 UDataAsset_StartUpEnemy.h

class UBFEnemyAbility;

UCLASS()
class BOSSFIGHT_API UDataAsset_StartUpEnemy : public UDataAsset_StartUpBase
{
	GENERATED_BODY()
public:
	virtual void GiveToAbilitySystemComponent(UBFAbilitySystemComponent* InASCToGive, int32 ApplyLevel = 1) override;

private:
	UPROPERTY(EditDefaultsOnly, Category = "StartUpData")
	TArray<TSubclassOf<UBFEnemyAbility>> EnemyAbilities;
};

🎮 UDataAsset_StartUpEnemy.cpp

void UDataAsset_StartUpEnemy::GiveToAbilitySystemComponent(UBFAbilitySystemComponent* InASCToGive, int32 ApplyLevel)
{
	Super::GiveToAbilitySystemComponent(InASCToGive, ApplyLevel);

	for (TSubclassOf<UBFEnemyAbility>& EnemyAbility : EnemyAbilities)
	{
		if (!IsValid(EnemyAbility)) { continue; }

		FGameplayAbilitySpec AbilitySpec(EnemyAbility);
		AbilitySpec.SourceObject = InASCToGive->GetAvatarActor();
		AbilitySpec.Level = ApplyLevel;

		InASCToGive->GiveAbility(AbilitySpec);
	}
}

적 캐릭터가 사용할 EnemyAbility인 EnemyAbilities 배열을 추가하고, GiveToAbilitySystemComponent() 함수를 Override하였다. 해당 함수에서는 배열안의 EnemyAbility를 부여하는 기능만 추가하였다.

다음으로 해당 함수를 호출 해주도록 EnemyCharacter에 기능을 구현 해주자.

🎮 ABFEnemyCharacter.cpp

void ABFEnemyCharacter::PossessedBy(AController* NewController)
{
	Super::PossessedBy(NewController);
	if (!CharacterStartUpData.IsNull())
	{
		if (UDataAsset_StartUpBase* LodedData = CharacterStartUpData.LoadSynchronous())
		{
			LodedData->GiveToAbilitySystemComponent(BFAbilitySystemComponent);
		}
	}
}

위와같이 PossessedBy()함수에서 DataAsset을 동기로딩 하여 부여 해주도록 구현 하였다.

현재 구현한 적 캐릭터는 곰형태의 캐릭터로 앞발로 공격하기에 무기의 StaticMesh가 없이 Collision만 있도록 하였다.

실제 게임을 실행 해보고 확인 해보자.

구현 사진

문제없이 앞발에 부착된것을 확인 하였다.

다음에는 적캐릭터의 AnimInstance를 작성해보도록 하겠다.

0개의 댓글