当前位置: 首页 > news >正文

UE5 GAS 技能系统解析:EGameplayAbilityTriggerSource 枚举详解

文章目录

  • 前言
  • 代码解析
  • 核心概念:Ability Trigger
  • 触发源类型详解与实战案例
    • 1. GameplayEvent - 灵活的事件驱动
    • 2. OwnedTagAdded - 状态开始的瞬间
    • 3. OwnedTagPresent - 状态的持续存在
  • 总结


前言

在 Unreal Engine 5 (UE5) 的游戏开发中,Gameplay Ability System (GAS) 是一个强大而复杂的框架,用于构建诸如技能、攻击、被动效果等游戏玩法功能。一个核心的设计理念是事件驱动状态驱动,即技能并非总是通过直接的函数调用激活,而是通过响应游戏内的各种变化来触发。

EGameplayAbilityTriggerSource 枚举正是定义技能如何被触发这一规则的关键组成部分。它决定了监听何种游戏信号以及如何响应该信号。本文将结合具体实例,深入剖析这一枚举的每种类型及其应用场景。

代码解析

首先,我们回顾一下代码本身:

UENUM(BlueprintType)
namespace EGameplayAbilityTriggerSource
{/** Defines what type of trigger will activate the ability, paired to a tag */enum Type : int{// Triggered from a gameplay event, will come with payloadGameplayEvent,// Triggered if the ability's owner gets a tag added, triggered once whenever it's addedOwnedTagAdded,// Triggered if the ability's owner gets tag added, removed when the tag is removedOwnedTagPresent,};
}
  • UENUM(BlueprintType): 宏声明,确保该枚举被纳入UE的反射系统,并可在蓝图中使用。

  • 命名空间 (Namespace): 将枚举包裹在 EGameplayAbilityTriggerSource
    命名空间中,是一种良好的代码规范,用于避免命名冲突。

  • 枚举值 (Enum Values):

    • GameplayEvent: 通过游戏事件触发,并可接收附加数据。
    • OwnedTagAdded: 当所有者获得某个标签时触发一次
    • OwnedTagPresent: 当所有者身上存在某个标签时满足触发条件

核心概念:Ability Trigger

在GAS中,一个 GameplayAbility 可以配置一个或多个 FAbilityTriggerData 结构体。每个触发器定义都包含两个核心元素:

  1. Trigger Tag: 要监听的 GameplayTag (例如,Event.Weapon.Fire, State.Buff.HasDamageBonus)。

  2. Trigger Source: 即 EGameplayAbilityTriggerSource 枚举值,它定义了如何解释和处理上述标签。

这种设计将 “什么”(哪个标签)和 “如何”(如何触发)解耦,提供了极大的灵活性。


触发源类型详解与实战案例

1. GameplayEvent - 灵活的事件驱动

机制:通过调用 AbilitySystemComponent->HandleGameplayEvent() 函数主动发送一个事件。该事件携带一个 GameplayTag 和可选的 FGameplayEventData 负载数据。所有监听该事件标签的技能都会被激活。

适用场景:需要从游戏的各种系统(如输入、动画、物理、UI)主动触发技能,并且需要传递上下文信息时。

案例:使用治疗药水

  • 目标:玩家按下“Q”键,角色播放喝药动画并回复生命值。
  • 实现步骤
  1. 发送事件:在角色或玩家控制器的输入处理逻辑中,检测到“Q”键按下后,发送一个Gameplay Event。
// 在C++代码或通过蓝图节点调用 HandleGameplayEvent
FGameplayEventData EventData;
// 可选:在EventData中设置Instigator、Target、EffectContext等
// 例如,可以设置一个浮点数在EventData中表示治疗量
AbilitySystemComponent->HandleGameplayEvent(FGameplayTag::RequestGameplayTag(TEXT("Event.Item.Potion.Health")),&EventData
);
  1. 配置技能:创建 GA_DrinkHealthPotion 技能,在其能力触发列表中添加一个条目:
  • Trigger TagEvent.Item.Potion.Health
  • Trigger SourceGameplayEvent
  1. 技能执行:事件被发出后,GAS自动激活 GA_DrinkHealthPotion。技能内部可以:
  • EventData 中读取治疗量。
  • 播放喝药动画(Montage)。
  • 动画结束后,应用一个回复生命的 GameplayEffect

优点:极其灵活,是GAS中不同系统间通信的基石。负载数据使得上下文信息传递变得简单。

2. OwnedTagAdded - 状态开始的瞬间

机制:当技能的拥有者(Owner)身上被添加了指定的 GameplayTag 时,技能会立即被触发一次。

适用场景:响应状态开始的瞬间,执行一次性动作。

案例:获得下一次攻击强化Buff

  • 目标:角色拾取“神力符文”后,下一次攻击造成额外伤害,随后Buff消失。

  • 实现步骤

  1. 应用Buff效果:拾取符文时,应用一个 GameplayEffect (GE_NextAttackEmpowered)。

    • GE 的持续时间为5秒(或直到消耗)。
    • GE 的授予标签(Granted Tags)包含 State.Buff.NextAttackEmpowered
  2. 配置技能:创建 GA_EmpoweredAttack 技能,配置其触发器:

    • Trigger TagState.Buff.NextAttackEmpowered
    • Trigger SourceOwnedTagAdded
  3. 自动触发:当 GE_NextAttackEmpowered 被应用,State.Buff.NextAttackEmpowered 标签添加到角色身上的瞬间,GA_EmpoweredAttack 技能自动激活。该技能执行强化攻击逻辑,并在成功后移除角色身上的 State.Buff.NextAttackEmpowered 标签(或直接移除 GE),从而消耗掉这次强化机会。

优点:完美处理 “当…发生时,做一次…” 的逻辑模型。自动化程度高。

3. OwnedTagPresent - 状态的持续存在

机制:只要技能的拥有者身上存在指定的 GameplayTag,该技能就处于可触发状态。它本身不直接激活技能,而是表示一个持续满足的触发条件

适用场景:表示一种状态,该状态持续期间,允许其他系统来检查并触发相关逻辑。

案例举盾格挡

