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

做网站公司南京专业团队电脑壁纸

做网站公司南京,专业团队电脑壁纸,深圳app开发公司大概,社交网站模板在上一篇文章里#xff0c;我们能够通过富文本显示多种格式的文字#xff0c;并显示技能描述。在这一篇文章里#xff0c;我们继续优化技能描述#xff0c;将技能说需要显示的内容显示出来。 实现火球术的基础描述 首先#xff0c;我们现实现火球术的基础描述#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火球术/\nSmall等级1/\n\nDefault发射 1 颗火球在发生撞击时产生爆炸并造成/ Damage%i/ Default点火焰伤害并有一定几率燃烧。/), ScaledDamage);}return FString::Printf(TEXT(Title火球术/\nSmall等级%i/\n\nDefault发射 %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下一等级/\nSmall等级%i/\n\nDefault发射 %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/\nSmall技能冷却/ Cooldown%.1f/\nSmall蓝量消耗/ 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 CastURPGGameplayAbility(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://www.hkea.cn/news/14474971/

相关文章:

  • 贸易网站建设网网页设计流程步骤
  • 企业网站介绍青海网站设计
  • 科技企业网站模板asp网站代码
  • 网站被刷流量怎么办无锡营销型网站价格
  • 实时网站推广的最终目的是wordpress文章延迟加载
  • 营销网站案例什么意思南京的互联网公司
  • 网站开发工作量及预算计算广东莞建建设工程有限公司
  • 天门市电子商务网站建设哪个网站可以建设网站
  • 丽江网站开发找千素网佛山本科网站建设
  • 中国手机最好的网站排名WordPress连接微博
  • linux 网站301济南电视台新闻频道
  • 网站建设手机端官网帝国网站怎么仿站
  • 单页网站如何做百度精简版入口
  • 深圳市住房和建设网站东莞计算机培训机构哪个最好
  • 北京企业官网网站建设哪家好论文中网站数据则呢做文献参考
  • 建设银行公积金网站提示udun百度人工优化
  • 网站建设的自查报告怎么在亚马逊做跨境电商
  • 珠海网站建设网百度广告代理公司
  • 无锡网站关键词优化wordpress安装模板后做
  • 有哪些做伦敦金的网站wordpress轻系统
  • 网站上的地图代码网站设计制作报价
  • 互联网网站如何做网站数据库访问
  • 上海的网站建设酒店如何做网络推广
  • wordpress固定连接白云怎样优化网站建设
  • 深圳做棋牌网站建设哪家公司收费合理英文网站建设口碑好
  • 广州市网站建设 乾图信息科技免费手机网站空间
  • 福州专业制作网站免费的企业品牌策划公司
  • 网站外链是友情连接吗百度技术培训中心
  • 笑傲网站建设江苏网站建设开发
  • 推广网站的方法有搜索引擎成立中英文网站建设工作领导小组