游戏性属性及游戏性效果

游戏性技能系统内的属性及效果概览。

Windows
MacOS
Linux

与游戏性技能系统交互的Actor通常需要具有一组数值属性,它们可供系统访问及修改,以影响游戏逻辑并跟踪游戏中发生的事件。这些属性称为 游戏性属性(或简称为“属性”),它们会(临时或永久地)被 游戏性效果 修改。

要了解如何在UE4项目中对此进行设置,请参阅动作RPG文档中的属性和效果

游戏性属性

游戏性属性 包括可以通过单浮点数值描述的Actor当前状态的任何数值度量,例如,生命值、体力、移动速度和魔法抗性等等。属性作为FGameplayAttribute类型的UProperty在 属性集 中声明,属性集包含属性并监视对它们的任何修改尝试。

必须在本地代码中创建属性和属性集——它们不能在蓝图中创建。

创建属性集

要创建属性集,应从UAttributeSet继承,然后添加使用UPROPERTY标记的游戏性属性数据成员。例如,仅包含“生命值(health)”属性的属性集将类似于以下所示:

UCLASS()
class USimpleAttributeSet : public UAttributeSet
{
    GENERATED_BODY()
public:
    /** 设置默认值。例如,“生命值(Health)”应设置为正数 */
    USimpleAttributeSet();
    /** 它衡量在死亡之前可以承受的伤害量。*/
    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Attributes")
    FGameplayAttributeData Health;
};

仅包含单个属性的最小属性集。

创建好属性集之后,必须向技能系统组件注册它。可以将属性集添加为拥有技能系统组件的Actor的子对象,或者将它传递给技能系统组件的GetOrCreateAttributeSubobject函数。

游戏性效果

游戏性效果是游戏性技能系统更改属性的方法。其中包括:

  • 指示对属性的底数值进行更改,例如,当某个Actor受到伤害时,减小其生命值。

  • 临时更改(通常称为“增益”或“减益”),例如,使移动速度提升几秒。

  • 随时间推移而应用的永久性更改,例如在几秒钟的时间段内(或无限期地)每秒重新生成特定数量的魔法值。

游戏性效果实现为可与技能系统组件交互且适当时可在它们处于激活状态时在其中存储的仅数据蓝图(属于UGameplayEffect基类)。

主要属性

与大多数游戏性技能系统的其他部分不同,无论在本机还是蓝图代码中,游戏性效果通常不覆盖基类UGameplayEffect。相反,游戏性效果被设计成完全通过变量来配置。以下是部分可以调整的游戏性效果的主要属性:

  • 时长:游戏性效果可立即应用(例如,受到攻击时生命值减少),在有限期间内应用(例如,持续时间为几秒的移动速度提升),或无限期地应用(例如,随着时间的推移,某个角色自然地恢复法力值)。另外,具有非瞬间时长的效果也可以按不同的间隔应用自身。这不仅对于更改效果在Gameplay方面产生作用的方式非常有用,对于设置重复音频或视觉效果等的时机方面也非常有用。

  • 修饰符和执行(Execution):修饰符会确定游戏性效果与属性交互的方式。其中包括与属性自身的数学上的交互,例如,“将防御力提升5%”,以及执行效果的游戏性标记要求。当需要让某个游戏性效果产生超出修饰符支持范围的影响时,需要用到“执行(Execution)”。“执行(Execution)”使用UGameplayEffectExecutionCalculation来定义游戏性效果执行时它具有的自定义行为。定义修饰符无法充分覆盖的复杂方程式时,它们特别有用。

  • 应用要求:应用要求包括游戏性效果应用时必须存在(或被禁止)的多组游戏性标记以及游戏性效果不应用的随机概率。如果这些要求无法满足游戏的需求,可以从UGameplayEffectCustomApplicationRequirement基类派生数据对象,在其中你可以编写可任意定义复杂应用规则的本地代码。

  • 授予技能:应用时,游戏性效果不仅可以授予游戏性标记,还可以授予技能。当与“执行(Execution)”配合使用时,可将它们用于设置高度特殊的游戏性组合。例如,某个Actor具有指示该Actor浸在油中的游戏性标记或属性,当它被以火为主题的游戏性效果击中时,它就可以获得“着火”技能,从而被动地烧毁附近的Actor并在接下来的十秒钟之内产生具有粒子和动态光照的视觉效果。

  • 堆叠:“堆叠”指的是处理对已具有增益或减益(或者游戏性效果,在本示例中就是如此)的目标再次应用增益或减益,以及处理所谓的“溢出”情况的策略,溢出是指在原Gameplay效果的影响下已完全饱和的目标被应用了新的游戏性效果(例如,不断累积的毒药计时条只有在溢出后才会产生持续伤害效果)。系统支持各种各样的堆叠行为,例如,不断累积直至超出阈值,维护在每次应用后增加直至达到最大限制的“堆叠量”,在限时效果的影响下重置或增补时间,或独立于各个计时器应用该效果的多个实例。

  • 游戏性Cue显示: 游戏性Cue 是可通过游戏性技能系统控制的管理装饰效果(例如,粒子或音效)的方法,它可以节约网络资源。游戏性技能和游戏性效果可以触发它们,它们通过四个可在本地或蓝图代码中覆盖的主函数来产生作用:On Active、While Active、Removed及Executed(仅由游戏性效果使用)。所有游戏性Cue必须与“GameplayCue”开头的游戏性标记相关联,例如“GameplayCue.ElectricalSparks”或“GameplayCue.WaterSplash.Big”。

    游戏性Cue管理器 执行游戏性Cue。Actor可通过实现IGameplayCueInterface并具有名称与游戏性Cue标记相匹配的函数来对游戏性Cue作出反应。独立的 游戏性Cue通知 蓝图也可以对游戏性Cue作出反应。

对效果和属性间的交互进行编程

属性集可覆盖多个函数以处理在某个游戏性效果尝试修改属性时它作出反应的方式。例如,样本USimpleAttributeSet中的“生命值”属性可以存储浮点值,而且该值可由游戏性技能系统访问或更改,但是当生命值降到零时实际上什么也没有发生,而且也没有什么可以阻止它降到零以下。要使“生命值”属性具有我们想要的行为方式,属性集自身可以进行干预,方法是覆盖多个处理对其任何属性的尝试修改的虚拟函数。以下函数通常会被属性集覆盖:

函数名称

目的

PreAttributeChange / PreAttributeBaseChange

这些函数会在属性被修改前受到调用。它们用于强制实施与属性的值有关的规则,例如“生命值必须介于0和最大生命值之间”,而且不应触发针对属性更改的游戏中反应。

PreGameplayEffectExecute

在修改属性的值之前,此函数可拒绝或改变提议的修改。

PostGameplayEffectExecute

在修改属性的值之后,此函数可立即对更改作出反应。这通常包括限制属性的最终值,或者触发针对新值的游戏中反应,例如,当“生命值”属性降到零时死去。

欢迎来到全新虚幻引擎4文档站!

我们正在努力开发新功能,包括反馈系统,以便您能对我们的工作作出评价。但它目前还未正式上线。如果您对此页面有任何意见与在使用中遭遇任何问题,请前往文档反馈论坛告知我们。

新系统上线运行后,我们会及时通知您的。

发表反馈意见