BossFight - 스탯 적용(공용 스탯)

김대겸·2025년 4월 24일

스탯 적용(공용 스탯)

이번엔 플레이어가 각 무기를 장착 했을 때 필요한 스탯을 적용 하도록 하는 기능을 구현 해보겠다.

스탯을 적용 하기 전 각 무기별 기믹을 정리해보자

< 양손 도끼 >

  • 공격 적중 및, 패링 성공시 무기 게이지가 증가함
  • 무기게이지가 최대치(100) 도달 시 게이지를 0으로 초기화 하고 특수 능력 재화를 획득(UI표기)
  • 특수 능력 사용 키를 입력하여, 현재 있는 재화를 전부 사용, 하고 특수 공격을 발동

< 쌍검 >

  • 공격 적중 및 패링 성공 시 무기 게이지 증가
  • 무기 게이지가 가득 차면, 특수 능력 키를 입력하여, 검 형태 변환
  • 검 형태 변환 시 특수 능력 게이지가 점차 감소 하도록 함.
  • 게이지가 0이 되면 원래 형태로 원복 됨
  • 형태가 변환 된 도중에는 회피모션이 변경되고, 저스트 판정 성공시 소량 회복 함

< 검 & 방패 >

  • 특수 능력 키를 누르면 가드 패리 작동(일반 패링과 달리 방패로 패링을 함).
  • 가드 패리 성공 시 방패 Gage 증가, 공격 및 패링 성공 시 무기 Gage증가
  • 방패 Gage가 최대인 상태에서 가드 패리 성공 시 적에게 데미지를 주고, 기절 치를 상승 시킴
  • 무기 Gage가 최대인 상태에서 파생 공격 or 강 공격 시 추가 데미지 및 기절 치 증가 상승
  • 방패로 공격하는 강공격은 기본적으로 기절치를 가짐

다음으로 필요한 스탯을 정리 해보자.

< 공통 스탯>

  • HP, MaxHP(체력, 최대 체력)
  • StunGage (기절 게이지)

< 플레이어 전용 스탯>

  • SP, MaxSP(스태미나, 최대 스태미나)
  • WeaponGage (무기의 특수 능력 게이지)
  • WeaponCount (양손 도끼 특수 능력 재화) - 양손 도끼
  • ShieldGage (방패의 특수 능력 게이지) - 검&방패

< 적 전용 스탯 >

  • PartHP 1~2 (부위 파괴를 위한 HP) 최대 2개까지 적용 할 수 있도록 구현.

다음으로 공통 스탯을 적용 할 수 있도록 하자.

BaseCharacter의 PossessedBy()함수에서 InitStats()함수를 호출 하여 DataTable을 통해 적용 하도록 구현 해보자.

🎮 UBFAttributeSet.h

UCLASS()
class BOSSFIGHT_API UBFAttributeSet : public UAttributeSet
{
	GENERATED_BODY()

public:
	UBFAttributeSet();
	virtual void PostGameplayEffectExecute(const struct FGameplayEffectModCallbackData& Data)override;

	UPROPERTY(BlueprintReadOnly, Category = "Health")
	FGameplayAttributeData CurrentHP;
	ATTRIBUTE_ACCESSORS(UBFAttributeSet, CurrentHP)

	UPROPERTY(BlueprintReadOnly, Category = "Health")
	FGameplayAttributeData MaxHP;
	ATTRIBUTE_ACCESSORS(UBFAttributeSet, MaxHP)

	UPROPERTY(BlueprintReadOnly, Category = "Stun")
	FGameplayAttributeData CurrentStun;
	ATTRIBUTE_ACCESSORS(UBFAttributeSet, CurrentStun)
};

🎮 UBFAttributeSet.cpp

UBFAttributeSet::UBFAttributeSet()
{
	InitCurrentHP(1.0f);
	InitMaxHP(1.0f);
	InitCurrentStun(0.0f);
}

void UBFAttributeSet::PostGameplayEffectExecute(const FGameplayEffectModCallbackData& Data)
{
	if (Data.EvaluatedData.Attribute == GetCurrentHPAttribute())
	{
		const float NewCurrentHP = FMath::Clamp(GetCurrentHP(), 0.0f, GetMaxHP());
		SetCurrentHP(NewCurrentHP);
	}

	if (Data.EvaluatedData.Attribute == GetMaxHPAttribute())
	{
		const float NewMaxHP = FMath::Clamp(GetMaxHP(), 0.0f, 100.0f);
		SetMaxHP(NewMaxHP);
	}

	if (Data.EvaluatedData.Attribute == GetCurrentStunAttribute())
	{
		const float NewMaxHP = FMath::Clamp(GetMaxHP(), 0.0f, 100.0f);
		SetMaxHP(NewMaxHP);
	}
}

우선 공통으로 사용할 UBFAttributeSet에 Stun치를 추가하고 초기화와 Clamp를 통해 값을 제어 해주도록 구현 하였다.

다음으로 UDataAsset_StartUpBase 에 StartGameplayEffect를 추가하고 GameplayEffect를 통해 각 스탯을 설정 해주도록 하자.

🎮 UDataAsset_StartUpBase.h

UCLASS()
class BOSSFIGHT_API UDataAsset_StartUpBase : public UDataAsset
{
	GENERATED_BODY()

public:
    //중략
	UPROPERTY(EditDefaultsOnly, Category = "StartUp Data")
	TArray < TSubclassOf<UGameplayEffect>> StartUpGameplayEffects;

	void GrantAbilities(const TArray<TSubclassOf<UBFGameplayAbility>>& InAbilityToGive, UBFAbilitySystemComponent* InASCToGive, int32 ApplyLevel = 1);
};

🎮 UDataAsset_StartUpBase.cpp

void UDataAsset_StartUpBase::GiveToAbilitySystemComponent(UBFAbilitySystemComponent* InASCToGive, int32 ApplyLevel)
{
	check(InASCToGive);

	GrantAbilities(ActivateOnGivenAbilities, InASCToGive, ApplyLevel);
	GrantAbilities(ActivateOnTriggerdAbilities, InASCToGive, ApplyLevel);

	if (!StartUpGameplayEffects.IsEmpty())
	{
		for (const TSubclassOf<UGameplayEffect>& EffectClass : StartUpGameplayEffects)
		{
			if (!EffectClass) continue;

			UGameplayEffect* EffectCDO = EffectClass->GetDefaultObject<UGameplayEffect>();
			InASCToGive->ApplyGameplayEffectToSelf(EffectCDO, ApplyLevel, InASCToGive->MakeEffectContext());
		}
	}
}

위와같이 UDataAsset_StartUpBase를 변경 해주었다. 다음으로, 필요한 GameplayEffect를 작성하고 각 캐릭터별 DataAsset에 추가 해주자.

위 사진처럼 MaxHP를 override하는 형식으로 구현 하였다. 현재 HP는 게임 시작시 MaxHP와 동일 한 값을 가지고 있어야 하고, 이는 모든 캐릭터가 동일함으로 아래사진 처럼 구현 해주었다.

두가지 GameplayEffect를 DataAsset에 추가하였다. 이때 MaxHP가 최초로 적용 되어야함으로 GE_Player_Basic(MaxHP 수정)을 0번 Index에 추가하여 구현 하였다.

적 캐릭터도 위와 동일한 방식으로 구현 하였다.

작동 사진

곰 보스

플레이어

다음에는 플레이어전용, 무기, 적 전용 스탯을 적용하는 기능을 구현 해보겠다.

0개의 댓글