Mini

[UE5] 방마저 속성추가 / 리플리케이션 / 속성위젯에 속성추가 본문

UE5/Advance Damage Techniques

[UE5] 방마저 속성추가 / 리플리케이션 / 속성위젯에 속성추가

Mini_96 2024. 8. 18. 16:37

* 방마저 속성추가

Attribute set 수정

ctrl + h => 한번에 수정

UPROPERTY(BlueprintReadOnly, ReplicatedUsing = OnRep_FireResistance, Category = "Resistance Attributes")
FGameplayAttributeData FireResistance;
ATTRIBUTE_ACCESSORS(UAuraAttributeSet, FireResistance);

UPROPERTY(BlueprintReadOnly, ReplicatedUsing = OnRep_LightningResistance, Category = "Resistance Attributes")
FGameplayAttributeData LightningResistance;
ATTRIBUTE_ACCESSORS(UAuraAttributeSet, LightningResistance);

UPROPERTY(BlueprintReadOnly, ReplicatedUsing = OnRep_ArcaneResistance, Category = "Resistance Attributes")
FGameplayAttributeData ArcaneResistance;
ATTRIBUTE_ACCESSORS(UAuraAttributeSet, ArcaneResistance);

UPROPERTY(BlueprintReadOnly, ReplicatedUsing = OnRep_PhysicalResistance, Category = "Resistance Attributes")
FGameplayAttributeData PhysicalResistance;
ATTRIBUTE_ACCESSORS(UAuraAttributeSet, PhysicalResistance);

콜백함수

UFUNCTION()
void OnRep_FireResistance(const FGameplayAttributeData& OldFireResistance) const;

UFUNCTION()
void OnRep_LightningResistance(const FGameplayAttributeData& OldLightningResistance) const;

UFUNCTION()
void OnRep_ArcaneResistance(const FGameplayAttributeData& OldArcaneResistance) const;

UFUNCTION()
void OnRep_PhysicalResistance(const FGameplayAttributeData& OldPhysicalResistance) const;

리플리케이션 콜백함수 정의 (속성이 변경되는 event 발생시 호출됨 && 속성변경 처리)

/**
 *  This is a helper macro that can be used in RepNotify functions to handle attributes that will be predictively modified by clients.
 *  
 *  void UMyHealthSet::OnRep_Health(const FGameplayAttributeData& OldValue)
 *  {
 *     GAMEPLAYATTRIBUTE_REPNOTIFY(UMyHealthSet, Health, OldValue);
 *  }
 */

 

void UAuraAttributeSet::OnRep_FireResistance(const FGameplayAttributeData& OldFireResistance) const
{
    GAMEPLAYATTRIBUTE_REPNOTIFY(UAuraAttributeSet, ManaRegeneration, OldFireResistance);
}

void UAuraAttributeSet::OnRep_LightningResistance(const FGameplayAttributeData& OldLightningResistance) const
{
    GAMEPLAYATTRIBUTE_REPNOTIFY(UAuraAttributeSet, ManaRegeneration, OldLightningResistance);
}

void UAuraAttributeSet::OnRep_ArcaneResistance(const FGameplayAttributeData& OldArcaneResistance) const
{
    GAMEPLAYATTRIBUTE_REPNOTIFY(UAuraAttributeSet, ManaRegeneration, OldArcaneResistance);
}

void UAuraAttributeSet::OnRep_PhysicalResistance(const FGameplayAttributeData& OldPhysicalResistance) const
{
    GAMEPLAYATTRIBUTE_REPNOTIFY(UAuraAttributeSet, ManaRegeneration, OldPhysicalResistance);
}

 

- 속성이 변경되는경우에만, 네트워크에 복제

https://dev.epicgames.com/documentation/en-us/unreal-engine/conditional-property-replication?application_version=4.27

/** Allows gamecode to specify RepNotify condition: REPNOTIFY_OnChanged (default) or REPNOTIFY_Always for when repnotify function is called  */
// !네트워크에 복제할 속성들을 등록하는 함수! 등록안해주면 빌드에러
void UAuraAttributeSet::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
{
    ...
    //방마저 속성
    DOREPLIFETIME_CONDITION_NOTIFY(UAuraAttributeSet, FireResistance, COND_None, REPNOTIFY_Always);
    DOREPLIFETIME_CONDITION_NOTIFY(UAuraAttributeSet, LightningResistance, COND_None, REPNOTIFY_Always);
    DOREPLIFETIME_CONDITION_NOTIFY(UAuraAttributeSet, ArcaneResistance, COND_None, REPNOTIFY_Always);
    DOREPLIFETIME_CONDITION_NOTIFY(UAuraAttributeSet, PhysicalResistance, COND_None, REPNOTIFY_Always);

}

 

 

* 태그 추가 && 맵에 추가

struct FAuraGameplayTags
{
public:
    ...
    FGameplayTag Attributes_Resistance_Arcane;
    FGameplayTag Attributes_Resistance_Fire;
    FGameplayTag Attributes_Resistance_Lightning;
    FGameplayTag Attributes_Resistance_Physical;
UAuraAttributeSet::UAuraAttributeSet()
{
   ...

    /* 방마저 Attributes */
    TagsToAttributes.Add(GameplayTags.Attributes_Resistance_Arcane, GetArcaneResistanceAttribute);
    TagsToAttributes.Add(GameplayTags.Attributes_Resistance_Fire, GetFireResistanceAttribute);
    TagsToAttributes.Add(GameplayTags.Attributes_Resistance_Lightning, GetLightningResistanceAttribute);
    TagsToAttributes.Add(GameplayTags.Attributes_Resistance_Physical, GetArcaneResistanceAttribute);
    
}

 

* 요구사항 : 화염저항은 Resistance * 0.5 +3 으로 재정의

&& int 

add / int 1당 0.1 화염저항 추가
res 1당 0.5 번개저항 추가

 

* 속성위젯에 속성추가

 

스크롤박스에 복붙으로 4개 행 추가

 

- Tags.cpp에서 태그추가를 빼먹었네요

/*
 * 방마저 Attributes
 */
GameplayTags.Attributes_Resistance_Arcane = UGameplayTagsManager::Get().AddNativeGameplayTag(
    FName("Attributes.Resistance.Arcane"),
    FString("Arcane Resistance")
    );
GameplayTags.Attributes_Resistance_Fire = UGameplayTagsManager::Get().AddNativeGameplayTag(
    FName("Attributes.Resistance.Fire"),
    FString("Fire Resistance")
    );
GameplayTags.Attributes_Resistance_Lightning = UGameplayTagsManager::Get().AddNativeGameplayTag(
    FName("Attributes.Resistance.Lightning"),
    FString("Lightning Resistance")
    );
GameplayTags.Attributes_Resistance_Physical = UGameplayTagsManager::Get().AddNativeGameplayTag(
    FName("Attributes.Resistance.Physical"),
    FString("Physical Resistance")
    );

그래프연결
문제 : data asset을 채워야함
해결 :Data Asset 에 값채우기
문제 : 왜 0임?
원인 : 같은 피지컬속성이 2번 오버로딩됨
해결 : 속성명 다르게 수정