网站开发制作报价,it外包人员最后什么下场,界面设计包括哪三个方面,池州专业网站建设公司前面我们通过代码实现了UI显示角色的血量和蓝量#xff0c;并实现了初始化和在数值变动时实时更新。为了测试方便#xff0c;没有使用GameEffect去修改角色的属性#xff0c;而是通过代码直接修改的数值。 对于GameEffect的基础#xff0c;这里不再讲解#xff0c;如果需要…前面我们通过代码实现了UI显示角色的血量和蓝量并实现了初始化和在数值变动时实时更新。为了测试方便没有使用GameEffect去修改角色的属性而是通过代码直接修改的数值。 对于GameEffect的基础这里不再讲解如果需要可以查看文档。 虚幻引擎游戏技能系统文档 接下来讲解一下如何使用GameEffect进行属性修改。
实现拾取物的Effect
之前我们创建了一个Actor的类用于修改现在将其内容还原成一个刚创建的模样。 为了保证类的通用性我们删除了所有的内容只添加了一个根节点。如果你需要一些内容可以在蓝图内添加。
SetRootComponent(CreateDefaultSubobjectUSceneComponent(SceneRoot));打开UE在根节点下面添加一个静态网格体用于添加显示模型。 接着将静态网格体的碰撞关闭掉因为我们不需要它进行碰撞检测
在根组件下面再添加一个球碰撞体用于碰撞检测 球碰撞体是默认对所有物体进行检测的 添加球体的碰撞检测事件通知 添加到这里就可以先将UE关闭我们可以将一些使用蓝图方便编辑的内容在蓝图中制作一些比较耗性能的内容或运算比较高的内容放到c内做。
实现赋予类给自身添加GameplayEffect
上面通过蓝图添加了碰撞检测我们将在碰撞检测之后链接在c里创建的函数为角色身份赋予effect效果。 打开代码编辑器在拾取物基类里添加一个函数通过类赋予目标Effect的函数设置这个函数可以在蓝图可调用。 UFUNCTION(BlueprintCallable) void ApplyEffectToTarget(AActor* TargetActor, TSubclassOfUGameplayEffect GameplayEffectClass);//给与目标添加GameplayEffect函数实现里首先要获取到添加目标的ASC组件这里我们使用到了技能组件库里面的函数获取
UAbilitySystemComponent* TargetASC UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent(TargetActor);使用ASC创建一个EffectContextHandle这个句柄里面包含实例化GameplayEffect所需的数据
FGameplayEffectContextHandle EffectContextHandle TargetASC-MakeEffectContext();设置此句柄的创建者
EffectContextHandle.AddSourceObject(this);通过MakeOutgoingSpec()函数实例化GameplayEffect返回一个实例化的句柄句柄的意思是可以跟踪实例化对象的位置即使它位置变动了也能跟踪的到 MakeOutgoingSpec()函数需要传入三个值第一个就是需要实例化的类第二个是效果等级它是有等级区分的第三个值就是我们之前创建的实例化所需数据的句柄。
const FGameplayEffectSpecHandle EffectSpecHandle TargetASC-MakeOutgoingSpec(GameplayEffectClass, 1.f, EffectContextHandle);最后我们需要从实例化对象中拿到它的实际位置并调用ASC赋予自身。
TargetASC-ApplyGameplayEffectSpecToSelf(*EffectSpecHandle.Data.Get());打开拾取物蓝图搜索对应的名称如果出现当前函数节点证明我们成功了 我们也可以直接用蓝图制作下面是蓝图实现方式
创建GameplayEffect
接下来我们创建GameplayEffect这个不需要在c里编写直接创建蓝图编辑即可。接下来我们将创建一个药瓶的效果能够瞬间恢复一定血量的效果。 创建一个基于GameplayEffect的蓝图类 在右侧的细节设置相关的配置项其实这个蓝图就是一个数据蓝图新版本5.3的配置还改版了之前是一堆直接罗列出来现在新增加了一个Components配置可以自己按照需求添加这个感觉改版改的挺好。 在持续时间这里有三个选项Instant瞬间也可以理解为永久Infinite无限时间可以后续被去掉比如永久buffHas Duration具有时效性血瓶作为直接恢复血量的不会再被去掉恢复的血量可以使用Instant 在下面的Modifiers这里添加一个数组元素 它的Attribute设置需要选择我们需要修改的选项血瓶需要修改血量选择在属性集里创建的Health属性 计算方式有加乘除覆盖数值无效有小伙伴会问为什么没有减加的数值是负数就是减了。 这里血量恢复就是加所以我们使用add一瓶血恢复十点生命值 到这里我们的血量恢复的Effect就编写完成了。
添加蓝图逻辑
首先在c类里添加一个参数用于设置类这个类可以被蓝图设置并被蓝图读取。 UPROPERTY(EditAnywhere, BlueprintReadOnly, CategoryApply Effects)TSubclassOfUGameplayEffect InstantGameplayEffectClass; //生成GameplayEffect的类打开对应蓝图后在类默认值的细节这里我们可以设置对应的Effect类直接选择我们创建的Effect 然后再碰撞事件后将角色转换成角色直接应用对应的设置的Effect类最后销毁Actor 接着将actor添加到场景中运行游戏调试框输入showdebug abilitysystem 左侧显示血量数值当前为50 操作角色去吃掉血瓶会发现血量增加10
制作有时间限制的GameplayEffect
前面实现了即时的效果接下来实现一个只可以维持一段时间的效果的药瓶。 我们将制作一个增加最大血量值的GameplayEffect持续时间为5s过了这个时间以后效果将恢复为原来的最大血量。 首先将持续时间修改成Has Duration具有时效性的设置时间为5sPeriod设置为0意为整个周期内都起作用。 然后在属性这里修改一个MaxHealth修改数值增加100 为了防止混淆这里直接增加了一个设置DurationGameplayEffectClass参数 UPROPERTY(EditAnywhere, BlueprintReadOnly, CategoryApply Effects)TSubclassOfUGameplayEffect DurationGameplayEffectClass; //生成具有一定持续时间的GameplayEffect的类逻辑也是直接使用蓝图实现的 运行打开debug默认值MaxHealth是100 去拾取新创建的碰撞体会告诉你增加了100基础还是100,5s后恢复默认的base。
实现持续回血效果的GameplayEffect
上面实现了可以维持一段时间的效果可以作为某些属性使用但是正常使用血瓶它会在一定时间内持续回血接下来我们将实现这个效果。 这个效果和上面的主要区别在于Period的值不能为0就是不会一直触发而是有间隔时间我们设置每间隔一秒执行一次。 Execute Periodic Effect on Application 如果勾选将会在触发时立马触发一次效果而不是等待Period的时间后再触发。 Periodic Inhibition Policy 选择 Never Reset 则属性每次添加不会重置相当于每过1秒触发一次Instant 下面我们修改成了修改血量的值每次触发恢复10点血量