本篇文章主要参考EPIC商场的RPG游戏demo。实现GE计算中使用自定义的Calculation Class
新建Attribute
打开AttributeSetBase.h/cpp,增加两个属性Damage和Armor,方法和之前的一样,这里就直接贴代码了。
UCLASS()
class GAS_LEARN_API UAttributeSetBase : public UAttributeSet
{
GENERATED_BODY()
public:
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Attributes", ReplicatedUsing=OnRep_Damage)
FGameplayAttributeData Damage;
ATTRIBUTE_ACCESSORS(UAttributeSetBase, Damage);
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Attributes", ReplicatedUsing=OnRep_Armor)
FGameplayAttributeData Armor;
ATTRIBUTE_ACCESSORS(UAttributeSetBase, Armor);
UFUNCTION()
virtual void OnRep_Damage(const FGameplayAttributeData& OldDamage);
UFUNCTION()
virtual void OnRep_Armor(const FGameplayAttributeData& OldArmor);
};
void UAttributeSetBase::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
{
Super::GetLifetimeReplicatedProps(OutLifetimeProps);
DOREPLIFETIME_CONDITION_NOTIFY(UAttributeSetBase, Damage, COND_None, REPNOTIFY_Always);
DOREPLIFETIME_CONDITION_NOTIFY(UAttributeSetBase, Armor, COND_None, REPNOTIFY_Always);
}
void UAttributeSetBase::OnRep_Damage(const FGameplayAttributeData& OldDamage)
{
GAMEPLAYATTRIBUTE_REPNOTIFY(UAttributeSetBase, Damage, OldDamage);
}
void UAttributeSetBase::OnRep_Armor(const FGameplayAttributeData& OldArmor)
{
GAMEPLAYATTRIBUTE_REPNOTIFY(UAttributeSetBase, Armor, OldArmor);
}
初始化两个属性。
打开之前创建的DataTable。可能有人没有看过之前的文章,这里我再贴一次流程图。
打开角色蓝图的ASC的Default Settings。
如果不想用DataTable,也可以使用一个gameplay effect赋初值。
然后通过ApplyGameplayEffectToSelf来赋初值。
Custom Calculation Class
新建类
这里我命名为GMM_DamageExecutionCalculation。
实现
打开GMM_DamageExecutionCalculation.h。
这里通过重写方法CalculateBaseMagnitude_Implementation,返回的float值即为计算得到的Magnitude,用于修改指定的Attribute。
UCLASS(