GAS - Gameplay Attributes
https://www.jianshu.com/p/fb75f0ebae42
Attribute
屬性,記錄Actor數值信息,類型爲FGameplayAttributeData(目前就是float),常見的屬性有血量、藍量、攻擊力、移動速度等等。通常使用Gameplay Effect來作用於Attribute,對屬性值進行修改。
Gameplay Attribute可以說是這個系統的數據核心了,我們使用GAS的目的就是改變Actor的數值屬性和狀態(狀態通常就是個二進制數Yes or No,使用Gameplay Tag)。設計技能也是從Actor擁有的屬性出發的。
Attribute Set
Define and Configure attribute(定義和配置屬性)
如何給Actor添加屬性呢?這裏要使用AttributeSet類,顧名思義,屬性集類。在這個類中定義的float(被UPROPERTY標記)就是Attribute。
RPGAttributeSet,h
上圖中的Health,MaxHealth,Mana都是屬性,當然還有一些函數和宏定義,它們的功能後面細說。
創建好自己的AttributeSet類之後,必須使用AbilitySystemComponent註冊它。實現方式有兩種:
1、將其設爲擁有AbilitySystemComponent的Actor的SubObject。
RPGCharacterBase.h
在構造函數中:
RPGCharacterBase.cpp
2、將類傳給Ability System Component的GetOrCreateAttributeSubobject函數。
AbilitySystemComponent.cpp
相關的響應函數(不知道該如何稱呼,暫且定這個叫法)
當屬性值發生變化時,或是施放GameplayEffect時,我們希望做一些處理,此時就需要系統提供的響應函數來進行操作。如ActionRPG中,實現了兩個函數:
RPGAttributeSet.h
插播:寫override是個好習慣!!!
響應函數主要有:
- PreAttributeBaseChange
- PreAttributeChange
- PreGameplayEffectExecute
- PostGameplayEffectExecute
這裏要提一下,Base value和(Current) value的區別。Base value是永久修改的,而value是暫存,這裏應該涉及到網絡相關,GAS是支持客戶端回滾的。
各函數描述:
注意!!只能應用修改符和Setter來改變屬性值(current value),應該也是爲同步服務的
PreAttributeBaseChange:在base value修改前調用。因爲是永久修改,不允許使用temporary modifiers(修改符也是一個類,通常修改屬性是使用GameplayEffect,裏面定義了基本的修改符,也可以自己拓展),不應該在遊戲邏輯中使用。最多用來做數值的Clamp。
PreAttributeChange:同上,只是這裏可以使用temporary modifiers。例子:
RPGAttributeSet.cpp
PreGameplayEffectExecute,PostGameplayEffectExecute:顧名思義,技能釋放前、後會被調用。
RPGAttributeSet.cpp
官方描述
Replication(網絡)
需要在UPROPERTY中添加ReplicatedUsing = OnRep_MyAttribute,同時要在GetLifetimeReplicatedProps函數中設置LiftTime,於是最後會變得像是這樣。
ActionRPG中是這樣的,LifeTime的設置不一樣,如果上圖中說的無誤,則ActionRPG這樣設置在聯機時可能會出現Error。
RPGAttributeSet.cpp
相關宏(Macro)
在前面的響應函數實現中,我們發現要使用許多Get函數,來獲得屬性或是屬性值。幸好,引擎爲我們準備好了宏。
AttributeSet.h
數據驅動
你可以用數據表來初始化你的AttributeSet。
初始化屬性
最後附上ActionRPG的AttributeSet供參考:
RPGAttributeSet.h
作者:珏_Gray
鏈接:https://www.jianshu.com/p/fb75f0ebae42
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。