GAS系统简介-什么是GAS系统
GAS 即 Gameplay Ability System(游戏玩法能力系统),是 Epic Games 在 Unreal Engine(虚幻引擎) 中开发的一套功能强大且灵活的框架,用于管理和实现复杂的游戏玩法机制。
GAS 的核心组件
GAS 主要由以下三个核心组件构成:
Ability System Component (ASC):
- 作用:作为 GAS 的核心,ASC 负责管理角色的能力、属性和效果。每个拥有 GAS 的角色通常都有一个 ASC 实例。
- 功能:
- 管理和激活能力(Abilities)。
- 处理属性(Attributes)的增减和查询。
- 应用和管理效果(Effects),如增益、减益、伤害等。
- 提供输入绑定和能力激活的接口。
Abilities(能力):
- 定义:能力代表角色可以执行的特定动作或行为,如攻击、跳跃、治疗等。
- 实现:通过继承
UGameplayAbility
类来创建自定义能力,定义能力的激活条件、执行逻辑和冷却时间等。
Attributes(属性):
- 定义:属性代表角色的各种数值特征,如生命值、法力值、攻击力等。
- 实现:通过继承
UAttributeSet
类来创建自定义属性集,定义角色的基础属性和衍生属性。
Effects(效果):
- 定义:效果用于修改角色的属性或状态,如增加攻击力、减少移动速度、施加中毒效果等。
- 实现:通过创建
GameplayEffect
子类来定义各种效果,设置效果的类型、持续时间、数值变化等。
GAS 的优势与使用步骤
- 模块化设计:GAS 将能力、属性和效果分离,使得系统更加清晰和易于维护。
- 高度可扩展:开发者可以根据项目需求自定义能力、属性和效果,满足各种复杂的游戏玩法需求。
- 灵活的激活机制:支持基于输入、状态或其他条件的能力激活,适应不同的游戏设计模式。
- 网络同步:内置的网络同步机制,确保在多人游戏中能力、属性和效果的一致性和实时性。
- 可视化编辑:通过蓝图系统,开发者可以在编辑器中直观地配置和调试 GAS 组件,提高开发效率。
如何在项目中启用 GAS
启用 GAS 插件:
- 在 Unreal Engine 编辑器中,导航到
编辑
>插件
。 - 搜索并启用
Gameplay Ability System
插件。 - 重启编辑器以应用更改。
- 在 Unreal Engine 编辑器中,导航到
创建 Ability System Component (ASC):
- 在角色类中添加一个
UAbilitySystemComponent
类型的成员变量。 - 初始化并绑定 ASC 到角色。
- 在角色类中添加一个
定义 Attributes:
- 创建继承自
UAttributeSet
的自定义属性集类。 - 定义所需的属性,如生命值、法力值等。
- 创建继承自
创建 Abilities:
- 创建继承自
UGameplayAbility
的自定义能力类。 - 实现能力的激活逻辑、执行过程和冷却机制。
- 创建继承自
配置 Effects:
- 创建继承自
UGameplayEffect
的自定义效果类。 - 定义效果的类型、数值变化和应用逻辑。
- 创建继承自
绑定输入和激活能力:
- 在角色或控制器中绑定输入事件,调用 ASC 的能力激活函数。
- 根据游戏逻辑决定何时激活特定能力。
示例代码
以下是一个简单的示例,展示如何在角色类中初始化 GAS 组件并激活一个能力:
1 | // MyCharacter.h |
API百科
virtual void UAibilitySystemComponent::InitAbilityActorInfo(AActor *InOwnerActor, AActor *InAvatarActor)
函数说明
- 功能:初始化能力的 Actor 信息——用于保存关于我们作用于谁以及谁控制我们的信息的结构体。
- 参数:
InOwnerActor
:从逻辑上拥有此组件的 Actor。InAvatarActor
:我们在世界中实际作用的物理 Actor。通常是 Pawn,但也可能是 Tower、Building、Turret 等,可能与InOwnerActor
是同一个对象。
解释
在虚幻引擎的 Gameplay Ability System(GAS)中,这个函数起着关键作用。它确保了能力系统能够正确识别和管理与角色相关的 Actor 信息。OwnerActor
帮助确定逻辑上的所属关系,而 InAvatarActor
则明确了实际进行交互操作的对象,这对于能力的触发、效果应用等方面都非常重要。
示例代码(假设在自定义组件中调用该函数进行初始化)
1 | // 假设在某个自定义组件类中 |
使用场景说明
在游戏开发中,当你需要使用 GAS 来管理角色的能力时,通常会在角色或相关组件的初始化阶段调用 InitAbilityActorInfo
函数。例如,在角色生成时,或者在自定义组件初始化时,确保 GAS 能够正确关联到对应的 Actor 信息,以便后续进行能力的激活、效果的管理等操作。
注意事项
- 确保
AbilitySystemComp
、OwnerActor
和AvatarActor
在调用函数时都已经正确初始化且不为空,否则可能会导致运行时错误。 - 根据实际游戏逻辑,合理设置
OwnerActor
和AvatarActor
的值,以准确反映角色之间的所属和交互关系。 - 如果在多人联机环境下,要注意这些 Actor 信息的同步问题,确保客户端和服务器端的一致性。
PossessedBy(AController* NewController)
函数详解
核心内容分析
PossessedBy(AController* NewController)
是 Unreal Engine(虚幻引擎)中 ACharacter
类的一个重要虚函数,用于处理控制器(Controller)拥有(Possess)角色(Character)时的逻辑。在游戏开发中,控制器负责管理玩家的输入或 AI 的决策,而角色则是游戏中实际执行动作的实体。当控制器拥有一个角色时,PossessedBy
函数会被调用,允许开发者在角色被控制时进行必要的初始化和设置。
函数签名
1 | virtual void PossessedBy(AController* NewController) override; |
-
PossessedBy
: 虚函数,用于响应控制器拥有角色的事件。 -
AController* NewController
: 指向新拥有该角色的控制器的指针。
在 GAS 中的作用
在 Gameplay Ability System (GAS) 中,PossessedBy
函数的作用尤为重要,因为它涉及到 Ability System Component (ASC) 的初始化和管理。ASC 是 GAS 的核心组件,负责管理角色的能力(Abilities)、属性(Attributes)和效果(Effects)。当控制器拥有角色时,需要确保 ASC 能够正确地与控制器关联,并进行必要的初始化操作。
详细解释
初始化 Ability System Component (ASC):
当控制器拥有一个角色时,通常需要确保该角色的 ASC 被正确初始化。这包括绑定与控制器相关的输入、设置默认的游戏玩法标签(Gameplay Tags)等。绑定输入和能力激活:
控制器可能负责处理玩家的输入,这些输入用于激活角色的能力。通过在PossessedBy
中设置适当的绑定,可以确保当控制器发出指令时,ASC 能够正确响应并激活相应的能力。管理游戏玩法标签和效果:
控制器的拥有关系变化可能会影响角色的游戏玩法标签或应用的效果。例如,当 AI 控制器拥有角色时,可能需要应用特定的效果或标签,以反映 AI 的行为模式。
示例代码
以下是一个示例,展示如何在自定义的 Character 类中重写 PossessedBy
函数,并在其中初始化 GAS 相关的逻辑:
1 | // MyCharacter.h |
关键步骤解释
调用父类函数:
1
Super::PossessedBy(NewController);
确保基类的
PossessedBy
逻辑被执行,以处理默认的拥有行为。初始化 ASC:
1
AbilitySystemComponent->InitAbilityActorInfo(this, this);
这一步将角色和控制器信息绑定到 ASC,使其能够正确管理角色的能力和属性。
处理特定类型的控制器:
1
2
3
4
5APlayerController* PlayerController = Cast<APlayerController>(NewController);
if (PlayerController)
{
// 绑定输入或其他玩家特定逻辑
}根据控制器的类型(玩家控制器或 AI 控制器),执行不同的初始化逻辑。
激活默认能力:
根据需要,可以在控制器拥有角色时激活某些默认的能力,确保角色在拥有后立即具备所需的行为。1
// AbilitySystemComponent->ActivateAbility(FGameplayAbilitySpecHandle());
处理失去控制的情况(可选):
1
2
3
4
5
6
7
8
9
10void AMyCharacter::UnPossess()
{
Super::UnPossess();
if (AbilitySystemComponent)
{
// 清理与控制器相关的逻辑,例如清除输入绑定、重置状态等
// AbilitySystemComponent->ClearBindings();
}
}在控制器失去对角色的控制时,进行必要的清理工作,确保角色状态的一致性。
使用场景说明
在游戏开发中,PossessedBy
函数通常用于以下场景:
- 角色初始化: 当玩家或 AI 控制器首次拥有角色时,进行必要的初始化设置,如绑定输入、激活默认能力等。
- 控制器切换: 当控制器在运行时切换(例如,玩家死亡后重新控制另一个角色),确保新控制器正确地与角色关联。
- 状态管理: 根据控制器的类型(玩家或 AI),调整角色的行为和状态,以适应不同的游戏逻辑。
注意事项
避免重复初始化: 确保
PossessedBy
中的初始化逻辑不会在每次控制器切换时重复执行不必要的操作,可以通过标志位或其他机制来管理初始化状态。处理失去控制的情况: 除了
PossessedBy
,还需要重写UnPossess
函数,以处理控制器失去对角色控制时的清理工作,确保角色状态的一致性。同步问题: 在多人联机环境下,要注意这些 Actor 信息的同步问题,确保客户端和服务器端的一致性,特别是在激活能力和应用效果时。
输入绑定: 确保输入绑定与控制器的类型匹配,避免在 AI 控制器上绑定不必要的玩家输入逻辑。
FGameplayAbilitySpec
是Unreal Engine (UE) 中 Gameplay Ability System (GAS) 的核心结构体,用于定义和管理单个游戏玩法能力实例。
1. 主要组成部分
属性 | 类型 | 描述 |
---|---|---|
Ability |
TSubclassOf<UGameplayAbility> |
具体的能力类(如 UMyGameplayAbility )。 |
InputID |
int32 |
输入绑定 ID(如键盘按键或手柄按钮)。 |
Level |
int32 |
能力等级(影响强度或效果)。 |
ActivationBlockedBy |
FGameplayTagContainer |
阻止激活的标签(如“眩晕”状态)。 |
GrantedTags |
FGameplayTagContainer |
激活时授予的标签(影响其他能力)。 |
SourceObject |
UObject* |
能力来源(如角色、道具)。 |
StartTime |
float |
激活时间(用于计算持续时间/冷却)。 |
Duration |
float |
持续时间(持续型能力)。 |
CooldownTimeRemaining |
float |
剩余冷却时间。 |
bIsActive |
bool |
是否处于激活状态。 |
2. 创建与管理
2.1 创建 FGameplayAbilitySpec
1 | // 获取 AbilitySystemComponent |
3.1 激活/取消能力
1 | // 激活能力 |
GAS-通知蓝图-很重要必须看!
看不到图片请联系我,我会给你发本地文档,因为本人很懒,暂时不想添加图片显示。
![[Pasted image 20250422172242.png]]
通知蓝图中有个接受通知事件,节点如下
该节点发送通知给角色,接受一个角色标签
![[Pasted image 20250422172549.png]]
通知的的原理:一定要使得游戏标签可见,使用send gameplayevent to actor 节点将通知通过游戏标签发送给角色,Event gameplay enent节点用于接受通知并执行
![[Pasted image 20250422173850.png]]
那么可以利用在动画蓝图中放置自定义通知,一旦动画播放完,收到通知则将武器绑定到手部,实现或者实现其它任意功能了。