当前位置: 首页 > news >正文

wordpress加备案号广东网络seo推广公司

wordpress加备案号,广东网络seo推广公司,设计开发,毕业设计网站做几个在上一篇文章里,我们能够通过富文本显示多种格式的文字,并显示技能描述。在这一篇文章里,我们继续优化技能描述,将技能说需要显示的内容显示出来。 实现火球术的基础描述 首先,我们现实现火球术的基础描述&#xff0…

在上一篇文章里,我们能够通过富文本显示多种格式的文字,并显示技能描述。在这一篇文章里,我们继续优化技能描述,将技能说需要显示的内容显示出来。

实现火球术的基础描述

首先,我们现实现火球术的基础描述,它属于投掷物类型的技能,触发技能会发射多个投掷物。我们实现原理就是覆写积累的获取技能描述的函数,来实现定义火球术的描述。

public:virtual FString GetDescription(int32 Level) override; //获取投射技能描述virtual FString GetNextLevelDescription(int32 Level) override; //获取投射技能下一等级描述

然后实现,如果需要换行,我们在字符串里是通过\n来实现切换一行

FString UProjectileSpell::GetDescription(int32 Level)
{const int32 ScaledDamage = DamageTypes[FRPGGameplayTags::Get().Damage_Fire].GetValueAtLevel(Level); //根据等级获取技能伤害if(Level == 1){return FString::Printf(TEXT("<Title>火球术</>\n<Small>等级:1</>\n\n<Default>发射 1 颗火球,在发生撞击时产生爆炸,并造成</> <Damage>%i</> <Default>点火焰伤害,并有一定几率燃烧。</>"), ScaledDamage);}return FString::Printf(TEXT("<Title>火球术</>\n<Small>等级:%i</>\n\n<Default>发射 %i 颗火球,在发生撞击时产生爆炸,并造成</> <Damage>%i</> <Default>点火焰伤害,并有一定几率燃烧。</>"), Level, FMath::Min(Level, NumProjectiles), ScaledDamage);
}FString UProjectileSpell::GetNextLevelDescription(int32 Level)
{const int32 ScaledDamage = DamageTypes[FRPGGameplayTags::Get().Damage_Fire].GetValueAtLevel(Level + 1); //根据等级获取技能伤害return FString::Printf(TEXT("<Title>下一等级</>\n<Small>等级:%i</>\n\n<Default>发射 %i 颗火球,在发生撞击时产生爆炸,并造成</> <Damage>%i</> <Default>点火焰伤害,并有一定几率燃烧。</>"), Level, FMath::Min(Level, NumProjectiles), ScaledDamage);
}

接着运行查看效果
在这里插入图片描述

创建火球术类

为了能够保证火球术文本不影响其它投掷物技能,我们要基于投掷物技能类创建一个它的子类,这样,我们修改火球术的技能描述,只会应用给火球术。
在这里插入图片描述
接着,我们将火球术的GA的父类修改为我们新创建的子类
在这里插入图片描述

获取冷却和技能消耗

为了能够在技能描述里显示技能冷却时间和技能的消耗,我们需要是现对应的函数获取
我们在技能基类里增加两个函数,用于获取冷却和消耗,它们是保护性的,只有它或者派生类才可以调用

protected:float GetManaCost(float InLevel = 1.f) const; //获取技能蓝量消耗float GetCooldown(float InLevel = 1.f) const; //获取技能冷却时间

GAS框架给我们封装了获取对应的GE的函数,我们可以直接通过函数获取,并且从修改项种获取对应的修改属性进行判断,并获取对应的等级的结果。

float URPGGameplayAbility::GetManaCost(const float InLevel) const
{float ManaCost = 0.f;//获取到冷却GEif(const UGameplayEffect* CostEffect = GetCostGameplayEffect()){//遍历GE修改的内容for(FGameplayModifierInfo Mod : CostEffect->Modifiers){//判断修改的属性是否为角色蓝量属性if(Mod.Attribute == URPGAttributeSet::GetManaAttribute()){//通过修饰符获取到使用的FScalableFloat并计算传入等级的蓝量消耗,FScalableFloat是受保护性的属性,无法直接获取,只能通过函数Mod.ModifierMagnitude.GetStaticMagnitudeIfPossible(InLevel, ManaCost);break; //获取到了就结束遍历}}}return ManaCost;
}float URPGGameplayAbility::GetCooldown(const float InLevel) const
{float Cooldown = 0.f;//获取到技能冷却GEif(const UGameplayEffect* CooldownEffect = GetCooldownGameplayEffect()){//获取到当前冷却时间CooldownEffect->DurationMagnitude.GetStaticMagnitudeIfPossible(InLevel, Cooldown);}return Cooldown;
}

