728x90
반응형
이번 포스트에서는 이전에 만든 Primary Attribute를 자세하게 알아보고
이 Primary Attribute에 영향을 받아 동작하는 새로운 Attribute들을 알아보겠습니다.
1) Primary Attribute
- 1) Strength : 물리적 데미지를 증가시키는 스탯
- 2) Intelligence : 마법 데미지를 증가시키는 스탯
- 3) Resilience : 방어구와 방어구 효율을 증가시키는 스탯
- 4) Vigor : 체력을 증가시키는 스탯
크게 위의 4가지로 구성되어 있습니다.
오늘 만들어볼 Secondary Attribute의 경우 Primary Attribute에 영향을 받으면서
추가적으로 Secondary Attribute끼리도 영향을 받게끔 설계하도록 하겠습니다.
2) Secondary Attribute
- 1) Armor - Resilience와 연관 : 받는 데미지를 감소시키소, 방어 기회를 증가
- 2) Armor Penetration - Resilience와 연관 : 적의 방어구를 무시할 확률 증가, 크리티컬 공격 찬스 증가
- 3) Block Chance - Armor와 연관 : 확률적으로 받는 데미지를 반감
- 4) Critial Hit Chance - Armor Penetration와 연관 : 2배의 데미지를 줄 확률
- 5) Critical Hit Damage - Armor Penetration와 연관 : 크리티컬 공격 시 추가로 줄 데미지
- 6) Critical Hit Resistance - Armor와 연관 : 적의 크리티컬 확률을 줄임
- 7) Health Regeneration - Vigor와 연관 : 초당 체력 회복률을 상승
- 8) Mana Regeneration - Intelligence와 연관 : 초당 마나 회복률을 상승
- 9) Max Health - Vigor와 연관 : 최대 체력량
- 10) Max Mana - Intelligence와 연관: 마나 최대량
위와 같이 구성되어 있습니다.
이제 기존에 사용하던 AttributeSet에 Secondary Attribute를 추가하겠습니다.
3) AuraAttributeSet
.
.
.
/**
*
*/
UCLASS()
class AURA_API UAuraAttributeSet : public UAttributeSet
{
GENERATED_BODY()
.
.
.
/*
* RPG Secondary Attribute & Method
*/
UPROPERTY(BlueprintReadOnly, ReplicatedUsing = OnRep_Armor, Category = "Secondary Attributes")
FGameplayAttributeData Armor;
ATTRIBUTE_ACCESSORS(UAuraAttributeSet, Armor);
UPROPERTY(BlueprintReadOnly, ReplicatedUsing = OnRep_ArmorPenetration, Category = "Secondary Attributes")
FGameplayAttributeData ArmorPenetration;
ATTRIBUTE_ACCESSORS(UAuraAttributeSet, ArmorPenetration);
UPROPERTY(BlueprintReadOnly, ReplicatedUsing = OnRep_BlockChance, Category = "Secondary Attributes")
FGameplayAttributeData BlockChance;
ATTRIBUTE_ACCESSORS(UAuraAttributeSet, BlockChance);
UPROPERTY(BlueprintReadOnly, ReplicatedUsing = OnRep_CriticalHitChance, Category = "Secondary Attributes")
FGameplayAttributeData CriticalHitChance;
ATTRIBUTE_ACCESSORS(UAuraAttributeSet, CriticalHitChance);
UPROPERTY(BlueprintReadOnly, ReplicatedUsing = OnRep_CriticalHitDamage, Category = "Secondary Attributes")
FGameplayAttributeData CriticalHitDamage;
ATTRIBUTE_ACCESSORS(UAuraAttributeSet, CriticalHitDamage);
UPROPERTY(BlueprintReadOnly, ReplicatedUsing = OnRep_CriticalHitResistance, Category = "Secondary Attributes")
FGameplayAttributeData CriticalHitResistance;
ATTRIBUTE_ACCESSORS(UAuraAttributeSet, CriticalHitResistance);
UPROPERTY(BlueprintReadOnly, ReplicatedUsing = OnRep_HealthRegeneration, Category = "Secondary Attributes")
FGameplayAttributeData HealthRegeneration;
ATTRIBUTE_ACCESSORS(UAuraAttributeSet, HealthRegeneration);
UPROPERTY(BlueprintReadOnly, ReplicatedUsing = OnRep_ManaRegeneration, Category = "Secondary Attributes")
FGameplayAttributeData ManaRegeneration;
ATTRIBUTE_ACCESSORS(UAuraAttributeSet, ManaRegeneration);
UPROPERTY(BlueprintReadOnly, ReplicatedUsing = OnRep_MaxHealth, Category = "Vital Attributes")
FGameplayAttributeData MaxHealth;
ATTRIBUTE_ACCESSORS(UAuraAttributeSet, MaxHealth);
UPROPERTY(BlueprintReadOnly, ReplicatedUsing = OnRep_MaxMana, Category = "Vital Attributes")
FGameplayAttributeData MaxMana;
ATTRIBUTE_ACCESSORS(UAuraAttributeSet, MaxMana);
UFUNCTION()
void OnRep_Armor(const FGameplayAttributeData& OldArmor) const;
UFUNCTION()
void OnRep_ArmorPenetration(const FGameplayAttributeData& OldArmorPenetration) const;
UFUNCTION()
void OnRep_BlockChance(const FGameplayAttributeData& OldBlockChance) const;
UFUNCTION()
void OnRep_CriticalHitChance(const FGameplayAttributeData& OldCriticalHitChance) const;
UFUNCTION()
void OnRep_CriticalHitDamage(const FGameplayAttributeData& OldCriticalHitDamage) const;
UFUNCTION()
void OnRep_CriticalHitResistance(const FGameplayAttributeData& OldCriticalHitResistance) const;
UFUNCTION()
void OnRep_HealthRegeneration(const FGameplayAttributeData& OldHealthRegeneration) const;
UFUNCTION()
void OnRep_ManaRegeneration(const FGameplayAttributeData& OldManaRegeneration) const;
UFUNCTION()
void OnRep_MaxHealth(const FGameplayAttributeData& OldMaxHealth) const;
UFUNCTION()
void OnRep_MaxMana(const FGameplayAttributeData& OldMaxMana) const;
.
.
.
};
.
.
.
UAuraAttributeSet::UAuraAttributeSet()
{
InitHealth(50.0f);
InitMaxHealth(100.0f);
InitMana(50.0f);
InitMaxMana(100.0f);
}
void UAuraAttributeSet::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
{
Super::GetLifetimeReplicatedProps(OutLifetimeProps);
.
.
.
// Secondary Attributes
DOREPLIFETIME_CONDITION_NOTIFY(UAuraAttributeSet, Armor, COND_None, REPNOTIFY_Always);
DOREPLIFETIME_CONDITION_NOTIFY(UAuraAttributeSet, ArmorPenetration, COND_None, REPNOTIFY_Always);
DOREPLIFETIME_CONDITION_NOTIFY(UAuraAttributeSet, BlockChance, COND_None, REPNOTIFY_Always);
DOREPLIFETIME_CONDITION_NOTIFY(UAuraAttributeSet, CriticalHitChance, COND_None, REPNOTIFY_Always);
DOREPLIFETIME_CONDITION_NOTIFY(UAuraAttributeSet, CriticalHitDamage, COND_None, REPNOTIFY_Always);
DOREPLIFETIME_CONDITION_NOTIFY(UAuraAttributeSet, CriticalHitResistance, COND_None, REPNOTIFY_Always);
DOREPLIFETIME_CONDITION_NOTIFY(UAuraAttributeSet, HealthRegeneration, COND_None, REPNOTIFY_Always);
DOREPLIFETIME_CONDITION_NOTIFY(UAuraAttributeSet, ManaRegeneration, COND_None, REPNOTIFY_Always);
DOREPLIFETIME_CONDITION_NOTIFY(UAuraAttributeSet, MaxHealth, COND_None, REPNOTIFY_Always);
DOREPLIFETIME_CONDITION_NOTIFY(UAuraAttributeSet, MaxMana, COND_None, REPNOTIFY_Always);
.
.
.
}
.
.
.
void UAuraAttributeSet::OnRep_Armor(const FGameplayAttributeData& OldArmor) const
{
GAMEPLAYATTRIBUTE_REPNOTIFY(UAuraAttributeSet, Armor, OldArmor);
}
void UAuraAttributeSet::OnRep_ArmorPenetration(const FGameplayAttributeData& OldArmorPenetration) const
{
GAMEPLAYATTRIBUTE_REPNOTIFY(UAuraAttributeSet, ArmorPenetration, OldArmorPenetration);
}
void UAuraAttributeSet::OnRep_BlockChance(const FGameplayAttributeData& OldBlockChance) const
{
GAMEPLAYATTRIBUTE_REPNOTIFY(UAuraAttributeSet, BlockChance, OldBlockChance);
}
void UAuraAttributeSet::OnRep_CriticalHitChance(const FGameplayAttributeData& OldCriticalHitChance) const
{
GAMEPLAYATTRIBUTE_REPNOTIFY(UAuraAttributeSet, CriticalHitChance, OldCriticalHitChance);
}
void UAuraAttributeSet::OnRep_CriticalHitDamage(const FGameplayAttributeData& OldCriticalHitDamage) const
{
GAMEPLAYATTRIBUTE_REPNOTIFY(UAuraAttributeSet, CriticalHitDamage, OldCriticalHitDamage);
}
void UAuraAttributeSet::OnRep_CriticalHitResistance(const FGameplayAttributeData& OldCriticalHitResistance) const
{
GAMEPLAYATTRIBUTE_REPNOTIFY(UAuraAttributeSet, CriticalHitResistance, OldCriticalHitResistance);
}
void UAuraAttributeSet::OnRep_HealthRegeneration(const FGameplayAttributeData& OldHealthRegeneration) const
{
GAMEPLAYATTRIBUTE_REPNOTIFY(UAuraAttributeSet, HealthRegeneration, OldHealthRegeneration);
}
void UAuraAttributeSet::OnRep_ManaRegeneration(const FGameplayAttributeData& OldManaRegeneration) const
{
GAMEPLAYATTRIBUTE_REPNOTIFY(UAuraAttributeSet, ManaRegeneration, OldManaRegeneration);
}
void UAuraAttributeSet::OnRep_MaxHealth(const FGameplayAttributeData& OldMaxHealth) const
{
GAMEPLAYATTRIBUTE_REPNOTIFY(UAuraAttributeSet, MaxHealth, OldMaxHealth);
}
void UAuraAttributeSet::OnRep_MaxMana(const FGameplayAttributeData& OldMaxMana) const
{
GAMEPLAYATTRIBUTE_REPNOTIFY(UAuraAttributeSet, MaxMana, OldMaxMana);
}
.
.
.
추가한 SecondAttribute들에 대해 레플리케이션하는 함수들을 새로 만들었고
Actor의 생명주기동안 레플리케이션되고 있는 프로퍼티들을 리턴하는
GetLifetimeReplicatedProps 함수에 새롭게 추가한 SecondAttribute들을 추가하였습니다.
728x90
반응형
'언리얼 > 게임 프로젝트' 카테고리의 다른 글
Lyra 클론코딩 - (12) Portal UserFacingExpereience Load (0) | 2025.01.26 |
---|---|
GameplayAbilitySystem을 이용한 RPG 프로젝트 - (35) Secondary Attribute를 GameplayEffect로 초기화하기 (0) | 2025.01.25 |
Lyra 클론코딩 - (11) Common User (0) | 2025.01.25 |
GameplayAbilitySystem을 이용한 RPG 프로젝트 - (33) GE의 모디파이어_Attribute Based 파헤치기 03 (0) | 2025.01.25 |
Lyra 클론코딩 - (10 - 2) Input_02 (0) | 2025.01.24 |