[程式] UE4 GameplayEffect&Cue 参数说明

楼主: yekdniw (yekdniw)   2019-07-02 20:42:18
网页版
https://yekdniwunrealengine.blogspot.com/2019/06/GameplayEffectAndCue.html
[前言]
这篇文章主要是关于UE4 GameplayAbilitySystem中GameplayEffect的细项介绍
在我们专案大量使用GameplayEffect的各种用法来达成不同的Gameplay
而GameplayEffect有一大堆的参数, 让我们在使用上遇到不少问题
写这篇文章就是希望其他开发者不用走一次我们走过的冤枉路
[简介]
先列出GameplayEffect可设定参数中的分类, 每个分类内在本文会有更详细的介绍
GameplayEffect
Tags - Tag的新增与移除
Modifiers - 修改AttributeSet内的Value
Duration Policy - 不同的时间执行规则,
很多功能只有特定duration policy才会生效
Conditional Gameplay Effects - 额外apply的effect, 可以设定apply条件
Application - 这个效果能否套用的条件
Period - 周期执行
Display - 演出
Expiration - 结束后追加效果
Immunity - 这个效果套用时, 对其他效果免疫的设定
Stack - 同样Effect的堆叠处理
Overflow - 堆叠溢出时追加效果
Grant Ability - "Give" Ability, 不会自动Activate
GameplayCue
GameplayCue Tag - GameplayEffect跟GameplayCue是透过GameplayTag关联
[本文]
★Tags
GameplayEffectAssetTag
这个effect的tag, 在做一些remove, immunity之类的检查字段
GrantedTag
当Effect apply后, 会同时赋予角色的tags
OngoingTag Requirements
这个tag的玩法很像是遥控炸弹的概念,
先把炸弹的effect装在某个对象上
满足OngoingTag的时候effect就会active
tag有变动的时候就会来checkOngoing
不满足的时候就会remove, 但是不会清掉,
只要再次满足, 就又会active
这个可能是节省网络传输的绝招
根据实验结果, 可以把会使用到多次的duration effect都改成
infinite,
这样ActiveGameplayEffects的传输就只会有一次!!
然后透过tag的add/remove来达到effect的on/off
Application Tag Requirements
能不能apply成功的tag检查
Remove Gameplay Effects with Tags
这个effect apply后可以同时remove其他effect
★Modifiers
Attribute
先决定针对哪个Attribute
参考AttributeSet.h
定义专案的角色会有哪些属性
可参考UE4官方的ActionRPG教学专案
Modifier Op
Enum共有五个
Add Multiply Divide三个都是数学基本运算
Override的使用通常会搭配Magnitude Calculation Type=
Attribute Based
也就是用一个attribute的数值去设定另一个attribute,
例如回满血, hp = hpMax
Invalid没有意义
Modifier Magnitude
先说明一下, 所有"常数"都可以是直接填在Effect上的数字,
或是从表格读值
Magnitude Calculation Type
Scalable Float
常数
Attribute Based
整个数值的公式是value = A*(X+B)+C
X是另一个Attribute的值
A B C都是常数
Custom Calculation Class
这个需要自己写class来做运算, 公式太复杂就要用上这个
Set by Caller
runtime的数值, 参考SetSetByCallerMagnitude
★Duration Policy
三种policy, 分别介绍三种的规则及应用范例
Instant
单次效果
只会在Server上执行, 没有额外的网络传输
例如子弹击中伤害
Duration
持续一段时间的效果, 解除效果时会复原attribute
Duration Mannitude : 持续时间, Policy选Duration才会显示
透过replicated property - ActiveGameplayEffect
同步给所有client
同步后可以得到效果还剩多久的资讯
例如马力欧赛车的吃蘑菇加速
Infinite
不确定会持续多久的可以用这个, 可以配合remove的规则来做设计
例如踩进Volume会得到持续效果, 离开volume就解除
★Conditional Gameplay Effects
Executions
Calculation Class : 自订执行与否的条件
Conditional Gameplay Effects
Requred Source Tags :
对象身上有这些tags, 就会执行额外的effect
★Application
Chance to Apply to Target: 0.0-1.0 ,
对应到百分比机率Application Requirement
bool CanApplyGameplayEffect()
BP写逻辑决定能否apply effect
★Period
Period: 多久modify一次attribute
Execute Periodic Effect on Application
true: apply时就执行第一次效果
false: apply时不执行效果,
一个periodic time后才执行第一次效果
★Display
最重要就是GameplayCue设定
Require Modifier Success to Trigger Cues
顾名思义就是有成功执行Modifier才会Trigger Cue
Modifier为0的情况下, 这个boolean就没用了
默认true: 可以避免gameplay不合理的cue传输
Suppress Stacking Cues
stack的第一个instance才会启动Cue
默认false: 改成true可以减少过多的cue传输,
堆叠时只启动一个Cue
UIData
空的UObject 要另外设计需要的参数
[图表] 图文说明gameplay cue的各个范例
★Expiration
只有duration跟infinite会有效
Premature Expiration Effect
过早结束时会额外追加的效果
什么叫过早? 外力介入
例如force remove / clear tags
参考RemoveActiveGameplayEffect
Routine Expiration Effect
正常结束时会额外追加的效果
★Stack
只有duration跟infinite会有效
Stacking Type(3 types)
无堆叠, 每一次的效果视为独立
由来源合计
由目标合计
Stack Limit Count : 堆叠数量,
我们专案比较常见的做法是把堆叠设成1,
来避免一些效果太强的buff在堆叠时造成的不公平
Stack Duration Refresh Policy : duration要不要重算
Stack Period Reset Policy : period要不要重算
Stack Expiration Policy : Stack内所有effect的时间是一起计算的,
duration结束时提供3种处理方式:
整个stack移除, 效果就全部结束
扣一后再跑一次duration, 效果会弱化
自己写code处理, OnStackCountChange callback
★Overflow (of Stack)
Overflow Effects : 堆叠满了时会额外追加的效果
Deny Overflow Application : 造成堆叠超过的那次apply会fail
Clear Stack on Overflow : overflow后整个stack会清空
★Immunity
用途 : 这个effect在运作时可以阻挡其他effect的apply
Granted Application Immunity Tags
Require Tags : 免疫tag effects
GE的tag是由GameplayEfectAssetTag字段决定
Ignore Tags : 忽略免疫(台词: 我免疫你的免疫)
虽然满足Require Tags, 但是如果这边又有满足其中一个
ignore, 就忽略免疫
这边的tag运算规则是FGameplayTagRequirements::RequirementsMet
Granted Application Immunity Query :
进阶的条件判断, 把effect拆成更细的条件去做检查
[图表] Query说明
Custom Match Delegate BP
经过code trace的结果, 这个字段应该不是给ImmunityQuery使用的
但是Delegate的Input是ActiveGameplayEffect, BP unread,
所以没改code的情况下, 这个delegate完全不能用
Owning Tag Query / Effect Tag Query / Source Tag Query :
三者就是比对effect内的不同tag container字段,
比较需要知道的是Query如何设定
[图表] Tag Qery的详细说明与范例
Modifying Attribute(Match Any)
GE内的Modifier只要任一个Attribute符合, 就免疫
是以整个Effect为单位, 所以其他Attribute的Modifier也会受影响
Effect Soure
检查EffectContext的SoureObject
SourceObject的Type是UObject, 根据实作情形可以填不同的内容
例如Pawn, Controller, PlayerState
我们专案中是用Pawn
而GameplayEffect中的SourceObject就是AbilitySpec的SourceObject接来的值
Effect Definition
最简单的填法, 直接填入免疫的GameplayEffect Class
★Grant Ability
input id
绑定input id来activate这个ability
removal policy
effect结束后要怎么处理granted ability?
CancelAbilityImmediately
妈妈: 马上过来吃饭!
马上中止ability, remove ability
RemoveAbilityOnEnd
妈妈: 存盘完过来吃饭
如果ability没有active, 就直接remove
如果ability正在active, 则结束后会remove
DoNothing
妈妈: 饭好了要吃自己拿
ability不会remove
[结尾]
虽然讲了很多, 但很多用法我们专案也没有实际使用过
但可以看出UE4想要建立一套可在不同专案通用的Gameplay架构, 来减少开发成本
作者: diac3000 (diac)   2019-07-02 21:07:00
头推!
作者: coolrobin (泳圈)   2019-07-02 21:27:00
肩推

Links booklink

Contact Us: admin [ a t ] ucptt.com