内容为公文,主要用于自学和使用。如果你不喜欢就不要喷。多谢各位~
游戏性能力(继承自游戏性)
主要组成部分有
Gameplay Ability,
Ability Tasks(继承自UAbilityTask),
Gameplay Attributes(GA),
Gameplay Effects(GE),
Ability System Component
每个部分的主要职责
1.Gameplay Ability
概念:定义了游戏中技能的效果、使用技能付出的代价(如有),以及何时或在何情况下可以使用等
功能:
①作为异步运行的实例化对象存在
因此你可以运行专门的多阶段任务,包括角色动画、粒子和声效,乃至根据执行时的用户输 入或角色交互设计分支;
②可以在整个网络中自我复制
运行在客户端或服务器计算机上(包括客户端预测支持),甚至还能同步变量和执行远程过程调用(RPC)
③使引擎可在游戏会话期间灵活实现游戏技能
例如提供的扩展功能可用于实现冷却和使用消耗、玩家输入、使用动画蒙太奇的动画,以及对给予Actor的技能本身做出反应。
2.Ability Tasks
3.Gameplay Attributes
概念:存储在 FGameplayAttribute 结构中的”浮点”值
功能:将对游戏或Actor产生影响;其通常为生命值、体力、跳跃高度、攻击速度等值
4.Gameplay Effects
定义:Gameplay效果可即时或随时间改变Gameplay属性(通常称为”增益和减益”)。
功能:例如,施魔法时减少魔法值,激活”冲刺”技能后提升移动速度,或在治疗药物的效力周期内逐渐恢复生命值。
5.Ability System Component 技能系统组件
定义:是游戏中的角色访问Gameplay技能系统的主要接口
功能:组件管理Gameplay属性,运行Gameplay事件,存储Gameplay技能,甚至处理玩家输入到Gameplay技能激活、确认及取消命令的绑定
任何要与Gameplay技能系统交互的Actor都应具有技能系统组件
在项目中使用插件
1.编辑(Edit) -> 插件(Plugins) 窗口中启用Gameplay Abilities技能系统插件。
2.代码中添加组件类 (ProjectName).Build.cs
PublicDependencyModuleNames.AddRange(new string[] { “GameplayAbilities”, “GameplayTags”, “GameplayTasks”, “Core”, “CoreUObject”, “Engine”, “InputCore”, “HeadMountedDisplay” });
使用方法
1.授予技能
GiveAbility
使用 FGameplayAbilitySpec 指定要添加的技能,并返回 FGameplayAbilitySpecHandle。
GiveAbilityAndActivateOnce
使用 FGameplayAbilitySpec 指定要添加的技能,并返回 FGameplayAbilitySpecHandle
技能必须实例化,并且必须能够在服务器上运行
尝试在服务器上运行技能后,将返回 FGameplayAbilitySpecHandle
否则返回NULL,且组件不会被授予该技能
FGameplayAbilitySpecHandle
①ClearAbility:
从技能系统组件中移除指定技能
②SetRemoveAbilityOnEnd:
当该技能执行完毕时,将该技能从技能系统组件中移除。
如果未执行该技能,将立即移除它。
如果正在执行该技能,将立即清除其输入,这样玩家就无法重新激活它或与它互动。
③ClearAllAbilities:
从技能系统组件中移除所有技能。
此函数是唯一不需要 FGameplayAbilitySpecHandle 的函数
2.使用技能生命周期
CanActivateAbility:
即使调用者没有尝试执行某项技能,也可以让调用者知道是否可执行该技能
CallActivateAbility:
①执行技能相关的游戏代码,但不会检查该技能是否可用,通常在 CanActivateAbility`检查及执行技能之间需要某些逻辑时才会调用该函数。
②程序覆盖的主代码是名为`ActivateAbility`的C++函数或是名为Activate Ability的蓝图事件。
③是在激活过程中启动技能任务,异步完成大部分工作,然后连接代理(在C++中)以处理这些任务的输出,或者连接节点以输出执行引脚(在蓝图中)。
④如果从”激活”中调用`CommitAbility`函数,它将应用执行技能的消耗
例如从玩法属性中减去资源(例如”魔法值”、”体力值”或游戏系统所用的任何其他资源)和应用冷却。
⑤`CancelAbility`提供了取消技能的机制,不过技能的`CanBeCanceled`函数可以拒绝请求与`CommitAbility`不同,该函数可供技能外调用者使用。
⑥成功的取消先播放给On Gameplay Ability Cancelled,然后通过标准代码路径结束技能,让技能可运行特殊的清理代码,否则取消时的行为将与自行结束时的行为不同。
TryActivateAbility
是执行技能的典型方式
该函数调用 CanActivateAbility 来确定技能是否可以立即运行,如果可以,则继续调用 CallActivateAbility
EndAbility
①技能执行完毕后将其关闭
②如果技能被取消,UGameplayAbility 类会将其作为取消流程的一部分自动处理,但其他情况下,开发者都必须调用C++函数或在技能的蓝图图表中添加节点。
③如果未能正常结束技能,将导致玩法技能系统认为技能仍在运行,从而带来一些影响
例如禁止将来再使用该技能或任何被该技能阻止的技能。例如,如果游戏的”喝生命药剂”玩法技能没有正常结束,那么使用该技能的角色就无法执行任何在喝血量药剂时无法执行的操作(例如喝其他药剂、快跑、爬梯子等)。这种阻碍会一直存在,因为玩法技能系统会认为角色还在喝药剂。
3.触发玩法事件
是可以传递的数据结构,能够直接触发玩法技能,无需通过正常通道,即可根据情境发送数据有效负载
常用的方法是调用Send Gameplay Event To Actor并提供实施`IAbilitySystemInterface`接口的Actor和玩法事件所需的情境信息,
但也可以直接在技能系统组件上调用Handle Gameplay Event
游戏性属性
属性作为`FGameplayAttribute`类型的UProperty在 属性集 中声明,
属性集包含属性并监视对它们的任何修改尝试。
UCLASS()
class USimpleAttributeSet : public UAttributeSet
{
GENERATED_BODY()
public:
/** 设置默认值。例如,”生命值(Health)”应设置为正数 */
USimpleAttributeSet();
/** 它衡量在死亡之前可以承受的伤害量。*/
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = “Attributes”)
FGameplayAttributeData Health;
};
创建好属性集之后,必须向技能系统组件注册它。
可以将属性集添加为拥有技能系统组件的Actor的子对象,或者将它传递给技能系统组件的`GetOrCreateAttributeSubobject`函数。
游戏性效果 UGameplayEffect
对效果和属性间的交互进行编程
属性集可覆盖多个函数以处理在某个游戏性效果尝试修改属性时它作出反应的方式
①PreAttributeChange / PreAttributeBaseChange
这些函数会在属性被修改前受到调用
它们用于强制实施与属性的值有关的规则,例如”生命值必须介于0和最大生命值之间”,而且不应触发针对属性更改的游戏中反应。
②PreGameplayEffectExecute
在修改属性的值之前,此函数可拒绝或改变提议的修改。
③PostGameplayEffectExecute
在修改属性的值之后,此函数可立即对更改作出反应。
这通常包括限制属性的最终值,或者触发针对新值的游戏中反应,例如,当”生命值”属性降到零时死去。
AbilityTask 技能任务
旨在使用游戏性技能
使用游戏性技能系统的游戏通常包括各种自定义技能任务,这些任务实施其独特的游戏功能
它们在游戏性技能执行过程中执行异步工作,并且能够通过调用委托(Delegate) (在本地C++代码中)或移经一个或多个输出执行引脚(在蓝图中)来影响执行流。
技能任务可以通过调用”EndTask”函数自行终止,或者等待运行它的游戏性技能结束,此时它会自动终止
这可以防止幻影技能任务运行,有效地泄漏CPU周期和内存。
例如,某个技能任务可能播放一个施法动画,而另一个任务则在玩家的瞄准点处放置一个靶向标线。
如果玩家点击确认输入来施放该法术,或者等待动画结束而未确认该法术,游戏性技能就会结束。
虽然它们可以在任何时候自动终止,但是技能任务保证最晚在主要技能结束时终止。
技能任务设计用于网络环境和非网络环境,但它们不会通过网络直接更新自己。它们通常是间接保持同步的,因为它们是由游戏性技能(会进行复制)创建,并且使用复制的信息(例如玩家输入或网络变量)来确定它们的执行流。
先总结到这部分,后面会根据自己的实战经验不断完善文档~