ipv6跟做网站有关吗潍坊网站网站建设
- 作者: 多梦笔记
- 时间: 2026年02月17日 02:39
当前位置: 首页 > news >正文
ipv6跟做网站有关吗,潍坊网站网站建设,腾讯云国外服务器,百度知道山东网站建设在正常的RPG游戏中#xff0c;都存在一个类别就是属性伤害#xff0c;比如#xff0c;在一个游戏里面有一个火属性的技能#xff0c;它造成的伤害就是火属性类型的#xff0c;并且它还有可能有附加伤害#xff0c;比如给予目标一个灼烧效果#xff0c;每秒造成多少的火属…在正常的RPG游戏中都存在一个类别就是属性伤害比如在一个游戏里面有一个火属性的技能它造成的伤害就是火属性类型的并且它还有可能有附加伤害比如给予目标一个灼烧效果每秒造成多少的火属性伤害。目标角色会有一个火属性伤害抵抗根据百分比减少伤害。 比如英雄联盟技能伤害区分物理伤害和魔法伤害有些技能能够造成两种伤害比如卡特和永恩。 接下来我们为游戏的伤害增加属性。
增加新的技能类
首先我们基于自定义的技能类创建一个派生的子类专门用于处理具有伤害的技能。基类作为所有技能的基类有可能技能时回血的那么它的伤害相应的属性是使用不到的属于浪费。 取名为RPGDamageGameplayAbility 专门用于处理伤害的技能的基类 记得将投掷技能释放物的类继承修改掉 将设置伤害的GE配置项从UProjectileSpell里面移到伤害类并将基类上的伤害设置删除掉为了能够让技能实现多种类型的伤害我们通过一个Map来创建一个配置可以在Map中设置多种伤害类型并设置对应需造成的伤害。
增加对应的属性抗性标签
既然要增加伤害的类型我们则需要增加对应的伤害类型以及类型抗性 打开我们之前在C创建标签的文件RPGGameplayTags.h先增加伤害类型 FGameplayTag Damage; //伤害 标签FGameplayTag Damage_Fire; //火属性伤害 标签FGameplayTag Damage_Lightning; //雷属性伤害 标签FGameplayTag Damage_Arcane; //魔法伤害 标签FGameplayTag Damage_Physical; //物理伤害 标签在cpp文件中增加标签注册 GameplayTags.Damage UGameplayTagsManager::Get().AddNativeGameplayTag(FName(Damage),FString(伤害标签));GameplayTags.Damage_Fire UGameplayTagsManager::Get().AddNativeGameplayTag(FName(Damage.Fire),FString(火属性伤害));GameplayTags.Damage_Lightning UGameplayTagsManager::Get().AddNativeGameplayTag(FName(Damage.Lightning),FString(雷属性伤害));GameplayTags.Damage_Arcane UGameplayTagsManager::Get().AddNativeGameplayTag(FName(Damage.Arcane),FString(魔法伤害));GameplayTags.Damage_Physical UGameplayTagsManager::Get().AddNativeGameplayTag(FName(Damage.Physical),FString(物理伤害));然后增加抗性标签 //属性伤害抗性FGameplayTag Attributes_Resistance_Fire; //火属性伤害抵抗 标签FGameplayTag Attributes_Resistance_Lightning; //雷属性伤害抵抗 标签FGameplayTag Attributes_Resistance_Arcane; //魔法伤害抵抗 标签FGameplayTag Attributes_Resistance_Physical; //物理伤害抵抗 标签并注册 /* 属性抗性标签 /GameplayTags.Attributes_Resistance_Fire UGameplayTagsManager::Get().AddNativeGameplayTag(FName(Resistance.Fire),FString(火属性抗性));GameplayTags.Attributes_Resistance_Lightning UGameplayTagsManager::Get().AddNativeGameplayTag(FName(Resistance.Lightning),FString(雷属性抗性));GameplayTags.Attributes_Resistance_Arcane UGameplayTagsManager::Get().AddNativeGameplayTag(FName(Resistance.Arcane),FString(魔法伤害抗性));GameplayTags.Attributes_Resistance_Physical UGameplayTagsManager::Get().AddNativeGameplayTag(FName(Resistance.Physical),FString(物理伤害抗性));设置完成伤害类型和对应的抗性标签后我们还需要将其对应起来我们增加一个Map标签
TMapFGameplayTag, FGameplayTag DamageTypesToResistance; //属性伤害标签对应属性抵抗标签并在注册完成后将其一一对应起来 / 将属性和抗性标签对应 /GameplayTags.DamageTypesToResistance.Add(GameplayTags.Damage_Fire, GameplayTags.Attributes_Resistance_Fire);GameplayTags.DamageTypesToResistance.Add(GameplayTags.Damage_Lightning, GameplayTags.Attributes_Resistance_Lightning);GameplayTags.DamageTypesToResistance.Add(GameplayTags.Damage_Arcane, GameplayTags.Attributes_Resistance_Arcane);GameplayTags.DamageTypesToResistance.Add(GameplayTags.Damage_Physical, GameplayTags.Attributes_Resistance_Physical);这样就完成了标签的添加。
增加抗性属性
标签添加完成我们还需要在AttributeSet里面增加对应的抗性属性用于记录当前角色抗性值如果想完整的查看请查看此文章 20. UE5 RPG创建次级属性并实现设置下面我们快速实现抗性属性的添加。 /** 属性伤害抗性/UPROPERTY(BlueprintReadOnly, ReplicatedUsing OnRep_FireResistance, CategoryResistance Attributes)FGameplayAttributeData FireResistance; // 火属性抗性ATTRIBUTE_ACCESSORS(URPGAttributeSet, FireResistance);UPROPERTY(BlueprintReadOnly, ReplicatedUsing OnRep_LightningResistance, CategoryResistance Attributes)FGameplayAttributeData LightningResistance; // 雷属性抗性ATTRIBUTE_ACCESSORS(URPGAttributeSet, LightningResistance);UPROPERTY(BlueprintReadOnly, ReplicatedUsing OnRep_ArcaneResistance, CategoryResistance Attributes)FGameplayAttributeData ArcaneResistance; // 魔法抗性ATTRIBUTE_ACCESSORS(URPGAttributeSet, ArcaneResistance);UPROPERTY(BlueprintReadOnly, ReplicatedUsing OnRep_PhysicalResistance, CategoryResistance Attributes)FGameplayAttributeData PhysicalResistance; // 物理抗性ATTRIBUTE_ACCESSORS(URPGAttributeSet, PhysicalResistance);然后增加对应的复制函数 UFUNCTION()void OnRep_FireResistance(const FGameplayAttributeData OldFireResistance) const;UFUNCTION()void OnRep_LightningResistance(const FGameplayAttributeData OldLightningResistance) const;UFUNCTION()void OnRep_ArcaneResistance(const FGameplayAttributeData OldArcaneResistance) const;UFUNCTION()void OnRep_PhysicalResistance(const FGameplayAttributeData OldPhysicalResistance) const;在cpp中实现复制函数
void URPGAttributeSet::OnRep_FireResistance(const FGameplayAttributeData OldFireResistance) const
{GAMEPLAYATTRIBUTE_REPNOTIFY(URPGAttributeSet, FireResistance, OldFireResistance);
}void URPGAttributeSet::OnRep_LightningResistance(const FGameplayAttributeData OldLightningResistance) const
{GAMEPLAYATTRIBUTE_REPNOTIFY(URPGAttributeSet, LightningResistance, OldLightningResistance);
}void URPGAttributeSet::OnRep_ArcaneResistance(const FGameplayAttributeData OldArcaneResistance) const
{GAMEPLAYATTRIBUTE_REPNOTIFY(URPGAttributeSet, ArcaneResistance, OldArcaneResistance);
}void URPGAttributeSet::OnRep_PhysicalResistance(const FGameplayAttributeData OldPhysicalResistance) const
{GAMEPLAYATTRIBUTE_REPNOTIFY(URPGAttributeSet, PhysicalResistance, OldPhysicalResistance);
}在同步时设置同步
void URPGAttributeSet::GetLifetimeReplicatedProps(TArrayFLifetimeProperty OutLifetimeProps) const
{Super::GetLifetimeReplicatedProps(OutLifetimeProps);…//抗性属性DOREPLIFETIME_CONDITION_NOTIFY(URPGAttributeSet, FireResistance, COND_None, REPNOTIFY_Always);DOREPLIFETIME_CONDITION_NOTIFY(URPGAttributeSet, LightningResistance, COND_None, REPNOTIFY_Always);DOREPLIFETIME_CONDITION_NOTIFY(URPGAttributeSet, ArcaneResistance, COND_None, REPNOTIFY_Always);DOREPLIFETIME_CONDITION_NOTIFY(URPGAttributeSet, PhysicalResistance, COND_None, REPNOTIFY_Always);…
}在初始化时将标签和属性对应
URPGAttributeSet::URPGAttributeSet()
{const FRPGGameplayTags GameplayTags FRPGGameplayTags::Get();//————————————————属性标签和属性关联————————————————…/** Resistance Attribute*/TagsToAttributes.Add(GameplayTags.Attributes_Resistance_Fire, GetFireResistanceAttribute);TagsToAttributes.Add(GameplayTags.Attributes_Resistance_Lightning, GetLightningResistanceAttribute);TagsToAttributes.Add(GameplayTags.Attributes_Resistance_Arcane, GetArcaneResistanceAttribute);TagsToAttributes.Add(GameplayTags.Attributes_Resistance_Physical, GetPhysicalResistanceAttribute);
}这样就完成的属性标签的创建。
在UI上面显示抗性值
接下来我们要在UI面板显示角色的对不同类型的伤害的抗性值。如果查看UI面板的具体实现看我之前的文章23. UE5 RPG制作属性面板一 首先我们在设置角色次级属性的GE里面增加对应的计算 这里我设置的火属性抗性和雷属性抗性都是基于加的抗性点来实现 而魔法抗性和物理抗性则基于智力和护甲值来设置这里我也是随便填写的数值用于测试就不截全了。在实际项目中这个计算通常需要策划的配合。 我们还需要在DA_AttributeInfo文件中增加对应在UI上显示的标签对应的名称和描述它是被设置在BP_AttributeMenuController上面的实现这个也是方便属性列表设置时我们只需要在列表上面设置标签名称函数会帮我们实现下面的工作。 然后就是打开UI用户空间在属性列表增加四个子项用于显示抗性数值。 通过我们之前的设置现在只需要修改标签其它的工作就不用做了 接着运行项目查看UI上面是否正确的显示了对应的属性
实现伤害类型的计算
首先我们要重新设置技能伤害并设置类型比如我们创建的火属性类型技能伤害是火属性的我们设置火属性伤害标签并设置上对应的伤害 接下来就需要去代码里将逻辑重新修改掉。 在生成发射物的技能类里我们创建GE的地方将属性的伤害通过SetByCaller方式设置给GE 我们可以遍历将在技能列表上设置的所有的属性类型和伤害设置过去。
//设置技能伤害 SetByCaller获取 通过Tag
const FRPGGameplayTags GameplayTags FRPGGameplayTags::Get(); //获取标签单例
for(auto Pair : DamageTypes)
{const float ScaledDamage Pair.Value.GetValueAtLevel(GetAbilityLevel()); //根据等级获取技能伤害UAbilitySystemBlueprintLibrary::AssignTagSetByCallerMagnitude(SpecHandle, Pair.Key, ScaledDamage);
}设置属性伤害就算完成了接下来我们转到ExecCalc_Damage.cpp文件里增加对目标的属性获取 首先在静态实例类里面增加对抗性属性设置
struct SDamageStatics
{…DECLARE_ATTRIBUTE_CAPTUREDEF(FireResistance);DECLARE_ATTRIBUTE_CAPTUREDEF(LightningResistance);DECLARE_ATTRIBUTE_CAPTUREDEF(ArcaneResistance);DECLARE_ATTRIBUTE_CAPTUREDEF(PhysicalResistance);SDamageStatics(){//参数1.属性集 2.属性名 3.目标还是自身 4.是否设置快照true为创建时获取false为应用时获取…DEFINE_ATTRIBUTE_CAPTUREDEF(URPGAttributeSet, FireResistance, Target, false);DEFINE_ATTRIBUTE_CAPTUREDEF(URPGAttributeSet, LightningResistance, Target, false);DEFINE_ATTRIBUTE_CAPTUREDEF(URPGAttributeSet, ArcaneResistance, Target, false);DEFINE_ATTRIBUTE_CAPTUREDEF(URPGAttributeSet, PhysicalResistance, Target, false);}
};然后在构造时将参数添加到捕获列表中
UExecCalc_Damage::UExecCalc_Damage()
{//添加监听…RelevantAttributesToCapture.Add(DamageStatics().FireResistanceDef);RelevantAttributesToCapture.Add(DamageStatics().LightningResistanceDef);RelevantAttributesToCapture.Add(DamageStatics().ArcaneResistanceDef);RelevantAttributesToCapture.Add(DamageStatics().PhysicalResistanceDef);
}我本来想把Map写到静态实例类里发现在代码的运行过程中单例实例创建时标签还没有设置成功这就导致在单例实例里面无法获取到标签所以我转到了Execute_Implementation函数中创建Map的原因是我们这样就不需要在for循环中进行二次遍历了只需要通过Map获取对应的Value即可。 //存储标签和属性快照对应的MapTMapFGameplayTag, FGameplayEffectAttributeCaptureDefinition TagsToCaptureDefs;//添加标签和属性快照对应的数据TagsToCaptureDefs.Add(GameplayTags.Attributes_Resistance_Fire, DamageStatics().FireResistanceDef);TagsToCaptureDefs.Add(GameplayTags.Attributes_Resistance_Lightning, DamageStatics().LightningResistanceDef);TagsToCaptureDefs.Add(GameplayTags.Attributes_Resistance_Arcane, DamageStatics().ArcaneResistanceDef);TagsToCaptureDefs.Add(GameplayTags.Attributes_Resistance_Physical, DamageStatics().PhysicalResistanceDef);由于我们在函数内无法获取技能设置了几种伤害类型和伤害所以我们要把所有的类型都遍历到所以我们从标签单例中获取到伤害类型和抵抗类型的对照标签Map并将其遍历
for(const TTupleFGameplayTag, FGameplayTag Pair : GameplayTags.DamageTypesToResistance)然后通过抗性类型的标签去获取快照引用
const FGameplayTag DamageType Pair.Key;
const FGameplayTag ResistanceType Pair.Value;
//检查对应的属性快照是否设置防止报错
checkf(TagsToCaptureDefs.Contains(ResistanceType), TEXT(在ExecCalc_Damage中无法获取到Tag[%s]对应的属性快照), *ResistanceType.ToString());
//通过抗性标签获取到属性快照
const FGameplayEffectAttributeCaptureDefinition CaptureDef TagsToCaptureDefs[ResistanceType];获取到快照了我们可以通过快照去获取目标的抗性值这里限制到0-100是防止预算出错超一百了会出现攻击负值的情况应用到角色那就是加血了。
//获取抗性值
float Resistance 0.f;
ExecutionParams.AttemptCalculateCapturedAttributeMagnitude(CaptureDef, EvaluationParameters, Resistance);
Resistance FMath::Clamp(Resistance, 0.f, 100.f); //将抗住限制在0到100接着通过SetByCaller获取到伤害类型的伤害如果没有设置获取的值将为0 //通过Tag获取对应伤害类型的值如果没设置SetByCaller将获取0float DamageTypeValue Spec.GetSetByCallerMagnitude(DamageType);最后计算出能够造成的伤害并将伤害叠加做后续计算 //通过抗性计算出能够对角色造成的伤害值DamageTypeValue * (100.f - Resistance) / 100.f;//将每种属性伤害值合并进行后续计算Damage DamageTypeValue;计算完成以后我们可以进行debug测试这是火球术火属性伤害本来能造成的伤害为5受到抵抗后伤害减少了百分之11.5最总火球术造成的伤害为4.425
- 上一篇: ipad网站制作网站建设细化流程
- 下一篇: ip开源网站FPGA可以做点什么怎样建网站才赚钱
相关文章
-
ipad网站制作网站建设细化流程
ipad网站制作网站建设细化流程
- 站长
- 2026年02月17日
-
ipad 建网站.net网站开发简介
ipad 建网站.net网站开发简介
- 站长
- 2026年02月17日
-
ios网站开发工具wordpress头像同步
ios网站开发工具wordpress头像同步
- 站长
- 2026年02月17日
-
ip开源网站FPGA可以做点什么怎样建网站才赚钱
ip开源网站FPGA可以做点什么怎样建网站才赚钱
- 站长
- 2026年02月17日
-
IP网站登记网站开发培训网站
IP网站登记网站开发培训网站
- 站长
- 2026年02月17日
-
ip网站架设呼伦贝尔市建设网站
ip网站架设呼伦贝尔市建设网站
- 站长
- 2026年02月17日
