按照功能模块进行分类分析。
1. 核心系统定义和配置
成员变量
ReplicationMode
EGameplayEffectReplicationMode ReplicationMode;
- 意义: 控制 GameplayEffect 的复制模式
- 项目用途: 优化网络带宽,根据客户端类型决定复制数据的详细程度
- 网络游戏用途:
- Minimal: 只复制最小信息,不适用于拥有的 ASC
- Mixed: 向模拟代理复制最小信息,向所有者和自主代理复制完整信息
- Full: 向所有客户端复制完整信息
ScopedPredictionKey
FPredictionKey ScopedPredictionKey;
- 意义: 当前预测键,用于客户端预测
- 项目用途: 管理客户端预测的上下文
- 网络游戏用途: 防止预测冲突,支持预测回滚
AffectedAnimInstanceTag
FName AffectedAnimInstanceTag;
- 意义: 指定播放蒙太格的动画实例标签
- 项目用途: 支持多个动画实例的场景
- 网络游戏用途: 确保动画在网络同步时播放到正确的动画实例
2. 属性系统 (Attributes)
成员函数
GetSet / GetSetChecked / AddSet 模板函数
template <class T>
const T* GetSet() const;
- 意义: 获取指定类型的属性集
- 项目用途: 类型安全的属性集访问
- 网络游戏用途: 确保属性访问的类型安全,支持网络同步的属性操作
HasAttributeSetForAttribute
bool HasAttributeSetForAttribute(FGameplayAttribute Attribute) const;
- 意义: 检查是否包含指定属性的属性集
- 项目用途: 验证属性有效性
- 网络游戏用途: 防止在无效属性上操作导致网络错误
InitStats / K2_InitStats
const UAttributeSet* InitStats(TSubclassOf<class UAttributeSet> Attributes, const UDataTable* DataTable);
- 意义: 从数据表初始化属性
- 项目用途: 批量初始化角色属性
- 网络游戏用途: 服务器端初始化,确保所有客户端属性一致
SetNumericAttributeBase / GetNumericAttributeBase
void SetNumericAttributeBase(const FGameplayAttribute &Attribute, float NewBaseValue);
float GetNumericAttributeBase(const FGameplayAttribute &Attribute) const;
- 意义: 设置/获取属性的基础值(不考虑临时修饰器)
- 项目用途: 永久性属性修改
- 网络游戏用途: 服务器权威操作,客户端只能读取
ApplyModToAttribute / ApplyModToAttributeUnsafe
void ApplyModToAttribute(const FGameplayAttribute &Attribute, TEnumAsByte<EGameplayModOp::Type> ModifierOp, float ModifierMagnitude);
- 意义: 直接应用修饰器到属性
- 项目用途: 高性能的属性修改
- 网络游戏用途: ApplyModToAttribute 只在服务器运行,ApplyModToAttributeUnsafe 可在客户端运行但可能导致预测问题
3. GameplayEffects 系统
成员函数
ApplyGameplayEffectSpecToTarget / ApplyGameplayEffectSpecToSelf
FActiveGameplayEffectHandle ApplyGameplayEffectSpecToTarget(const FGameplayEffectSpec& GameplayEffect, UAbilitySystemComponent *Target, FPredictionKey PredictionKey=FPredictionKey());
- 意义: 应用 GameplayEffect 到目标或自身
- 项目用途: 核心的效果应用接口
- 网络游戏用途: 支持预测键,客户端可以预测效果应用
MakeOutgoingSpec
FGameplayEffectSpecHandle MakeOutgoingSpec(TSubclassOf<UGameplayEffect> GameplayEffectClass, float Level, FGameplayEffectContextHandle Context) const;
- 意义: 创建出站的 GameplayEffect 规格
- 项目用途: 准备要应用的 GameplayEffect
- 网络游戏用途: 在客户端创建预测用的效果规格
GetGameplayEffectCount
int32 GetGameplayEffectCount(TSubclassOf<UGameplayEffect> SourceGameplayEffect, UAbilitySystemComponent* OptionalInstigatorFilterComponent, bool bEnforceOnGoingCheck = true) const;
- 意义: 获取指定类型 GameplayEffect 的数量
- 项目用途: 效果堆叠和状态检查
- 网络游戏用途: 客户端可以查询本地预测的效果数量
RemoveActiveGameplayEffect
bool RemoveActiveGameplayEffect(FActiveGameplayEffectHandle Handle, int32 StacksToRemove=-1);
- 意义: 移除活动的 GameplayEffect
- 项目用途: 效果管理和清理
- 网络游戏用途: 服务器权威操作,客户端通过 RPC 请求移除
4. GameplayTags 系统
成员函数
HasMatchingGameplayTag / HasAllMatchingGameplayTags / HasAnyMatchingGameplayTags
bool HasMatchingGameplayTag(FGameplayTag TagToCheck) const;
bool HasAllMatchingGameplayTags(const FGameplayTagContainer& TagContainer) const;
bool HasAnyMatchingGameplayTags(const FGameplayTagContainer& TagContainer) const;
- 意义: 检查 GameplayTag 的存在性
- 项目用途: 游戏逻辑条件判断
- 网络游戏用途: 客户端可以查询本地预测的标签状态
GetGameplayTagCount
int32 GetGameplayTagCount(FGameplayTag GameplayTag) const;
- 意义: 获取 GameplayTag 的计数
- 项目用途: 堆叠标签管理
- 网络游戏用途: 支持网络复制的标签计数
AddLooseGameplayTag / RemoveLooseGameplayTag
void AddLooseGameplayTag(const FGameplayTag& GameplayTag, int32 Count=1);
void RemoveLooseGameplayTag(const FGameplayTag& GameplayTag, int32 Count=1);
- 意义: 添加/移除松散 GameplayTag(不复制)
- 项目用途: 本地临时状态标记
- 网络游戏用途: 仅本地有效,不参与网络同步
5. GameplayCues 系统
成员函数
ExecuteGameplayCue
void ExecuteGameplayCue(const FGameplayTag GameplayCueTag, FGameplayEffectContextHandle EffectContext = FGameplayEffectContextHandle());
- 意义: 执行 GameplayCue(瞬时效果)
- 项目用途: 播放视觉、音频效果
- 网络游戏用途: 通过网络 RPC 同步视觉效果
AddGameplayCue / RemoveGameplayCue
void AddGameplayCue(const FGameplayTag GameplayCueTag, FGameplayEffectContextHandle EffectContext = FGameplayEffectContextHandle());
void RemoveGameplayCue(const FGameplayTag GameplayCueTag);
- 意义: 添加/移除持久 GameplayCue
- 项目用途: 持续视觉效果管理
- 网络游戏用途: 通过网络同步持久视觉效果状态
NetMulticast_InvokeGameplayCueExecuted_FromSpec 等 RPC 函数
void NetMulticast_InvokeGameplayCueExecuted_FromSpec(const FGameplayEffectSpecForRPC Spec, FPredictionKey PredictionKey);
- 意义: 多播 RPC 调用 GameplayCue
- 项目用途: 网络同步视觉效果
- 网络游戏用途: 服务器向所有相关客户端广播视觉效果
6. GameplayAbilities 系统
成员变量
ActivatableAbilities
FGameplayAbilitySpecContainer ActivatableAbilities;
- 意义: 可激活的技能容器
- 项目用途: 管理角色所有可用技能
- 网络游戏用途: 网络复制技能状态
PendingServerActivatedAbilities
TArray<FPendingAbilityInfo> PendingServerActivatedAbilities;
- 意义: 等待服务器激活的技能列表
- 项目用途: 处理客户端预测和服务器确认
- 网络游戏用途: 解决网络延迟导致的技能激活时序问题
成员函数
GiveAbility / K2_GiveAbility
FGameplayAbilitySpecHandle GiveAbility(const FGameplayAbilitySpec& AbilitySpec);
FGameplayAbilitySpecHandle K2_GiveAbility(TSubclassOf<UGameplayAbility> AbilityClass, int32 Level = 0, int32 InputID = -1);
- 意义: 授予角色新技能
- 项目用途: 技能学习和装备系统
- 网络游戏用途: 服务器权威操作,通过网络复制到客户端
TryActivateAbility
bool TryActivateAbility(FGameplayAbilitySpecHandle AbilityToActivate, bool bAllowRemoteActivation = true);
- 意义: 尝试激活技能
- 项目用途: 技能触发入口
- 网络游戏用途: 支持客户端预测激活,最终由服务器确认
CancelAbility / CancelAllAbilities
void CancelAbility(UGameplayAbility* Ability);
void CancelAllAbilities(UGameplayAbility* Ignore=nullptr);
- 意义: 取消技能
- 项目用途: 技能中断和状态清理
- 网络游戏用途: 网络同步技能取消状态
7. 输入和定位系统
成员函数
BindAbilityActivationToInputComponent
void BindAbilityActivationToInputComponent(UInputComponent* InputComponent, FGameplayAbilityInputBinds BindInfo);
- 意义: 绑定技能激活到输入组件
- 项目用途: 连接输入系统和技能系统
- 网络游戏用途: 只在本地玩家控制器上设置输入绑定
AbilityLocalInputPressed / AbilityLocalInputReleased
void AbilityLocalInputPressed(int32 InputID);
void AbilityLocalInputReleased(int32 InputID);
- 意义: 本地输入按下/释放处理
- 项目用途: 输入事件到技能激活的转换
- 网络游戏用途: 自主代理处理本地输入,服务器通过 RPC 接收输入状态
8. 动画和蒙太格系统
成员函数
PlayMontage
float PlayMontage(UGameplayAbility* AnimatingAbility, FGameplayAbilityActivationInfo ActivationInfo, UAnimMontage* Montage, float InPlayRate, FName StartSectionName = NAME_None, float StartTimeSeconds = 0.0f);
- 意义: 播放技能蒙太格
- 项目用途: 技能动画播放
- 网络游戏用途: 通过网络同步蒙太格播放状态
CurrentMontageStop / CurrentMontageJumpToSection
void CurrentMontageStop(float OverrideBlendOutTime = -1.0f);
void CurrentMontageJumpToSection(FName SectionName);
- 意义: 控制当前蒙太格
- 项目用途: 动画流程控制
- 网络游戏用途: 通过网络 RPC 同步蒙太格控制命令
9. 网络复制和 RPC 系统
成员函数
ServerTryActivateAbility
UFUNCTION(Server, reliable, WithValidation)
void ServerTryActivateAbility(FGameplayAbilitySpecHandle AbilityToActivate, bool InputPressed, FPredictionKey PredictionKey);
- 意义: 服务器 RPC 尝试激活技能
- 项目用途: 客户端向服务器请求技能激活
- 网络游戏用途: 技能激活的服务器权威验证
ServerSetReplicatedTargetData
UFUNCTION(Server, reliable, WithValidation)
void ServerSetReplicatedTargetData(FGameplayAbilitySpecHandle AbilityHandle, FPredictionKey AbilityOriginalPredictionKey, const FGameplayAbilityTargetDataHandle& ReplicatedTargetDataHandle, FGameplayTag ApplicationTag, FPredictionKey CurrentPredictionKey);
- 意义: 服务器 RPC 设置复制目标数据
- 项目用途: 同步技能目标选择数据
- 网络游戏用途: 客户端向服务器发送目标数据用于服务器验证
ForceReplication
void ForceReplication();
- 意义: 强制立即复制
- 项目用途: 重要状态变化的及时同步
- 网络游戏用途: 确保关键状态变化尽快同步到客户端
10. 调试和开发工具
成员函数
PrintDebug
void PrintDebug();
- 意义: 打印调试信息
- 项目用途: 开发期状态查看
- 网络游戏用途: 收集和显示客户端-服务器状态对比
ServerPrintDebug_Request
UFUNCTION(Server, reliable, WithValidation)
void ServerPrintDebug_Request();
- 意义: 请求服务器调试信息
- 项目用途: 远程调试支持
- 网络游戏用途: 客户端可以获取服务器端的状态信息用于调试
11. 内部状态管理
成员变量
AbilityActorInfo
TSharedPtr<FGameplayAbilityActorInfo> AbilityActorInfo;
- 意义: 能力执行者信息
- 项目用途: 存储技能执行所需的角色信息
- 网络游戏用途: 确保客户端和服务器使用相同的角色引用
ActiveGameplayEffects
FActiveGameplayEffectsContainer ActiveGameplayEffects;
- 意义: 活跃 GameplayEffects 容器
- 项目用途: 管理所有当前生效的效果
- 网络游戏用途: 网络复制效果状态,支持预测
ActiveGameplayCues
FActiveGameplayCueContainer ActiveGameplayCues;
- 意义: 活跃 GameplayCues 容器
- 项目用途: 管理所有当前生效的视觉提示
- 网络游戏用途: 网络同步视觉提示状态
总结
UAbilitySystemComponent 是一个极其复杂的系统,它提供了:
- 完整的属性系统 - 支持基础值、修饰器、网络同步
- 强大的效果系统 - 即时、持续、周期性的游戏效果
- 灵活的标签系统 - 游戏状态标记和查询
- 可预测的技能系统 - 客户端预测、服务器验证
- 网络同步架构 - 支持各种复制模式和预测
- 视觉反馈系统 - GameplayCues 的同步播放
- 调试支持 - 完善的开发期调试工具
在网络游戏中,这个类负责确保所有游戏状态在客户端和服务器之间正确同步,同时提供良好的客户端预测体验以减少延迟感。每个成员函数都经过精心设计,以平衡性能、网络带宽和游戏体验。

2151

被折叠的 条评论
为什么被折叠?



