按照功能模塊進行分類分析。
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 的同步播放
- 調試支持 - 完善的開發期調試工具
在網絡遊戲中,這個類負責確保所有遊戲狀態在客户端和服務器之間正確同步,同時提供良好的客户端預測體驗以減少延遲感。每個成員函數都經過精心設計,以平衡性能、網絡帶寬和遊戲體驗。