ARPG中的属性与效果

了解如何在ARPG中使用属性与效果。

Choose your operating system:

Windows

macOS

Linux

在动作RPG(ARPG)中使用技能系统的第一步是启用 GameplayAbilities 插件并创建 属性集(Attribute Set) 类。技能仅支持在C++游戏中使用,因为属性集必须是 UAttributeSet 的C++子类。 URPGAttributeSet 定义 当前/最大生命值(current/max health) 法力(mana) 攻击(attack) 防御(defense) 增益(buffs) 移动(movement) 速度(speed) 属性及在伤害公式中使用的 临时(temporary) 伤害(damage) 属性。前述的每个属性都定义为 FGameplayAttributeData 结构,它存储仅可永久更改修改的 底数值(Base value) 以及临时增益/减益修改的 当前值(Current value) 。该类会使用一些宏来添加样板代码,以处理这些属性的修改和复制。因为ARPG相对简单,所以只有一个AttributeSet,但是对于某些游戏,更合理的做法可能是设置一个玩家和敌人共用的核心集(Core set)以及一个继承自 核心 且包含仅可由玩家使用的额外属性的玩家集(Player set)。

在属性被修改之前, PreAttributeChange 函数在最大值范围内调整当前生命值/法力。在属性被修改之后, PostGameplayEffectExecute 函数处理限制并将更改告知给其他对象。在ARPG中所有角色都继承自提供蓝图事件的 RPGCharacterBase 类,以便处理受到伤害等事件。 RPGCharacterBase 的构造函数负责创建使游戏性效果生效的 URPGAbilitySystemComponent URPGAttributeSet 子对象。根据你所开发的游戏,在特定于游戏的 AbilitySystemComponent 子类或控制器中对此进行处理可能更为合理。另外,你可能需要在首次与Actor交互时生成 AttributeSets AbilitySystemComponents ,以避免对象开销。

角色必须在 生命值>0 时才能应用伤害。有多种方式可以初始化属性默认值,但是对于ARPG我们决定使用 Stats GameplayEffect 来进行初始化。该统计(Stats)Gameplay效果在 ARPGCharacterBase::AddStartupGameplayAbilities 中应用,在那里,它会从角色蓝图读取 PassiveGameplayEffects 列表并在当前 CharacterLevel 应用它们。如果 CharacterLevel 更改,它将删除并在新关卡中重新添加它们。在虚幻引擎4(UE4)编辑器中,用于NPC的 GE_StatsBase Gameplay效果如下图中所示:

ARPG_AttributesAndEffects_01.png

瞬间时长(Instant duration) 表示该效果仅永久应用一次。然后,对于每个主要统计数据,都将有一个 属性修饰符(Attribute Modifier) ,它会基于 CurveTable 覆盖该值。 StartingStats 从一个 CSV (位于 Abilities/DataTables 中)中导入,其中,每个统计数据都在一行中,而每个关卡都在一列中。本示例将关注 DefaultMaxHealth 行,以及 CharacterLevel 列。 GE_PlayerStats 效果会从该泛型效果中进行继承,并将所有行更改为 PlayerMaxHealth 等。通过这种方式使用曲线表,可以一次性轻松调整整个游戏的各个属性,无需手动逐个修改效果。你也可以在游戏之外设置脚本,以创建 CSV JSON 文件(从外部数据源创建,例如 Excel ),并按需将它们导入。

可以使用简单 修饰符(Modifiers) 配合 添加(Add) 操作来更改法力,但是要造成伤害,需要使用 RPGDamageExecution 类。该执行计算由两部分组成,一组捕捉声明和一个执行函数。捕捉声明宏会向UE4编辑器注册信息,使Gameplay效果可以使用项目中的执行。对于每个捕捉到的属性,当前活动临时修饰符列表是与其Gameplay标记一起被捕捉的。然后在 URPGDamageExecution::Execute_Implementation 中,它仅应用与效果执行时传入的Gameplay标记匹配的修饰符。在合并这些修饰符并得到 伤害(Damage) AttackPower DefensePower 的"计算后"的值之后,它就会使用公式 SourceDamage * AttackPower / DefensePower 将其变成"最终"伤害。该最终伤害然后会变成 URPGAttributeSet::PostGameplayEffectExecute 中的生命值修饰符。 GE_DamageBase 如下图所示:

ARPG_AttributesAndEffects_02.png

造成的伤害(Damage)取自 AttackDamage 中的 DefaultAttack 行,但是你也可以更改曲线表(Curve Table)参考左侧的1.0比例,为每个攻击分别应用乘数。 源(Source)/目标(Target) 标记使你能够设置用于过滤的 必需/忽略 标记,在此示例中,如果目标具有 Status.DamageImmune 标记,将不应用伤害。每个攻击会子类化 GE_DamageBase 并根据需要修改标记或修饰符。

欢迎帮助改进虚幻引擎文档!请告诉我们该如何更好地为您服务。
填写问卷调查
取消