* 속성변경시 모든위젯에 방송떄림
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);
}
);
}
}
* 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 만들기
* 리팩토링 (속성정보얻고, 체크후, 모든 위젯에 방송) 하는 부분이 반복임
함수를 만든후에
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());
}
'UE5 > Attribute Menu' 카테고리의 다른 글
[UE5] Atttribute Menu 퀴즈 (0) | 2024.06.08 |
---|---|
[UE5] 속성행에 GE태그 연결, 속성추가시 AS코드만 수정 // 함수포인터 사용방법 (0) | 2024.06.08 |
[UE5] Attribute Info 델리게이트 // 위젯에 데이터 (속성명, 값) 연결하기 (0) | 2024.06.08 |
[UE5] 메뉴 위젯 컨트롤러 구현, BP내 사용가능한 위젯컨트롤러 게터 만들기, BP 상속안될때 해결방법, MVC 정리 (0) | 2024.06.08 |
[UE5] 속성정보 관련(구조체,탐색) 클래스구현, 속성입력 (0) | 2024.06.08 |