這一篇的目的是實現(xiàn)生命值與UI的交互寻馏,即角色的Health發(fā)生改變后棋弥,UI的血條也會發(fā)生相應的改變。為了實現(xiàn)這個目的诚欠,我們需要有以下幾個步驟:
- 初始化AttributeSet,之前角色的屬性值是沒有初始化的漾岳,是從0開始的
- 通過Delegate轰绵,將HealthAttribute和CharacterBase.cpp中的處理生命變化的函數(shù)bind在一起。
- 實現(xiàn)角色的生命值UI尼荆。
OK左腔,進入正題。
初始化AttributeSet
我個人認為初始化Attributes的較好的方法有兩種捅儒,一是通過Gameplay Effect液样,在角色藍圖中的BeginPlay初始化角色的屬性值。二是通過datatable巧还,在ability system component中初始化屬性值鞭莽。
首先嘗試第一種方法。
新建一個Gameplay Effect命名為GE_AttributeDefault麸祷。Modifier設置如下澎怒,override Health,修改為100阶牍。
在beginplay中通過ApplyGameplayEffectToSelf賦初值喷面。
然后是第二種方法。
第二種方法通過DataTable初始化屬性集
結構選擇AttributeMetaData
然后數(shù)據(jù)為
在角色藍圖中的Ability System Component設置里走孽,將Attribute和DataTable添加上去惧辈。
修改一下之前的測試內容
開始游戲,攻擊磕瓷,可以看到角色的初始生命值變成100了盒齿。
通過Delegate通知生命值被修改
打開rider(感覺比VS好用多了)。在CharacterBase.h中添加delagte。然后建一個函數(shù)县昂,負責Broadcast這個delegate肮柜。
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnHealthChangeEvent, float, NewHealth);
UCLASS()
class GAS_LEARN_API ACharacterBase : public ACharacter, public IAbilitySystemInterface
{
// ......
// Attribute update function
UPROPERTY(BlueprintAssignable, Category="Ability")
FOnHealthChangeEvent HealthChangeEvent;
void OnHealthAttributeChanged(const FOnAttributeChangeData& Data);
};
復制代碼
打開CharacterBase.cpp,實現(xiàn)function
void ACharacterBase::OnHealthAttributeChanged(const FOnAttributeChangeData& Data)
{
HealthChangeEvent.Broadcast(Data.NewValue);
}
復制代碼
在BeginPlay中將OnHealthAttributeChanged function與AbilitySystem中的Attribute Bind倒彰。
// Called when the game starts or when spawned
void ACharacterBase::BeginPlay()
{
Super::BeginPlay();
if(AbilitySystem)
{
AbilitySystem->GetGameplayAttributeValueChangeDelegate(UAttributeSetBase::GetHealthAttribute())
.AddUObject(this, &ACharacterBase::OnHealthAttributeChanged);
}
}
復制代碼
實現(xiàn)Health的UI
新建Widget审洞,命名為W_HealthUI,然后新建ProgressBar待讳,命名為HealthBar芒澜,然后調整一下顏色和percent,可以弄成自己喜歡的粉紅色创淡。
然后新建Custom Event痴晦,用來修改HealthBar的Percent
然后打開角色藍圖,添加Widget Component
然后在BeginPlay中將Health Change的與自己的CustomEvent綁定琳彩,用來修改HealthUI中HealthBar的Percent
完成誊酌。
測試
運行游戲,對著假人攻擊露乏,可以看到扣血了碧浊,Health Attribute與UI的交互完成。