AttributeSet 負(fù)責(zé)定義和持有屬性并且管理屬性的變化。開發(fā)者可以子類化UAttributeSet。在OwnerActor的構(gòu)造方法中創(chuàng)建的AttributeSet將會(huì)自動(dòng)注冊(cè)到ASC。這一步必須在C++中完成。
Attributes 是由 FGameplayAttributeData定義的浮點(diǎn)值。 Attributes能夠表達(dá)從角色的生命值到角色等級(jí)到藥瓶的價(jià)格等任何數(shù)值。 如果Actor擁有游戲性相關(guān)的數(shù)值,那么可以考慮使用Attribute。Attributes 通常只能被GameplayEffects 修改,因此ASC可以 預(yù)測(cè) 這個(gè)修改。
一個(gè)Attribute 由兩個(gè)值構(gòu)成 - 一個(gè)基值 BaseValue 和一個(gè)當(dāng)前值CurrentValue. 基值BaseValue是屬性 Attribute的一個(gè)恒值, 而當(dāng)前值 CurrentValue 是 BaseValue 加上GameplayEffects的臨時(shí)修改值。
立即(Instant) GameplayEffects將永久改變BaseValue,而持續(xù)(Duration) 和永恒(Infinite) GameplayEffects 將改變CurrentValue。周期性(Periodic )GameplayEffects像立即(Instant) GameplayEffects一樣將改變BaseValue。
這里官方文檔也說的不大清楚,如果Attribute沒有受到GameplayEffects的影響時(shí),這兩個(gè)值其實(shí)是相同的。而受到GameplayEffects影響時(shí),如果是一次性的修改,則直接修改的時(shí)候BaseValue,CurrentValue也會(huì)跟著改變,兩個(gè)值的結(jié)果相同。如果影響是時(shí)效性的,比如一段時(shí)間內(nèi)提高移動(dòng)速度,那么,GameplayEffects修改的是CurrentValue的值。
定義AttributeSet屬性
AttributeSetBase.h
// 版權(quán)歸暮志未晚所有。
#pragma once
#include "CoreMinimal.h"
#include "AttributeSet.h"
#include "AbilitySystemComponent.h"
#include "AttributeSetBase.generated.h"
// Uses macros from AttributeSet.h
#define ATTRIBUTE_ACCESSORS(ClassName, PropertyName) \
GAMEPLAYATTRIBUTE_PROPERTY_GETTER(ClassName, PropertyName) \
GAMEPLAYATTRIBUTE_VALUE_GETTER(PropertyName) \
GAMEPLAYATTRIBUTE_VALUE_SETTER(PropertyName) \
GAMEPLAYATTRIBUTE_VALUE_INITTER(PropertyName)
/**
*
*/
UCLASS()
class AURA_API UAttributeSetBase : public UAttributeSet
{
GENERATED_BODY()
public:
UAttributeSetBase();
virtual void GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const override;
UPROPERTY(BlueprintReadOnly,ReplicatedUsing = OnRep_Health, Category="Vital Attributes")
FGameplayAttributeData Health;
ATTRIBUTE_ACCESSORS(UAttributeSetBase, Health);
UPROPERTY(BlueprintReadOnly,ReplicatedUsing = OnRep_MaxHealth, Category="Vital Attributes")
FGameplayAttributeData MaxHealth;
ATTRIBUTE_ACCESSORS(UAttributeSetBase, MaxHealth);
UFUNCTION()
void OnRep_Health(const FGameplayAttributeData& OldHealth) const;
UFUNCTION()
void OnRep_MaxHealth(const FGameplayAttributeData& OldMaxHealth) const;
};
AttributeSetBase.cpp
// 版權(quán)歸暮志未晚所有。
#include "AbilitySystem/AttributeSetBase.h"
#include "Net/UnrealNetwork.h"
UAttributeSetBase::UAttributeSetBase()
{
InitHealth(100.f);
InitMaxHealth(100.f);
InitMana(100.f);
InitMaxMana(100.f);
}
void UAttributeSetBase::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
{
Super::GetLifetimeReplicatedProps(OutLifetimeProps);
DOREPLIFETIME_CONDITION_NOTIFY(UAttributeSetBase, Health, COND_None, REPNOTIFY_Always);
DOREPLIFETIME_CONDITION_NOTIFY(UAttributeSetBase, MaxHealth, COND_None, REPNOTIFY_Always);
}
void UAttributeSetBase::OnRep_Health(const FGameplayAttributeData& OldHealth) const
{
GAMEPLAYATTRIBUTE_REPNOTIFY(UAttributeSetBase, Health, OldHealth);
}
void UAttributeSetBase::OnRep_MaxHealth(const FGameplayAttributeData& OldMaxHealth) const
{
GAMEPLAYATTRIBUTE_REPNOTIFY(UAttributeSetBase, MaxHealth, OldMaxHealth);
}
在上面的代碼中,我創(chuàng)建了兩個(gè)屬性,一個(gè)是Health,用來表示角色的當(dāng)前血量,另一個(gè)是MaxHealth,代表角色的最大血量。
宏的設(shè)置,編譯時(shí)會(huì)默認(rèn)給變量生成相應(yīng)的Getter以及Setter函數(shù),當(dāng)前設(shè)置會(huì)生成四個(gè)函數(shù),獲取屬性,獲取值,設(shè)置值,以及初始化值。
變量的OnRep 函數(shù)調(diào)用GAMEPLAYATTRIBUTE_REPNOTIFY 宏才能使用預(yù)測(cè)系統(tǒng)
Attribute 需要被添加到GetLifetimeReplicatedProps中,COND_None 為觸發(fā)沒有條件限制,REPTNOTIFY_Always 告訴 OnRep 方法在本地值和服務(wù)器下發(fā)的值即使已經(jīng)相同也會(huì)觸發(fā)(為了預(yù)測(cè)),默認(rèn)情況下OnRep不會(huì)觸發(fā)
如果只是做單機(jī),不需要與服務(wù)器同步復(fù)制,那么OnRep 和GetLifetimeReplicatedProps可以被跳過。
驗(yàn)證屬性
文章來源:http://www.zghlxwxcb.cn/news/detail-800406.html
運(yùn)行游戲,按一下~,輸入showdebug abilitysystem。
在最上面一行,顯示當(dāng)前控制角色的AvatarActor和OwnerActor。
我們還可以通過Page Up和Page Down按鈕切換查看目標(biāo)。
在左下角,則可以查看到我們修改的屬性的數(shù)值。文章來源地址http://www.zghlxwxcb.cn/news/detail-800406.html
到了這里,關(guān)于6. UE5 RPG AttributeSet的設(shè)置的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!