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

青岛个人网站制作昆明网站建设公司排行

青岛个人网站制作,昆明网站建设公司排行,建站塔山双喜,厦门网站设计建设在上一篇文章里#xff0c;我们实现了通过GE给技能增加资源消耗和技能冷却功能。UI也能够显示角色能够使用的技能的UI#xff0c;现在还有一个问题#xff0c;我们希望在技能释放进去冷却时#xff0c;技能变成灰色#xff0c;并在技能冷却完成#xff0c;技能可以再次使…在上一篇文章里我们实现了通过GE给技能增加资源消耗和技能冷却功能。UI也能够显示角色能够使用的技能的UI现在还有一个问题我们希望在技能释放进去冷却时技能变成灰色并在技能冷却完成技能可以再次使用。 为了实现这个功能我们首先要实现一个能够监听技能进入冷却的方法然后在技能被使用后将UI的颜色修改并在技能冷却完成后将技能UI恢复到可释放状态。 创建异步任务来监听技能冷却 为了实现能够监听我们创建一个新的类用来监听技能冷却。 我们创建一个新的c类继承至BlueprintAsyncActionBase类 修改命名我们将其命名为监听冷却修改 接下来我们将实现类如果不想看实现过程请略过实现完成我会贴上完整的实现代码。 首先我们创建一个委托宏用于设置委托类型返回一个参数 DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FCooldownChangeSignature, float, TimeRemaining);在类里创建两个委托用于触发在技能进入冷却时触发然后在技能冷却时触发 UPROPERTY(BlueprintAssignable)FCooldownChangeSignature CooldownStart; //冷却触发开始委托UPROPERTY(BlueprintAssignable)FCooldownChangeSignature CooldownEnd; //冷却结束委托然后创建两个保护性的变量参数用于实例类时存储ASC和需要监听的冷却标签 protected:UPROPERTY()TObjectPtrUAbilitySystemComponent ASC;FGameplayTag CooldownTag; //记录监听的冷却标签接着我们创建一个实例函数用于创建类的实例设置meta(BlueprintInternalUseOnly“true”)为了防止开发mod或者玩家能够使用到此函数。 UFUNCTION(BlueprintCallable, meta(BlueprintInternalUseOnlytrue))static UListenCooldownChange* ListenForCooldownChange(UAbilitySystemComponent* AbilitySystemComponent, const FGameplayTag CooldownTag);然后增加一个函数用于结束任务防止内存泄露 UFUNCTION(BlueprintCallable)void EndTask();在创建实例函数中我们首先实例化类并将参数设置上去 UListenCooldownChange* UListenCooldownChange::ListenForCooldownChange(UAbilitySystemComponent* AbilitySystemComponent, const FGameplayTag InCooldownTag) {UListenCooldownChange* ListenCooldownChange NewObjectUListenCooldownChange();ListenCooldownChange-ASC AbilitySystemComponent;ListenCooldownChange-CooldownTag InCooldownTag;然后判断传入的两个参数是否存在如果未存在将结束此任务 //如果参数有一项未设置我们将结束此任务if(!IsValid(AbilitySystemComponent) || !InCooldownTag.IsValid()){ListenCooldownChange-EndTask();return nullptr;}我们接下来增加两个回调函数用于实现对技能冷却的开始和结束的广播 //监听冷却标签回调函数void CooldownTagChanged(const FGameplayTag InCooldownTag, int32 NewCount);//监听ASC激活GE的回调void OnActiveEffectAdded(UAbilitySystemComponent* TargetASC, const FGameplayEffectSpec SpecApplied, FActiveGameplayEffectHandle ActiveEffectHandle);使用对标签的监听来实现技能冷却结束的监听 //监听冷却标签的变动并绑定回调用于获取冷却结束AbilitySystemComponent-RegisterGameplayTagEvent(InCooldownTag, EGameplayTagEventType::NewOrRemoved).AddUObject(ListenCooldownChange, UListenCooldownChange::CooldownTagChanged);对于技能进入冷却状态我们采用监听应用冷却GE实现 //监听GE应用回调获取冷却激活用于获取技能开始进入冷却AbilitySystemComponent-OnActiveGameplayEffectAddedDelegateToSelf.AddUObject(ListenCooldownChange, UListenCooldownChange::OnActiveEffectAdded);对于冷却的开始的参数设置我们可以查看ASC源码这个可以在客户端和服务器都获取到对应的委托回调来监听有时效性的GE 宏的定义时是传入了三个参数 设置完成后我们就可以返回每次调用我们可以创建一个监听实例 return ListenCooldownChange;为了防止内存泄露我们需要实现EndTask函数在实例不需要时对其进行销毁并进行资源回收。AbilitySystemComponent-OnActiveGameplayEffectAddedDelegateToSelf是由ASC创建的所以不需要我们去对其进行销毁 void UListenCooldownChange::EndTask() {//判断ASC是否存在if(!IsValid(ASC)) return;//取消对冷却标签的变动监听ASC-RegisterGameplayTagEvent(CooldownTag, EGameplayTagEventType::NewOrRemoved).RemoveAll(this);SetReadyToDestroy(); //设置此对象可以被销毁如果此对象不再被引用将可以被销毁掉MarkAsGarbage(); //标记此实例为垃圾资源可以被回收 }接着我们还需要实现两个广播的处理首先是对冷却结束的广播我们对冷却标签进行获取如果标签数量小于1那么技能将不处于冷却状态我们广播冷却结束即可 void UListenCooldownChange::CooldownTagChanged(const FGameplayTag InCooldownTag, int32 NewCount) const {//如果计数为0代表冷却标签已经不存在技能不处于冷却状态if(NewCount 0){//广播冷却结束委托CooldownEnd.Broadcast(0.f);} }然后就是进入冷却的广播函数广播我们首先获取这个应用的GE是否为设置了冷却标签为了防止设置错误我们获取了设置自身和设置给Actor的标签容器判断容器内是否拥有我们设置的冷却标签。然后创建查询冷却标签的查询器对象通过此对象去查找剩余的冷却时间从中获取到最大冷却时间将时间广播出去。 void UListenCooldownChange::OnActiveEffectAdded(UAbilitySystemComponent* TargetASC, const FGameplayEffectSpec SpecApplied, FActiveGameplayEffectHandle ActiveEffectHandle) const {//获取设置到自身的所有标签FGameplayTagContainer AssetTags;SpecApplied.GetAllAssetTags(AssetTags);//获取到GE设置给Actor的标签FGameplayTagContainer GrantedTags;SpecApplied.GetAllGrantedTags(GrantedTags);//判断应用的GE是否设置了此冷却标签if(AssetTags.HasTagExact(CooldownTag) || GrantedTags.HasTagExact(CooldownTag)){//创建一个查询对象用于查询包含所有标签容器标签的GEFGameplayEffectQuery GameplayEffectQuery FGameplayEffectQuery::MakeQuery_MatchAllOwningTags(CooldownTag.GetSingleTagContainer());//返回查询到的所有包含此冷却GE的剩余时间的GETArrayfloat TimesRemaining ASC-GetActiveEffectsTimeRemaining(GameplayEffectQuery);if(TimesRemaining.Num() 0){//获取最高的冷却时间float TimeRemaining TimesRemaining[0];for(int32 i0; iTimesRemaining.Num(); i){if(TimeRemaining TimesRemaining[i]) TimeRemaining TimesRemaining[i];}//广播初始时间CooldownStart.Broadcast(TimeRemaining);}} }接下来就是完整代码不想看代码解析的自己复制代码去修改名称运行即可 ListenCooldownChange.h // 版权归暮志未晚所有。#pragma once#include CoreMinimal.h #include GameplayTagContainer.h #include AbilitySystemComponent.h #include Kismet/BlueprintAsyncActionBase.h #include ListenCooldownChange.generated.hstruct FGameplayAbilitySpec; DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FCooldownChangeSignature, float, TimeRemaining);/*** */ UCLASS(BlueprintType, meta (ExposedAsyncProxyAsyncTask)) class RPG_API UListenCooldownChange : public UBlueprintAsyncActionBase {GENERATED_BODY()public:UPROPERTY(BlueprintAssignable)FCooldownChangeSignature CooldownStart; //冷却触发开始委托UPROPERTY(BlueprintAssignable)FCooldownChangeSignature CooldownEnd; //冷却结束委托UFUNCTION(BlueprintCallable, meta(BlueprintInternalUseOnlytrue))static UListenCooldownChange* ListenForCooldownChange(UAbilitySystemComponent* AbilitySystemComponent, const FGameplayTag InCooldownTag);UFUNCTION(BlueprintCallable)void EndTask();protected:UPROPERTY()TObjectPtrUAbilitySystemComponent ASC;FGameplayTag CooldownTag; //记录监听的冷却标签//监听冷却标签回调函数void CooldownTagChanged(const FGameplayTag InCooldownTag, int32 NewCount) const;//监听ASC激活GE的回调void OnActiveEffectAdded(UAbilitySystemComponent* TargetASC, const FGameplayEffectSpec SpecApplied, FActiveGameplayEffectHandle ActiveEffectHandle) const; }; ListenCooldownChange.cpp // 版权归暮志未晚所有。#include AbilitySystem/AsyncTasks/ListenCooldownChange.h#include AbilitySystemComponent.hUListenCooldownChange* UListenCooldownChange::ListenForCooldownChange(UAbilitySystemComponent* AbilitySystemComponent, const FGameplayTag InCooldownTag) {UListenCooldownChange* ListenCooldownChange NewObjectUListenCooldownChange();ListenCooldownChange-ASC AbilitySystemComponent;ListenCooldownChange-CooldownTag InCooldownTag;//如果参数有一项未设置我们将结束此任务if(!IsValid(AbilitySystemComponent) || !InCooldownTag.IsValid()){ListenCooldownChange-EndTask();return nullptr;}//监听冷却标签的变动并绑定回调用于获取冷却结束AbilitySystemComponent-RegisterGameplayTagEvent(InCooldownTag, EGameplayTagEventType::NewOrRemoved).AddUObject(ListenCooldownChange, UListenCooldownChange::CooldownTagChanged);//监听GE应用回调获取冷却激活用于获取技能开始进入冷却AbilitySystemComponent-OnActiveGameplayEffectAddedDelegateToSelf.AddUObject(ListenCooldownChange, UListenCooldownChange::OnActiveEffectAdded);return ListenCooldownChange; }void UListenCooldownChange::EndTask() {//判断ASC是否存在if(!IsValid(ASC)) return;//取消对冷却标签的变动监听ASC-RegisterGameplayTagEvent(CooldownTag, EGameplayTagEventType::NewOrRemoved).RemoveAll(this);SetReadyToDestroy(); //设置此对象可以被销毁如果此对象不再被引用将可以被销毁掉MarkAsGarbage(); //标记此实例为垃圾资源可以被回收 }void UListenCooldownChange::CooldownTagChanged(const FGameplayTag InCooldownTag, int32 NewCount) const {//如果计数为0代表冷却标签已经不存在技能不处于冷却状态if(NewCount 0){//广播冷却结束委托CooldownEnd.Broadcast(0.f);} }void UListenCooldownChange::OnActiveEffectAdded(UAbilitySystemComponent* TargetASC, const FGameplayEffectSpec SpecApplied, FActiveGameplayEffectHandle ActiveEffectHandle) const {//获取设置到自身的所有标签FGameplayTagContainer AssetTags;SpecApplied.GetAllAssetTags(AssetTags);//获取到GE设置给Actor的标签FGameplayTagContainer GrantedTags;SpecApplied.GetAllGrantedTags(GrantedTags);//判断应用的GE是否设置了此冷却标签if(AssetTags.HasTagExact(CooldownTag) || GrantedTags.HasTagExact(CooldownTag)){//创建一个查询对象用于查询包含所有标签容器标签的GEFGameplayEffectQuery GameplayEffectQuery FGameplayEffectQuery::MakeQuery_MatchAllOwningTags(CooldownTag.GetSingleTagContainer());//返回查询到的所有包含此冷却GE的剩余时间的GETArrayfloat TimesRemaining ASC-GetActiveEffectsTimeRemaining(GameplayEffectQuery);if(TimesRemaining.Num() 0){//获取最高的冷却时间float TimeRemaining TimesRemaining[0];for(int32 i0; iTimesRemaining.Num(); i){if(TimeRemaining TimesRemaining[i]) TimeRemaining TimesRemaining[i];}//广播初始时间CooldownStart.Broadcast(TimeRemaining);}} } 接着我们在UI的事件图标中搜索名称查看是否能够找到对应的节点 注意我们搜索的名称是函数名称 测试代码 上面我们编写了对应的代码首先做的就是快速测试一下防止出现问题。 我们快速连一套测试节点用来检测是否能够获取到对应事件 查看打印发现事件确实成功触发也有一些问题比如触发了多次。触发多次的原因是因为所有的技能UI都是在监听这一个冷却标签 处理无法在蓝图调用的问题 我们当前无法在蓝图中获取对象进行调用销毁事件所以需要一个方法获取对象我们在头文件设置将其作为一个可获取参数并设置命名AsyncTask UCLASS(BlueprintType, meta (ExposedAsyncProxyAsyncTask))编译运行可以查看到对象类型 我们可以将其设置为变量避免没有销毁掉 设置冷却标签 我们需要记录技能的冷却标签有一个比较好的方法就是在技能数据结构体增加一个配置项 在数据资产中配置上 接着我们修改ui的蓝图在应用了技能数据后对其绑定技能的回调为了保证内存泄露现进行销毁防止频繁切换ui显示的技能导致频繁触发回调。 在ui被销毁时也需要调用 接着编写代码测试 经过测试发现还是有问题原来是没有判断是否为当前需要监听的技能 和之前的技能一样我们通过标签判断是否需要执行后续 这样就实现了事件监听 创建UI冷却效果 上面我们实现了技能的冷却进入和退出。 我们接下来要将冷却效果表现到UI上面让玩家能够清晰的了解到技能已经进入冷却无法释放。 我们增加两个函数节点一个是设置技能UI变暗并将冷却时间显示出来 另一个则是恢复默认状态将冷却节点隐藏并将技能图标颜色恢复默认 我们在监听到技能进入冷却后将冷却时间保存为变量方便后续使用并进入冷却状态 然后我们设置一个定时器在定时器里面对显示剩余时间进行更新Time为多次时间更新一次Looping选中定时器将循环更新不勾选将只触发一次。 并将定时器的引用保存下来方便在冷却结束后将其销毁 然后在自定义事件里面减去每次调用时间更新冷却时间并显示到UI上面 为了防止出现负数我们将其限制在最小值为0 在技能冷却结束后我们将定时器清除并恢复默认状态 接下来运行查看效果 在技能冷却完成也能恢复默认 接下来截取一张完整的蓝图
http://www.w-s-a.com/news/474641/

