Add PHY gameplay attributes

This commit is contained in:
2026-04-26 01:30:00 +08:00
parent ddb5f599f9
commit 408a764560
19 changed files with 1515 additions and 0 deletions

View File

@@ -0,0 +1,167 @@
// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "AbilitySystem/Attributes/PHYAttributeSettings.h"
#include "PHYAttributeCalculationLibrary.generated.h"
class UPHYCoreAttributeSet;
/**
* @brief 基础属性输入快照,用于 C++、GE 和后续 MMC 共享公式。
*/
USTRUCT(BlueprintType)
struct FPHYCoreAttributeSnapshot
{
GENERATED_BODY()
/** @brief 力量。 */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="PHY|Attributes|Core")
float Strength = 0.0f;
/** @brief 灵巧。 */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="PHY|Attributes|Core")
float Dexterity = 0.0f;
/** @brief 体魄。 */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="PHY|Attributes|Core")
float Vitality = 0.0f;
/** @brief 智力。 */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="PHY|Attributes|Core")
float Intelligence = 0.0f;
/** @brief 精神。 */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="PHY|Attributes|Core")
float Spirit = 0.0f;
/** @brief 感知。 */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="PHY|Attributes|Core")
float Perception = 0.0f;
};
/**
* @brief 次级战斗属性计算结果。
*/
USTRUCT(BlueprintType)
struct FPHYDerivedCombatAttributes
{
GENERATED_BODY()
/** @brief 推导后的生命上限。 */
UPROPERTY(BlueprintReadOnly, Category="PHY|Attributes|Combat")
float MaxHealth = 0.0f;
/** @brief 推导后的法力上限。 */
UPROPERTY(BlueprintReadOnly, Category="PHY|Attributes|Combat")
float MaxMana = 0.0f;
/** @brief 推导后的耐力上限。 */
UPROPERTY(BlueprintReadOnly, Category="PHY|Attributes|Combat")
float MaxStamina = 0.0f;
/** @brief 推导后的物理攻击强度。 */
UPROPERTY(BlueprintReadOnly, Category="PHY|Attributes|Combat")
float PhysicalAttackPower = 0.0f;
/** @brief 推导后的法术强度。 */
UPROPERTY(BlueprintReadOnly, Category="PHY|Attributes|Combat")
float SpellPower = 0.0f;
/** @brief 推导后的护甲。 */
UPROPERTY(BlueprintReadOnly, Category="PHY|Attributes|Combat")
float Armor = 0.0f;
/** @brief 推导后的魔法抗性。 */
UPROPERTY(BlueprintReadOnly, Category="PHY|Attributes|Combat")
float MagicResistance = 0.0f;
/** @brief 推导后的命中率。 */
UPROPERTY(BlueprintReadOnly, Category="PHY|Attributes|Combat")
float Accuracy = 0.0f;
/** @brief 推导后的闪避率。 */
UPROPERTY(BlueprintReadOnly, Category="PHY|Attributes|Combat")
float Evasion = 0.0f;
/** @brief 推导后的暴击率。 */
UPROPERTY(BlueprintReadOnly, Category="PHY|Attributes|Combat")
float CriticalChance = 0.0f;
/** @brief 推导后的暴击伤害倍率。 */
UPROPERTY(BlueprintReadOnly, Category="PHY|Attributes|Combat")
float CriticalDamage = 0.0f;
/** @brief 推导后的攻击速度倍率。 */
UPROPERTY(BlueprintReadOnly, Category="PHY|Attributes|Combat")
float AttackSpeed = 0.0f;
/** @brief 推导后的冷却缩减比例。 */
UPROPERTY(BlueprintReadOnly, Category="PHY|Attributes|Combat")
float CooldownReduction = 0.0f;
/** @brief 推导后的格挡强度。 */
UPROPERTY(BlueprintReadOnly, Category="PHY|Attributes|Combat")
float BlockPower = 0.0f;
/** @brief 推导后的破防强度。 */
UPROPERTY(BlueprintReadOnly, Category="PHY|Attributes|Combat")
float GuardBreakPower = 0.0f;
/** @brief 推导后的韧性。 */
UPROPERTY(BlueprintReadOnly, Category="PHY|Attributes|Combat")
float Poise = 0.0f;
/** @brief 推导后的韧性伤害。 */
UPROPERTY(BlueprintReadOnly, Category="PHY|Attributes|Combat")
float PoiseDamage = 0.0f;
};
/**
* @brief 元素属性计算结果。
*/
USTRUCT(BlueprintType)
struct FPHYDerivedElementAttributes
{
GENERATED_BODY()
/** @brief 推导后的通用元素伤害加成。 */
UPROPERTY(BlueprintReadOnly, Category="PHY|Attributes|Element")
float DamageBonus = 0.0f;
/** @brief 推导后的通用元素抗性。 */
UPROPERTY(BlueprintReadOnly, Category="PHY|Attributes|Element")
float Resistance = 0.0f;
/** @brief 推导后的通用元素穿透。 */
UPROPERTY(BlueprintReadOnly, Category="PHY|Attributes|Element")
float Penetration = 0.0f;
};
/**
* @brief 属性公式函数库,避免首期依赖复杂 MMC 资产。
*/
UCLASS()
class PHY_API UPHYAttributeCalculationLibrary : public UBlueprintFunctionLibrary
{
GENERATED_BODY()
public:
/** @brief 从配置默认值创建基础属性快照。 */
UFUNCTION(BlueprintCallable, BlueprintPure, Category="PHY|Attributes")
static FPHYCoreAttributeSnapshot MakeCoreSnapshotFromDefaults();
/** @brief 从基础属性集创建基础属性快照。 */
UFUNCTION(BlueprintCallable, BlueprintPure, Category="PHY|Attributes")
static FPHYCoreAttributeSnapshot MakeCoreSnapshotFromAttributeSet(const UPHYCoreAttributeSet* CoreAttributes);
/** @brief 根据基础属性和配置公式计算次级战斗属性。 */
UFUNCTION(BlueprintCallable, BlueprintPure, Category="PHY|Attributes")
static FPHYDerivedCombatAttributes CalculateCombatAttributes(const FPHYCoreAttributeSnapshot& CoreAttributes);
/** @brief 根据基础属性和配置公式计算通用元素属性。 */
UFUNCTION(BlueprintCallable, BlueprintPure, Category="PHY|Attributes")
static FPHYDerivedElementAttributes CalculateElementAttributes(const FPHYCoreAttributeSnapshot& CoreAttributes);
};