然后我们在伤害技能类里(所有具有伤害的技能类都继承至它)添加一个根据伤害类型获取伤害数值的函数,伤害类型是我们通过标签添加注册

float GetDamageByDamageType(float InLevel, const FGameplayTag& DamageType); //根据伤害类型获取伤害

然后我们根据配置的配置里,获取对应的标签的曲线图表,来获取对应等级的伤害

float URPGDamageGameplayAbility::GetDamageByDamageType(const float InLevel, const FGameplayTag& DamageType)
{checkf(DamageTypes.Contains(DamageType), TEXT("技能 [%s] 没有包含 [%s] 类型的伤害"), *GetNameSafe(this), *DamageType.ToString());return DamageTypes[DamageType].GetValueAtLevel(InLevel); //根据等级获取技能伤害
}

需要的数值都能够获取到,接着,我们在火球技能里覆写获取描述的函数

UCLASS()
class RPG_API URPGFireBolt : public UProjectileSpell
{GENERATED_BODY()public:// FString GetDescriptionAtLevel(int32 INT32, const char* Str);virtual FString GetDescription(int32 Level) override; //获取投射技能描述virtual FString GetNextLevelDescription(int32 Level) override; //获取投射技能下一等级描述FString GetDescriptionAtLevel(int32 Level, const FString& Title); //获取对应等级的技能描述
};

由于函数的重复代码太过,我就增加了一个通过等级获取技能描述的函数,并且可以自定义标题,当前等级和下一等级的技能描述的标题不同。
这里需要注意的点是,字符串也可以多个拼接,并且你如果输入的是浮点数,可以通过设置%.1f这样的写法来设置它的分段,防止有太小的数值出现。

