관리 메뉴

Mini

[UE5] 속성변경시 위젯에 즉시반영 구현 본문

UE5/Attribute Menu

[UE5] 속성변경시 위젯에 즉시반영 구현

Mini_96 2024. 6. 8. 22:31

* 속성변경시 모든위젯에 방송떄림

void UAttributeMenuWidgetController::BindCallbacksToDependencies()
{
    UAuraAttributeSet* AS = CastChecked<UAuraAttributeSet>(AttributeSet); //부모인 위젯컨트롤러가 갖고있음

    for(auto& Pair : AS->TagsToAttributes) //<태그,속성> 모든 속성들에대해(str,int...)
    {
       AbilitySystemComponent->GetGameplayAttributeValueChangeDelegate(Pair.Value()).AddLambda( //해당속성 : str,int에 대해
       [this, Pair,AS](const FOnAttributeChangeData& Data)//속성변경 데이터 시그니쳐 가져와서
       { //캡쳐 : [Pair] 람다가 로컬에 Pair 복사본을 저장함
          //속성정보얻고, 체크후, 모든 위젯에 방송
          FAuraAttributeInfo Info = AttributeInfo->FindAttributeInfoForTag(Pair.Key); //태그에 맞는 속성 찾기
          Info.AttributeValue = Pair.Value().GetNumericValue(AS);
          AttributeInfoDelegate.Broadcast(Info);
       }
    );
    }
    
}

속성변경시 구독중인 위젯들에게 알림이갈것임 / 구독BP 이미지

 

* AS 맵에 보조속성도 추가

UAuraAttributeSet::UAuraAttributeSet()
{
    const FAuraGameplayTags& GameplayTags = FAuraGameplayTags::Get(); //모든태그들 가져오기
    
    /* Primary Attributes */
    TagsToAttributes.Add(GameplayTags.Attributes_Primary_Strength, GetStrengthAttribute);
    TagsToAttributes.Add(GameplayTags.Attributes_Primary_Intelligence, GetIntelligenceAttribute);
    TagsToAttributes.Add(GameplayTags.Attributes_Primary_Resilience, GetResilienceAttribute);
    TagsToAttributes.Add(GameplayTags.Attributes_Primary_Vigor, GetVigorAttribute);

    /* Secondary Attributes */
    TagsToAttributes.Add(GameplayTags.Attributes_Secondary_Armor, GetArmorAttribute);
    TagsToAttributes.Add(GameplayTags.Attributes_Secondary_ArmorPenetration, GetArmorPenetrationAttribute);
    TagsToAttributes.Add(GameplayTags.Attributes_Secondary_BlockChance, GetBlockChanceAttribute);  
    TagsToAttributes.Add(GameplayTags.Attributes_Secondary_CriticalHitChance, GetCriticalHitChanceAttribute);
    TagsToAttributes.Add(GameplayTags.Attributes_Secondary_CriticalHitResistance, GetCriticalHitResistanceAttribute);
    TagsToAttributes.Add(GameplayTags.Attributes_Secondary_CriticalHitDamage, GetCriticalHitDamageAttribute);
    TagsToAttributes.Add(GameplayTags.Attributes_Secondary_HealthRegeneration, GetHealthRegenerationAttribute);
    TagsToAttributes.Add(GameplayTags.Attributes_Secondary_ManaRegeneration, GetManaRegenerationAttribute);
    TagsToAttributes.Add(GameplayTags.Attributes_Secondary_MaxHealth, GetMaxHealthAttribute);
    TagsToAttributes.Add(GameplayTags.Attributes_Secondary_MaxMana, GetMaxManaAttribute);
}

* 보조속성이 안나오는 버그수정

여기 노드가 풀려있었다
결과

 

* 테스트용 GE액터 만들기 복습 + Test

1. AuraEffectActor 상속받은 BP만들기 > Box Collison 달기 > 오버랩이벤트만들기

아래서만든 GE 설정

2. GamePlayEffect 상속받은 GE 만들기

힘을 +15하는 GE

 

힘이 10->25가 됬다

 

Res+15 -> 연관된 Armor도 정상변경 확인

 

* 리팩토링 (속성정보얻고, 체크후, 모든 위젯에 방송) 하는 부분이 반복임

반복되는 코드

함수를 만든후에

void UAttributeMenuWidgetController::BroadcastAttributeInfo(const FGameplayTag& AttributeTag,
    const FGameplayAttribute& Attribute) const
{
    FAuraAttributeInfo Info = AttributeInfo->FindAttributeInfoForTag(AttributeTag); //태그에 맞는 속성 찾기
    Info.AttributeValue = Attribute.GetNumericValue(AttributeSet); //위젯컨트롤러가 AS 가지고있음
    AttributeInfoDelegate.Broadcast(Info);
}
BroadcastAttributeInfo(Pair.Key,Pair.Value());

한줄로변경

void UAttributeMenuWidgetController::BindCallbacksToDependencies()
{
    UAuraAttributeSet* AS = CastChecked<UAuraAttributeSet>(AttributeSet); //부모인 위젯컨트롤러가 갖고있음
    check(AttributeInfo) //DA가 set되었는지 확인
    for(auto& Pair : AS->TagsToAttributes)
    {
       AbilitySystemComponent->GetGameplayAttributeValueChangeDelegate(Pair.Value()).AddLambda( //해당속성 : str,int에 대해
[this, Pair](const FOnAttributeChangeData& Data)//속성변경 데이터 시그니쳐 가져와서
       {
          BroadcastAttributeInfo(Pair.Key,Pair.Value()); //<태그, 속성>
      
       }
    );
    }
    
}

void UAttributeMenuWidgetController::BroadcastInitialValues()
{
    UAuraAttributeSet* AS = CastChecked<UAuraAttributeSet>(AttributeSet); //부모인 위젯컨트롤러가 갖고있음

    check(AttributeInfo) //DA가 set되었는지 확인

   

    //리팩토링
    for(auto& Pair : AS->TagsToAttributes) //AS의 <태그,속성:델리게이트> 맵 순회
    {
       BroadcastAttributeInfo(Pair.Key,Pair.Value());
      
    }

 

https://github.com/DongHoonYu96/GameplayAbilitySystem_Aura/commit/c515bbe0a3c4820e776792c9498ee31628f59da7

 

feat : 속성변경시 위젯에 즉시반영 구현 · DongHoonYu96/GameplayAbilitySystem_Aura@c515bbe

Bisu96 committed Jun 8, 2024

github.com