View File

@@ -0,0 +1,12 @@
// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "AbilitySystemComponent.h"
#include "AttributeSet.h"
#define PHY_ATTRIBUTE_ACCESSORS(ClassName, PropertyName) \
GAMEPLAYATTRIBUTE_PROPERTY_GETTER(ClassName, PropertyName) \
GAMEPLAYATTRIBUTE_VALUE_GETTER(PropertyName) \
GAMEPLAYATTRIBUTE_VALUE_SETTER(PropertyName) \
GAMEPLAYATTRIBUTE_VALUE_INITTER(PropertyName)

View File

@@ -0,0 +1,301 @@
// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "UObject/Object.h"
#include "PHYAttributeSettings.generated.h"
/**
* @brief 基础属性初始值。
*/
USTRUCT(BlueprintType)
struct FPHYCoreAttributeDefaults
{
GENERATED_BODY()
/** @brief 力量初始值。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Core")
float Strength = 10.0f;
/** @brief 灵巧初始值。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Core")
float Dexterity = 10.0f;
/** @brief 体魄初始值。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Core")
float Vitality = 10.0f;
/** @brief 智力初始值。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Core")
float Intelligence = 10.0f;
/** @brief 精神初始值。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Core")
float Spirit = 10.0f;
/** @brief 感知初始值。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Core")
float Perception = 10.0f;
};
/**
* @brief 次级战斗属性公式系数。
*/
USTRUCT(BlueprintType)
struct FPHYCombatAttributeFormula
{
GENERATED_BODY()
/** @brief 生命上限基础值。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Formula")
float MaxHealthBase = 100.0f;
/** @brief 每点体魄提供的生命上限。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Formula")
float MaxHealthVitality = 18.0f;
/** @brief 每点力量提供的生命上限。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Formula")
float MaxHealthStrength = 3.0f;
/** @brief 法力上限基础值。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Formula")
float MaxManaBase = 60.0f;
/** @brief 每点智力提供的法力上限。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Formula")
float MaxManaIntelligence = 12.0f;
/** @brief 每点精神提供的法力上限。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Formula")
float MaxManaSpirit = 6.0f;
/** @brief 耐力上限基础值。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Formula")
float MaxStaminaBase = 80.0f;
/** @brief 每点体魄提供的耐力上限。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Formula")
float MaxStaminaVitality = 5.0f;
/** @brief 每点灵巧提供的耐力上限。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Formula")
float MaxStaminaDexterity = 4.0f;
/** @brief 力量对物理攻击的系数。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Formula")
float PhysicalAttackPowerStrength = 2.0f;
/** @brief 灵巧对物理攻击的系数。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Formula")
float PhysicalAttackPowerDexterity = 0.5f;
/** @brief 智力对法术强度的系数。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Formula")
float SpellPowerIntelligence = 2.0f;
/** @brief 精神对法术强度的系数。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Formula")
float SpellPowerSpirit = 0.4f;
/** @brief 体魄对护甲的系数。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Formula")
float ArmorVitality = 1.2f;
/** @brief 力量对护甲的系数。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Formula")
float ArmorStrength = 0.4f;
/** @brief 精神对魔法抗性的系数。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Formula")
float MagicResistanceSpirit = 1.1f;
/** @brief 智力对魔法抗性的系数。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Formula")
float MagicResistanceIntelligence = 0.3f;
/** @brief 命中基础值。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Formula")
float AccuracyBase = 0.8f;
/** @brief 感知对命中的系数。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Formula")
float AccuracyPerception = 0.006f;
/** @brief 灵巧对命中的系数。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Formula")
float AccuracyDexterity = 0.002f;
/** @brief 闪避基础值。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Formula")
float EvasionBase = 0.03f;
/** @brief 灵巧对闪避的系数。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Formula")
float EvasionDexterity = 0.003f;
/** @brief 感知对闪避的系数。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Formula")
float EvasionPerception = 0.001f;
/** @brief 暴击率基础值。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Formula")
float CriticalChanceBase = 0.05f;
/** @brief 灵巧对暴击率的系数。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Formula")
float CriticalChanceDexterity = 0.002f;
/** @brief 感知对暴击率的系数。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Formula")
float CriticalChancePerception = 0.0015f;
/** @brief 暴击伤害基础倍率。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Formula")
float CriticalDamageBase = 1.5f;
/** @brief 力量对暴击伤害的系数。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Formula")
float CriticalDamageStrength = 0.004f;
/** @brief 感知对暴击伤害的系数。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Formula")
float CriticalDamagePerception = 0.003f;
/** @brief 攻击速度基础倍率。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Formula")
float AttackSpeedBase = 1.0f;
/** @brief 灵巧对攻击速度的系数。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Formula")
float AttackSpeedDexterity = 0.01f;
/** @brief 冷却缩减基础值。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Formula")
float CooldownReductionBase = 0.0f;
/** @brief 智力对冷却缩减的系数。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Formula")
float CooldownReductionIntelligence = 0.0015f;
/** @brief 精神对冷却缩减的系数。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Formula")
float CooldownReductionSpirit = 0.001f;
/** @brief 格挡强度基础值。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Formula")
float BlockPowerBase = 5.0f;
/** @brief 力量对格挡强度的系数。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Formula")
float BlockPowerStrength = 1.2f;
/** @brief 体魄对格挡强度的系数。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Formula")
float BlockPowerVitality = 0.6f;
/** @brief 破防强度基础值。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Formula")
float GuardBreakPowerBase = 5.0f;
/** @brief 力量对破防强度的系数。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Formula")
float GuardBreakPowerStrength = 1.1f;
/** @brief 感知对破防强度的系数。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Formula")
float GuardBreakPowerPerception = 0.4f;
/** @brief 韧性基础值。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Formula")
float PoiseBase = 20.0f;
/** @brief 体魄对韧性的系数。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Formula")
float PoiseVitality = 1.5f;
/** @brief 力量对韧性的系数。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Formula")
float PoiseStrength = 0.5f;
/** @brief 韧性伤害基础值。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Formula")
float PoiseDamageBase = 5.0f;
/** @brief 力量对韧性伤害的系数。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Formula")
float PoiseDamageStrength = 0.8f;
/** @brief 灵巧对韧性伤害的系数。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Formula")
float PoiseDamageDexterity = 0.2f;
};
/**
* @brief 元素属性公式系数。
*/
USTRUCT(BlueprintType)
struct FPHYElementAttributeFormula
{
GENERATED_BODY()
/** @brief 元素伤害加成基础值。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Element")
float DamageBonusBase = 0.0f;
/** @brief 智力对元素伤害加成的系数。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Element")
float DamageBonusIntelligence = 0.0015f;
/** @brief 感知对元素伤害加成的系数。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Element")
float DamageBonusPerception = 0.0005f;
/** @brief 元素抗性基础值。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Element")
float ResistanceBase = 0.02f;
/** @brief 精神对元素抗性的系数。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Element")
float ResistanceSpirit = 0.002f;
/** @brief 体魄对元素抗性的系数。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Element")
float ResistanceVitality = 0.0005f;
/** @brief 通用元素穿透基础值。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Element")
float PenetrationBase = 0.0f;
/** @brief 感知对通用元素穿透的系数。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Element")
float PenetrationPerception = 0.001f;
/** @brief 智力对通用元素穿透的系数。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes|Element")
float PenetrationIntelligence = 0.0005f;
};
/**
* @brief 属性体系配置,首期放入 PHYCombat 以便和战斗公式一起维护。
*/
UCLASS(Config=PHYCombat, DefaultConfig)
class PHY_API UPHYAttributeSettings : public UObject
{
GENERATED_BODY()
public:
/** @brief 基础属性默认初始值。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes")
FPHYCoreAttributeDefaults DefaultCoreAttributes;
/** @brief 次级战斗属性公式。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes")
FPHYCombatAttributeFormula CombatFormula;
/** @brief 元素属性公式。 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Attributes")
FPHYElementAttributeFormula ElementFormula;
};

View File

@@ -0,0 +1,183 @@
// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "AbilitySystem/Attributes/PHYAttributeSet.h"
#include "PHYCombatAttributeSet.generated.h"
class UPHYCoreAttributeSet;
struct FGameplayEffectModCallbackData;
/**
* @brief PHY 次级战斗属性集,由基础属性和装备、效果共同驱动。
*/
UCLASS(BlueprintType)
class PHY_API UPHYCombatAttributeSet : public UAttributeSet
{
GENERATED_BODY()
public:
/** @brief 构造战斗属性并按默认基础属性推导首期数值。 */
UPHYCombatAttributeSet();
/** @brief 注册属性复制。 */
virtual void GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const override;
/** @brief 属性变更前限制百分比和资源范围。 */
virtual void PreAttributeChange(const FGameplayAttribute& Attribute, float& NewValue) override;
/** @brief GameplayEffect 执行后限制资源不超过上限。 */
virtual void PostGameplayEffectExecute(const FGameplayEffectModCallbackData& Data) override;
/** @brief 属性变更后同步当前资源与上限。 */
virtual void PostAttributeChange(const FGameplayAttribute& Attribute, float OldValue, float NewValue) override;
/** @brief 当前生命。 */
UPROPERTY(BlueprintReadOnly, ReplicatedUsing=OnRep_Health, Category="PHY|Attributes|Combat")
FGameplayAttributeData Health;
PHY_ATTRIBUTE_ACCESSORS(UPHYCombatAttributeSet, Health);
/** @brief 生命上限。 */
UPROPERTY(BlueprintReadOnly, ReplicatedUsing=OnRep_MaxHealth, Category="PHY|Attributes|Combat")
FGameplayAttributeData MaxHealth;
PHY_ATTRIBUTE_ACCESSORS(UPHYCombatAttributeSet, MaxHealth);
/** @brief 当前法力。 */
UPROPERTY(BlueprintReadOnly, ReplicatedUsing=OnRep_Mana, Category="PHY|Attributes|Combat")
FGameplayAttributeData Mana;
PHY_ATTRIBUTE_ACCESSORS(UPHYCombatAttributeSet, Mana);
/** @brief 法力上限。 */
UPROPERTY(BlueprintReadOnly, ReplicatedUsing=OnRep_MaxMana, Category="PHY|Attributes|Combat")
FGameplayAttributeData MaxMana;
PHY_ATTRIBUTE_ACCESSORS(UPHYCombatAttributeSet, MaxMana);
/** @brief 当前耐力。 */
UPROPERTY(BlueprintReadOnly, ReplicatedUsing=OnRep_Stamina, Category="PHY|Attributes|Combat")
FGameplayAttributeData Stamina;
PHY_ATTRIBUTE_ACCESSORS(UPHYCombatAttributeSet, Stamina);
/** @brief 耐力上限。 */
UPROPERTY(BlueprintReadOnly, ReplicatedUsing=OnRep_MaxStamina, Category="PHY|Attributes|Combat")
FGameplayAttributeData MaxStamina;
PHY_ATTRIBUTE_ACCESSORS(UPHYCombatAttributeSet, MaxStamina);
/** @brief 物理攻击强度。 */
UPROPERTY(BlueprintReadOnly, ReplicatedUsing=OnRep_PhysicalAttackPower, Category="PHY|Attributes|Combat")
FGameplayAttributeData PhysicalAttackPower;
PHY_ATTRIBUTE_ACCESSORS(UPHYCombatAttributeSet, PhysicalAttackPower);
/** @brief 法术强度。 */
UPROPERTY(BlueprintReadOnly, ReplicatedUsing=OnRep_SpellPower, Category="PHY|Attributes|Combat")
FGameplayAttributeData SpellPower;
PHY_ATTRIBUTE_ACCESSORS(UPHYCombatAttributeSet, SpellPower);
/** @brief 护甲。 */
UPROPERTY(BlueprintReadOnly, ReplicatedUsing=OnRep_Armor, Category="PHY|Attributes|Combat")
FGameplayAttributeData Armor;
PHY_ATTRIBUTE_ACCESSORS(UPHYCombatAttributeSet, Armor);
/** @brief 魔法抗性。 */
UPROPERTY(BlueprintReadOnly, ReplicatedUsing=OnRep_MagicResistance, Category="PHY|Attributes|Combat")
FGameplayAttributeData MagicResistance;
PHY_ATTRIBUTE_ACCESSORS(UPHYCombatAttributeSet, MagicResistance);
/** @brief 命中率,通常作为 0 到 1 的比例使用。 */
UPROPERTY(BlueprintReadOnly, ReplicatedUsing=OnRep_Accuracy, Category="PHY|Attributes|Combat")
FGameplayAttributeData Accuracy;
PHY_ATTRIBUTE_ACCESSORS(UPHYCombatAttributeSet, Accuracy);
/** @brief 闪避率,通常作为 0 到 1 的比例使用。 */
UPROPERTY(BlueprintReadOnly, ReplicatedUsing=OnRep_Evasion, Category="PHY|Attributes|Combat")
FGameplayAttributeData Evasion;
PHY_ATTRIBUTE_ACCESSORS(UPHYCombatAttributeSet, Evasion);
/** @brief 暴击率,通常作为 0 到 1 的比例使用。 */
UPROPERTY(BlueprintReadOnly, ReplicatedUsing=OnRep_CriticalChance, Category="PHY|Attributes|Combat")
FGameplayAttributeData CriticalChance;
PHY_ATTRIBUTE_ACCESSORS(UPHYCombatAttributeSet, CriticalChance);
/** @brief 暴击伤害倍率1.5 表示 150% 伤害。 */
UPROPERTY(BlueprintReadOnly, ReplicatedUsing=OnRep_CriticalDamage, Category="PHY|Attributes|Combat")
FGameplayAttributeData CriticalDamage;
PHY_ATTRIBUTE_ACCESSORS(UPHYCombatAttributeSet, CriticalDamage);
/** @brief 攻击速度倍率。 */
UPROPERTY(BlueprintReadOnly, ReplicatedUsing=OnRep_AttackSpeed, Category="PHY|Attributes|Combat")
FGameplayAttributeData AttackSpeed;
PHY_ATTRIBUTE_ACCESSORS(UPHYCombatAttributeSet, AttackSpeed);
/** @brief 冷却缩减比例。 */
UPROPERTY(BlueprintReadOnly, ReplicatedUsing=OnRep_CooldownReduction, Category="PHY|Attributes|Combat")
FGameplayAttributeData CooldownReduction;
PHY_ATTRIBUTE_ACCESSORS(UPHYCombatAttributeSet, CooldownReduction);
/** @brief 格挡强度。 */
UPROPERTY(BlueprintReadOnly, ReplicatedUsing=OnRep_BlockPower, Category="PHY|Attributes|Combat")
FGameplayAttributeData BlockPower;
PHY_ATTRIBUTE_ACCESSORS(UPHYCombatAttributeSet, BlockPower);
/** @brief 破防强度。 */
UPROPERTY(BlueprintReadOnly, ReplicatedUsing=OnRep_GuardBreakPower, Category="PHY|Attributes|Combat")
FGameplayAttributeData GuardBreakPower;
PHY_ATTRIBUTE_ACCESSORS(UPHYCombatAttributeSet, GuardBreakPower);
/** @brief 韧性。 */
UPROPERTY(BlueprintReadOnly, ReplicatedUsing=OnRep_Poise, Category="PHY|Attributes|Combat")
FGameplayAttributeData Poise;
PHY_ATTRIBUTE_ACCESSORS(UPHYCombatAttributeSet, Poise);
/** @brief 韧性伤害。 */
UPROPERTY(BlueprintReadOnly, ReplicatedUsing=OnRep_PoiseDamage, Category="PHY|Attributes|Combat")
FGameplayAttributeData PoiseDamage;
PHY_ATTRIBUTE_ACCESSORS(UPHYCombatAttributeSet, PoiseDamage);
/** @brief 按默认配置中的基础属性计算并写入次级属性。 */
void InitializeFromConfiguredCoreDefaults();
/** @brief 按指定基础属性集计算并写入次级属性。 */
void InitializeFromCoreAttributes(const UPHYCoreAttributeSet* CoreAttributes);
protected:
/** @brief 复制当前生命变化。 */
UFUNCTION() void OnRep_Health(const FGameplayAttributeData& OldValue);
/** @brief 复制生命上限变化。 */
UFUNCTION() void OnRep_MaxHealth(const FGameplayAttributeData& OldValue);
/** @brief 复制当前法力变化。 */
UFUNCTION() void OnRep_Mana(const FGameplayAttributeData& OldValue);
/** @brief 复制法力上限变化。 */
UFUNCTION() void OnRep_MaxMana(const FGameplayAttributeData& OldValue);
/** @brief 复制当前耐力变化。 */
UFUNCTION() void OnRep_Stamina(const FGameplayAttributeData& OldValue);
/** @brief 复制耐力上限变化。 */
UFUNCTION() void OnRep_MaxStamina(const FGameplayAttributeData& OldValue);
/** @brief 复制物理攻击强度变化。 */
UFUNCTION() void OnRep_PhysicalAttackPower(const FGameplayAttributeData& OldValue);
/** @brief 复制法术强度变化。 */
UFUNCTION() void OnRep_SpellPower(const FGameplayAttributeData& OldValue);
/** @brief 复制护甲变化。 */
UFUNCTION() void OnRep_Armor(const FGameplayAttributeData& OldValue);
/** @brief 复制魔法抗性变化。 */
UFUNCTION() void OnRep_MagicResistance(const FGameplayAttributeData& OldValue);
/** @brief 复制命中率变化。 */
UFUNCTION() void OnRep_Accuracy(const FGameplayAttributeData& OldValue);
/** @brief 复制闪避率变化。 */
UFUNCTION() void OnRep_Evasion(const FGameplayAttributeData& OldValue);
/** @brief 复制暴击率变化。 */
UFUNCTION() void OnRep_CriticalChance(const FGameplayAttributeData& OldValue);
/** @brief 复制暴击伤害倍率变化。 */
UFUNCTION() void OnRep_CriticalDamage(const FGameplayAttributeData& OldValue);
/** @brief 复制攻击速度倍率变化。 */
UFUNCTION() void OnRep_AttackSpeed(const FGameplayAttributeData& OldValue);
/** @brief 复制冷却缩减比例变化。 */
UFUNCTION() void OnRep_CooldownReduction(const FGameplayAttributeData& OldValue);
/** @brief 复制格挡强度变化。 */
UFUNCTION() void OnRep_BlockPower(const FGameplayAttributeData& OldValue);
/** @brief 复制破防强度变化。 */
UFUNCTION() void OnRep_GuardBreakPower(const FGameplayAttributeData& OldValue);
/** @brief 复制韧性变化。 */
UFUNCTION() void OnRep_Poise(const FGameplayAttributeData& OldValue);
/** @brief 复制韧性伤害变化。 */
UFUNCTION() void OnRep_PoiseDamage(const FGameplayAttributeData& OldValue);
};

View File

@@ -0,0 +1,78 @@
// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "AbilitySystem/Attributes/PHYAttributeSet.h"
#include "PHYCoreAttributeSet.generated.h"
/**
* @brief PHY 基础属性集,作为所有玩家和 AI 的通用根属性。
*/
UCLASS(BlueprintType)
class PHY_API UPHYCoreAttributeSet : public UAttributeSet
{
GENERATED_BODY()
public:
/** @brief 构造基础属性并读取默认配置。 */
UPHYCoreAttributeSet();
/** @brief 注册属性复制。 */
virtual void GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const override;
/** @brief 力量,影响物理攻击、格挡、破防和负重倾向。 */
UPROPERTY(BlueprintReadOnly, ReplicatedUsing=OnRep_Strength, Category="PHY|Attributes|Core")
FGameplayAttributeData Strength;
PHY_ATTRIBUTE_ACCESSORS(UPHYCoreAttributeSet, Strength);
/** @brief 灵巧,影响暴击、攻速、命中和闪避倾向。 */
UPROPERTY(BlueprintReadOnly, ReplicatedUsing=OnRep_Dexterity, Category="PHY|Attributes|Core")
FGameplayAttributeData Dexterity;
PHY_ATTRIBUTE_ACCESSORS(UPHYCoreAttributeSet, Dexterity);
/** @brief 体魄,影响生命、护甲、耐力和韧性倾向。 */
UPROPERTY(BlueprintReadOnly, ReplicatedUsing=OnRep_Vitality, Category="PHY|Attributes|Core")
FGameplayAttributeData Vitality;
PHY_ATTRIBUTE_ACCESSORS(UPHYCoreAttributeSet, Vitality);
/** @brief 智力,影响法术强度、法力和冷却缩减倾向。 */
UPROPERTY(BlueprintReadOnly, ReplicatedUsing=OnRep_Intelligence, Category="PHY|Attributes|Core")
FGameplayAttributeData Intelligence;
PHY_ATTRIBUTE_ACCESSORS(UPHYCoreAttributeSet, Intelligence);
/** @brief 精神,影响法力、魔法抗性和元素抗性倾向。 */
UPROPERTY(BlueprintReadOnly, ReplicatedUsing=OnRep_Spirit, Category="PHY|Attributes|Core")
FGameplayAttributeData Spirit;
PHY_ATTRIBUTE_ACCESSORS(UPHYCoreAttributeSet, Spirit);
/** @brief 感知,影响命中、暴击、弱点和穿透倾向。 */
UPROPERTY(BlueprintReadOnly, ReplicatedUsing=OnRep_Perception, Category="PHY|Attributes|Core")
FGameplayAttributeData Perception;
PHY_ATTRIBUTE_ACCESSORS(UPHYCoreAttributeSet, Perception);
protected:
/** @brief 复制力量。 */
UFUNCTION()
void OnRep_Strength(const FGameplayAttributeData& OldValue);
/** @brief 复制灵巧。 */
UFUNCTION()
void OnRep_Dexterity(const FGameplayAttributeData& OldValue);
/** @brief 复制体魄。 */
UFUNCTION()
void OnRep_Vitality(const FGameplayAttributeData& OldValue);
/** @brief 复制智力。 */
UFUNCTION()
void OnRep_Intelligence(const FGameplayAttributeData& OldValue);
/** @brief 复制精神。 */
UFUNCTION()
void OnRep_Spirit(const FGameplayAttributeData& OldValue);
/** @brief 复制感知。 */
UFUNCTION()
void OnRep_Perception(const FGameplayAttributeData& OldValue);
};

View File

@@ -0,0 +1,155 @@
// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "AbilitySystem/Attributes/PHYAttributeSet.h"
#include "PHYElementAttributeSet.generated.h"
class UPHYCoreAttributeSet;
/**
* @brief PHY 元素进攻与防御属性集。
*/
UCLASS(BlueprintType)
class PHY_API UPHYElementAttributeSet : public UAttributeSet
{
GENERATED_BODY()
public:
/** @brief 构造元素属性并按默认基础属性推导首期数值。 */
UPHYElementAttributeSet();
/** @brief 注册属性复制。 */
virtual void GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const override;
/** @brief 限制元素比例属性范围。 */
virtual void PreAttributeChange(const FGameplayAttribute& Attribute, float& NewValue) override;
/** @brief 按默认配置中的基础属性计算并写入元素属性。 */
void InitializeFromConfiguredCoreDefaults();
/** @brief 按指定基础属性集计算并写入元素属性。 */
void InitializeFromCoreAttributes(const UPHYCoreAttributeSet* CoreAttributes);
/** @brief 火元素伤害加成。 */
UPROPERTY(BlueprintReadOnly, ReplicatedUsing=OnRep_FireDamageBonus, Category="PHY|Attributes|Element")
FGameplayAttributeData FireDamageBonus;
PHY_ATTRIBUTE_ACCESSORS(UPHYElementAttributeSet, FireDamageBonus);
/** @brief 水元素伤害加成。 */
UPROPERTY(BlueprintReadOnly, ReplicatedUsing=OnRep_WaterDamageBonus, Category="PHY|Attributes|Element")
FGameplayAttributeData WaterDamageBonus;
PHY_ATTRIBUTE_ACCESSORS(UPHYElementAttributeSet, WaterDamageBonus);
/** @brief 冰元素伤害加成。 */
UPROPERTY(BlueprintReadOnly, ReplicatedUsing=OnRep_IceDamageBonus, Category="PHY|Attributes|Element")
FGameplayAttributeData IceDamageBonus;
PHY_ATTRIBUTE_ACCESSORS(UPHYElementAttributeSet, IceDamageBonus);
/** @brief 雷元素伤害加成。 */
UPROPERTY(BlueprintReadOnly, ReplicatedUsing=OnRep_LightningDamageBonus, Category="PHY|Attributes|Element")
FGameplayAttributeData LightningDamageBonus;
PHY_ATTRIBUTE_ACCESSORS(UPHYElementAttributeSet, LightningDamageBonus);
/** @brief 地元素伤害加成。 */
UPROPERTY(BlueprintReadOnly, ReplicatedUsing=OnRep_EarthDamageBonus, Category="PHY|Attributes|Element")
FGameplayAttributeData EarthDamageBonus;
PHY_ATTRIBUTE_ACCESSORS(UPHYElementAttributeSet, EarthDamageBonus);
/** @brief 风元素伤害加成。 */
UPROPERTY(BlueprintReadOnly, ReplicatedUsing=OnRep_WindDamageBonus, Category="PHY|Attributes|Element")
FGameplayAttributeData WindDamageBonus;
PHY_ATTRIBUTE_ACCESSORS(UPHYElementAttributeSet, WindDamageBonus);
/** @brief 光元素伤害加成。 */
UPROPERTY(BlueprintReadOnly, ReplicatedUsing=OnRep_LightDamageBonus, Category="PHY|Attributes|Element")
FGameplayAttributeData LightDamageBonus;
PHY_ATTRIBUTE_ACCESSORS(UPHYElementAttributeSet, LightDamageBonus);
/** @brief 暗元素伤害加成。 */
UPROPERTY(BlueprintReadOnly, ReplicatedUsing=OnRep_DarkDamageBonus, Category="PHY|Attributes|Element")
FGameplayAttributeData DarkDamageBonus;
PHY_ATTRIBUTE_ACCESSORS(UPHYElementAttributeSet, DarkDamageBonus);
/** @brief 火元素抗性。 */
UPROPERTY(BlueprintReadOnly, ReplicatedUsing=OnRep_FireResistance, Category="PHY|Attributes|Element")
FGameplayAttributeData FireResistance;
PHY_ATTRIBUTE_ACCESSORS(UPHYElementAttributeSet, FireResistance);
/** @brief 水元素抗性。 */
UPROPERTY(BlueprintReadOnly, ReplicatedUsing=OnRep_WaterResistance, Category="PHY|Attributes|Element")
FGameplayAttributeData WaterResistance;
PHY_ATTRIBUTE_ACCESSORS(UPHYElementAttributeSet, WaterResistance);
/** @brief 冰元素抗性。 */
UPROPERTY(BlueprintReadOnly, ReplicatedUsing=OnRep_IceResistance, Category="PHY|Attributes|Element")
FGameplayAttributeData IceResistance;
PHY_ATTRIBUTE_ACCESSORS(UPHYElementAttributeSet, IceResistance);
/** @brief 雷元素抗性。 */
UPROPERTY(BlueprintReadOnly, ReplicatedUsing=OnRep_LightningResistance, Category="PHY|Attributes|Element")
FGameplayAttributeData LightningResistance;
PHY_ATTRIBUTE_ACCESSORS(UPHYElementAttributeSet, LightningResistance);
/** @brief 地元素抗性。 */
UPROPERTY(BlueprintReadOnly, ReplicatedUsing=OnRep_EarthResistance, Category="PHY|Attributes|Element")
FGameplayAttributeData EarthResistance;
PHY_ATTRIBUTE_ACCESSORS(UPHYElementAttributeSet, EarthResistance);
/** @brief 风元素抗性。 */
UPROPERTY(BlueprintReadOnly, ReplicatedUsing=OnRep_WindResistance, Category="PHY|Attributes|Element")
FGameplayAttributeData WindResistance;
PHY_ATTRIBUTE_ACCESSORS(UPHYElementAttributeSet, WindResistance);
/** @brief 光元素抗性。 */
UPROPERTY(BlueprintReadOnly, ReplicatedUsing=OnRep_LightResistance, Category="PHY|Attributes|Element")
FGameplayAttributeData LightResistance;
PHY_ATTRIBUTE_ACCESSORS(UPHYElementAttributeSet, LightResistance);
/** @brief 暗元素抗性。 */
UPROPERTY(BlueprintReadOnly, ReplicatedUsing=OnRep_DarkResistance, Category="PHY|Attributes|Element")
FGameplayAttributeData DarkResistance;
PHY_ATTRIBUTE_ACCESSORS(UPHYElementAttributeSet, DarkResistance);
/** @brief 通用元素穿透,首期不按元素拆分。 */
UPROPERTY(BlueprintReadOnly, ReplicatedUsing=OnRep_ElementPenetration, Category="PHY|Attributes|Element")
FGameplayAttributeData ElementPenetration;
PHY_ATTRIBUTE_ACCESSORS(UPHYElementAttributeSet, ElementPenetration);
protected:
/** @brief 复制火元素伤害加成变化。 */
UFUNCTION() void OnRep_FireDamageBonus(const FGameplayAttributeData& OldValue);
/** @brief 复制水元素伤害加成变化。 */
UFUNCTION() void OnRep_WaterDamageBonus(const FGameplayAttributeData& OldValue);
/** @brief 复制冰元素伤害加成变化。 */
UFUNCTION() void OnRep_IceDamageBonus(const FGameplayAttributeData& OldValue);
/** @brief 复制雷元素伤害加成变化。 */
UFUNCTION() void OnRep_LightningDamageBonus(const FGameplayAttributeData& OldValue);
/** @brief 复制地元素伤害加成变化。 */
UFUNCTION() void OnRep_EarthDamageBonus(const FGameplayAttributeData& OldValue);
/** @brief 复制风元素伤害加成变化。 */
UFUNCTION() void OnRep_WindDamageBonus(const FGameplayAttributeData& OldValue);
/** @brief 复制光元素伤害加成变化。 */
UFUNCTION() void OnRep_LightDamageBonus(const FGameplayAttributeData& OldValue);
/** @brief 复制暗元素伤害加成变化。 */
UFUNCTION() void OnRep_DarkDamageBonus(const FGameplayAttributeData& OldValue);
/** @brief 复制火元素抗性变化。 */
UFUNCTION() void OnRep_FireResistance(const FGameplayAttributeData& OldValue);
/** @brief 复制水元素抗性变化。 */
UFUNCTION() void OnRep_WaterResistance(const FGameplayAttributeData& OldValue);
/** @brief 复制冰元素抗性变化。 */
UFUNCTION() void OnRep_IceResistance(const FGameplayAttributeData& OldValue);
/** @brief 复制雷元素抗性变化。 */
UFUNCTION() void OnRep_LightningResistance(const FGameplayAttributeData& OldValue);
/** @brief 复制地元素抗性变化。 */
UFUNCTION() void OnRep_EarthResistance(const FGameplayAttributeData& OldValue);
/** @brief 复制风元素抗性变化。 */
UFUNCTION() void OnRep_WindResistance(const FGameplayAttributeData& OldValue);
/** @brief 复制光元素抗性变化。 */
UFUNCTION() void OnRep_LightResistance(const FGameplayAttributeData& OldValue);
/** @brief 复制暗元素抗性变化。 */
UFUNCTION() void OnRep_DarkResistance(const FGameplayAttributeData& OldValue);
/** @brief 复制通用元素穿透变化。 */
UFUNCTION() void OnRep_ElementPenetration(const FGameplayAttributeData& OldValue);
};