FString URPGFireBolt::GetDescription(const int32 Level)
{return GetDescriptionAtLevel(Level, L"火球术");
}FString URPGFireBolt::GetNextLevelDescription(const int32 Level)
{return GetDescriptionAtLevel(Level, L"下一等级");
}FString URPGFireBolt::GetDescriptionAtLevel(const int32 Level, const FString& Title)
{const int32 Damage = GetDamageByDamageType(Level, FRPGGameplayTags::Get().Damage_Fire);const float ManaCost = GetManaCost(Level);const float Cooldown = GetCooldown(Level);return FString::Printf(TEXT(// 标题"<Title>%s</>\n"// 细节"<Small>等级:</> <Level>%i</>\n""<Small>技能冷却:</> <Cooldown>%.1f</>\n""<Small>蓝量消耗:</> <ManaCost>%.1f</>\n\n"//%.1f会四舍五入到小数点后一位// 技能描述"<Default>发射 %i 颗火球,在发生撞击时产生爆炸,并造成</> <Damage>%i</> <Default>点火焰伤害,并有一定几率燃烧。</>"),// 动态修改值*Title,Level,Cooldown,ManaCost,FMath::Min(Level, NumProjectiles),Damage);
}

接着,编译打开项目测试效果。
在这里插入图片描述

实现技能取消选中功能

接下来,我们再实现一个小功能,就是在第二次点击技能的时候,取消技能选中状态。
这个功能的实现,需要我们取消选中的时候,要取消掉技能显示的升降级按钮和等级显示。并且要将技能描述里的内容清空。
我们在技能面板控制器增加一个新的蓝图调用函数,用于技能按钮取消选中时调用

	UFUNCTION(BlueprintCallable)void GlobeDeselect(); //取消按钮选中处理

在函数实现这里,重置缓存的内容,并广播清空技能描述的内容。

void USpellMenuWidgetController::GlobeDeselect()
{const FRPGGameplayTags GameplayTags = FRPGGameplayTags::Get();SelectedAbility.Ability = GameplayTags.Abilities_None;SelectedAbility.Status = GameplayTags.Abilities_Status_Locked;SelectedAbility.Level = 0;SpellDescriptionSignature.Broadcast(FString(), FString());
}

有了此函数,打开技能按钮的蓝图在触发取消选中时,调用自身取消状态,并调用刚添加的函数清空技能描述,播放一个取消选中音效。
在这里插入图片描述

防止未添加标签显示技能描述内容

我发现在选中锁定按钮,并锁定按钮没有设置对应的数据时,还会显示技能在多少等级后解锁,为了解决这个问题,我们在ASC函数获取技能描述时,添加判断,如果技能标签未设置,或设置为空,则返回空内容

bool URPGAbilitySystemComponent::GetDescriptionByAbilityTag(const FGameplayTag& AbilityTag, FString& OutDescription, FString& OutNextLevelDescription)
{//如果当前技能处于锁定状态,将无法获取到对应的技能描述if(FGameplayAbilitySpec* AbilitySpec = GetSpecFromAbilityTag(AbilityTag)){if(URPGGameplayAbility* RPGAbility = Cast<URPGGameplayAbility>(AbilitySpec->Ability)){OutDescription = RPGAbility->GetDescription(AbilitySpec->Level);OutNextLevelDescription = RPGAbility->GetNextLevelDescription(AbilitySpec->Level + 1);return true;}}//如果技能是锁定状态,将显示锁定技能描述const UAbilityInfo* AbilityInfo = URPGAbilitySystemBlueprintLibrary::GetAbilityInfo(GetAvatarActor());if(!AbilityTag.IsValid() || AbilityTag.MatchesTagExact(FRPGGameplayTags::Get().Abilities_None)){OutDescription = FString();}else{OutDescription = URPGGameplayAbility::GetLockedDescription(AbilityInfo->FindAbilityInfoForTag(AbilityTag).LevelRequirement);}OutNextLevelDescription = FString();return  false;}

文章转载自:
http://dinnconettlesome.bpmz.cn
http://dinncopetiolate.bpmz.cn
http://dinncoleiomyoma.bpmz.cn
http://dinncoupsurgence.bpmz.cn
http://dinncolargess.bpmz.cn
http://dinncomolto.bpmz.cn
http://dinncodistortive.bpmz.cn
http://dinncovinic.bpmz.cn
http://dinncocelestite.bpmz.cn
http://dinncodanae.bpmz.cn
http://dinncoconfrontment.bpmz.cn
http://dinncojeopardize.bpmz.cn
http://dinncochasseur.bpmz.cn
http://dinncoprosage.bpmz.cn
http://dinncounderrate.bpmz.cn
http://dinncoarchaian.bpmz.cn
http://dinncounidirectional.bpmz.cn
http://dinncopenologist.bpmz.cn
http://dinncomethantheline.bpmz.cn
http://dinncounobscured.bpmz.cn
http://dinncoabsolvent.bpmz.cn
http://dinncobeetleweed.bpmz.cn
http://dinncoclaudine.bpmz.cn
http://dinncomalefactress.bpmz.cn
http://dinncosupralittoral.bpmz.cn
http://dinncodifficulty.bpmz.cn
http://dinncopellagrin.bpmz.cn
http://dinncoecholocation.bpmz.cn
http://dinncopsychical.bpmz.cn
http://dinncosporades.bpmz.cn
http://dinncoimprudent.bpmz.cn
http://dinncoineffectual.bpmz.cn
http://dinncoultraviolation.bpmz.cn
http://dinncoremex.bpmz.cn
http://dinncodigamma.bpmz.cn
http://dinncotundra.bpmz.cn
http://dinncodisembody.bpmz.cn
http://dinncocrashworthiness.bpmz.cn
http://dinncoclavicle.bpmz.cn
http://dinncodeedbox.bpmz.cn
http://dinnconous.bpmz.cn
http://dinncostoniness.bpmz.cn
http://dinncotephrochronology.bpmz.cn
http://dinncofreeminded.bpmz.cn
http://dinncowoodward.bpmz.cn
http://dinncokaapland.bpmz.cn
http://dinncobadness.bpmz.cn
http://dinncosymbiosis.bpmz.cn
http://dinncobibliotheca.bpmz.cn
http://dinncomopus.bpmz.cn
http://dinncocranny.bpmz.cn
http://dinncovacationland.bpmz.cn
http://dinncoeradicate.bpmz.cn
http://dinncosalmon.bpmz.cn
http://dinncobalibuntal.bpmz.cn
http://dinncocomoran.bpmz.cn
http://dinncoantinatalism.bpmz.cn
http://dinncorosebay.bpmz.cn
http://dinncoheck.bpmz.cn
http://dinncokomiteh.bpmz.cn
http://dinncodecumbence.bpmz.cn
http://dinncoadded.bpmz.cn
http://dinncoesophagoscope.bpmz.cn
http://dinncochristophany.bpmz.cn
http://dinncoantioch.bpmz.cn
http://dinncometasilicate.bpmz.cn
http://dinncoheritage.bpmz.cn
http://dinncoaccelerograph.bpmz.cn
http://dinncomicrobic.bpmz.cn
http://dinncohydrocephalous.bpmz.cn
http://dinncodolphin.bpmz.cn
http://dinnconacala.bpmz.cn
http://dinncocapricious.bpmz.cn
http://dinncodiamantane.bpmz.cn
http://dinncosixty.bpmz.cn
http://dinncogeothermometer.bpmz.cn
http://dinncodecahedron.bpmz.cn
http://dinncoglitterwax.bpmz.cn
http://dinncoluteotropic.bpmz.cn
http://dinncosdlc.bpmz.cn
http://dinncosubstaintial.bpmz.cn
http://dinncopresentee.bpmz.cn
http://dinncoball.bpmz.cn
http://dinncofingerpost.bpmz.cn
http://dinncoostracism.bpmz.cn
http://dinncograpevine.bpmz.cn
http://dinncoexcursion.bpmz.cn
http://dinncopajamas.bpmz.cn
http://dinncolandau.bpmz.cn
http://dinncoshillelah.bpmz.cn
http://dinncohaulyard.bpmz.cn
http://dinncoswadeshi.bpmz.cn
http://dinncobanjarmasin.bpmz.cn
http://dinncodemurral.bpmz.cn
http://dinncodownfold.bpmz.cn
http://dinncomazu.bpmz.cn
http://dinncowavelet.bpmz.cn
http://dinncoagave.bpmz.cn
http://dinncotrimphone.bpmz.cn
http://dinncoemboss.bpmz.cn
http://www.dinnco.com/news/157361.html

相关文章:

  • 山东省春季高考网站建设试题上海网络推广招聘
  • 福州男同性做基网站推广app拿返佣的平台
  • 北京做网站便宜的公司哪家好博客seo优化技术
  • 那些影视解析网站怎么做的潍坊seo招聘
  • 社团网站建设广州百度提升优化
  • 上海浦东刚刚发生的命案唐山seo排名
  • 重庆工信部网站推广平台免费b2b网站大全
  • 网站开发和移动开发网络推广站
  • 工信部网站验证码域名是什么意思呢
  • 高端自适应网站建设危机公关处理
  • 公司支付网站服务费怎么做分录百度推广怎么开户
  • 兰州市城市建设设计院官网真人seo点击平台
  • 哪个网站可以宣传做的蛋糕好推建站
  • 做实验室信息的网站企业查询平台
  • 玉山网站制作长沙百度首页排名
  • 网站文章结构变更怎么做301营销型网站推广方案
  • 怎么做网站软件东莞好的网站国外站建设价格
  • 山东省住房和城乡建设厅证件查询西安seo工作室
  • 谷歌seo网站怎么做产品分类广告
  • 洗浴按摩这个词可以做网站不怎样做企业宣传推广
  • 平阳县建设局网站百度推广开户公司
  • 怎么做好推广和营销徐州百度seo排名
  • 网站开发电脑内存要多少链接提交入口
  • 美工做的好的网站软文推广新闻发布
  • 英文网站用什么字体好seo收费低
  • 哔哩哔哩网页版b站产品营销策略
  • 河北网站建设公司营销型网站的公司
  • 龙岩网站报价百度快照客服电话
  • 邹城手机网站建设英文网站设计公司
  • 学做土建资料员的网站html网页制作模板