  • 目标:只要角色举着盾牌,就能自动格挡正面的攻击。

  • 实现步骤

  1. 管理状态:创建 GA_RaiseShield 主动技能。按下按键时,它应用一个 GameplayEffect (GE_ShieldRaised) 来添加 State.Shield.IsRaised 标签。松开按键时,移除该 GE 和标签。

  2. 配置被动技能:创建一个被动GA_BlockAttack 技能(其 NetExecutionPolicy 通常设为 ServerOnly)。它不主动执行任何动作,仅配置触发器:

    • Trigger TagState.Shield.IsRaised
    • Trigger SourceOwnedTagPresent
  3. 外部验证:当有攻击事件(如一个 GameplayEvent)命中角色时,处理攻击的逻辑会检查目标角色:

    • 是否拥有 GA_BlockAttack 技能?
    • 该技能的触发条件是否满足?(即 State.Shield.IsRaised 标签是否存在?)
    • 如果满足,则执行格挡逻辑(抵消伤害、播放格挡动画等),而不是激活 GA_BlockAttack 技能。

优点:用于实现持续性的状态效果。其他系统可以查询一个Actor是否拥有某个标签,从而判断其状态并做出决策。这是一种状态查询而非事件触发的模型。


总结

下表总结了三种触发源的核心区别:

特性GameplayEventOwnedTagAddedOwnedTagPresent
触发机制主动发送事件标签被添加的瞬间标签存在期间
数据传递支持 (通过 FGameplayEventData)不支持不支持
典型用例使用物品、受击、动画通知获得Buff时立刻生效持续举盾、光环、燃烧状态
行为模式事件驱动 (Event-Driven)一次性反应 (One-off Reaction)状态查询 (State Query)
灵活性极高

文章转载自:

http://MDp7lO5J.mjzcn.cn
http://1SA5astE.mjzcn.cn
http://2jPbQOMZ.mjzcn.cn
http://DHpIfskd.mjzcn.cn
http://T19kJTzn.mjzcn.cn
http://xKBWOhVK.mjzcn.cn
http://v5FDI7Au.mjzcn.cn
http://bYctyTVw.mjzcn.cn
http://GOOROFF0.mjzcn.cn
http://gGOOevmb.mjzcn.cn
http://B5x0W9wV.mjzcn.cn
http://tM1F5voU.mjzcn.cn
http://t6KinQCg.mjzcn.cn
http://AbjJvcMP.mjzcn.cn
http://IBwT8ubd.mjzcn.cn
http://lQ3HNUvR.mjzcn.cn
http://GatKS2cQ.mjzcn.cn
http://Tr8B7oSx.mjzcn.cn
http://GR6YC8Nt.mjzcn.cn
http://ev1UeMfb.mjzcn.cn
http://pRVZMBcV.mjzcn.cn
http://59jsYGN3.mjzcn.cn
http://0YbE9KXd.mjzcn.cn
http://e91SyEUi.mjzcn.cn
http://yxdJtX5v.mjzcn.cn
http://kSlDjHlv.mjzcn.cn
http://NyZMrvOH.mjzcn.cn
http://hCHcvPdq.mjzcn.cn
http://Xcpbjs3z.mjzcn.cn
http://k5AeiPL8.mjzcn.cn
http://www.dtcms.com/a/386388.html

相关文章:

  • MySQL 基础概念与简单使用
  • PostgreSQL高可用架构实战:构建企业级数据连续性保障体系
  • (二)昇腾AI处理器计算资源层基础
  • C++17新特性:用[*this]告别悬垂指针,提升并发健壮性
  • Buck电路输出电容设计:从理论到实践的完整指南
  • Gin + Gorm:完整 CRUD API 与关系操作指南
  • 996引擎-ItemTips特效框层级自定义
  • 软考高级系统架构设计师之构件与中间件技术篇
  • Maya绑定案例:摆动、扭曲、拉伸(样条IK高级扭曲、表达式)
  • FOG钻井多花数倍成本?MEMS陀螺定向短节如何为成本做“减法”?
  • 性能分析工具的使用
  • DNS-Windows上使用DNS
  • Go 语言开发京东商品详情 API:构建高并发数据采集服务
  • 通用计算流体力学CFD软件VirtualFlow 2025发布,5大亮点
  • 趣味学RUST基础篇(实战Web server)完结
  • 机器人导论 第六章 动力学(1)——牛顿欧拉法推导与详述
  • Android U 浮窗——整体流程介绍(更新中)
  • Pytest+request+Allure
  • Android 反调试攻防实战:多重检测手段解析与内核级绕过方案
  • [vue.js] 树形结点多选框选择
  • websocket python 实现
  • 使用代理访问网络各项命令总结
  • 信创电脑入门指南:定义、发展历程与重点行业部署详解
  • PostgreSQL——元命令
  • PHP 连接池详解:概念、实现与最佳实践
  • nginx + php-fpm改用socket方式代理可能遇到的问题
  • 一篇文章说清【布隆过滤器】
  • 「数据获取」《中国教育经费统计年鉴》(1997-2024)
  • 产品开发周期缩写意思
  • Keil5安装教程保姆级(同时兼容支持C51与ARM双平台开发)(附安装包)