相关文章:

  • 上海外贸建站商城定制软件安卓
  • 成都网站建设_创新互联wordpress 相邻文章
  • 电子商务网站制作步骤免费建网站知乎
  • 龙岩有什么招聘本地网站团购网站 方案
  • 服务器运行一段时间网站打不开注册公司名字核名查询系统
  • 企业网站改版的意义响应式网站建设新闻
  • 大连金州新区规划建设局网站金坛市建设局网站
  • 有哪些做排球比赛视频网站wordpress 教师工作坊
  • 深圳好点的网站建设公司互联网企业信息服务平台
  • 下载空间大的网站建设哈尔滨网站制作软件
  • 南城网站仿做无锡网站制作哪家价格便宜
  • c做的网站营销策划课程
  • 免费网站404免费进入重庆的公需科目在哪个网站做
  • 网站空间租用费用网站建设公司怎么宣传
  • 镇江网站建设优化案例分析dw2018网页制作步骤图文
  • 网站开发一个多少钱为什么前端都不用dw
  • 网站降权的原因北京中小企业网站建设公司
  • 个人域名能做网站吗wordpress
  • 手机网站设计只找亿企邦工业设计公司简介
  • 腾讯云主机做网站免费网站怎么做啊
  • 网站建设推广销售话术广州网页定制多少钱
  • 备案号是哪个网站项目管理pmp
  • 做网站需要哪些硬件软件网站视频链接怎么做的
  • 电子商务网站建设试题二wordpress主页显示浏览数
  • 网站快照没了广州企业电话大全
  • 网站项目开发收费标准网站开发app开发主营业务
  • 怎么到国外网站去接模具订单做互联网建设企业网站
  • 深圳品牌网站建设公司排名洪雅网站建设
  • nodejs 做网站wordpress主题绕过激活码
  • 平湖模板网站建设公司网页美工培训