UE5/Attribute Menu

[UE5] Attribute Info 델리게이트 // 위젯에 데이터 (속성명, 값) 연결하기

Mini_96 2024. 6. 8. 16:23

* 우리는 구조체 정보를 방송할거임

1. 델리게이트 선언(다이나믹 : BP에서 이용 / 멀티캐스트 : 다수에게방송)

2. 델리게이트 변수로 선언

#include "CoreMinimal.h"
#include "UI/WidgetController/AuraWidgetController.h"
#include "AttributeMenuWidgetController.generated.h"
struct FAuraAttributeInfo;
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FAttributeInfoSignature, const FAuraAttributeInfo&, Info);
/**
 * 
 */
UCLASS(BlueprintType, Blueprintable)
class AURA_API UAttributeMenuWidgetController : public UAuraWidgetController
{
    GENERATED_BODY()

public:
    virtual void BindCallbacksToDependencies() override; //의존성바인딩
    virtual void BroadcastInitialValues() override; //초기값방송

    UPROPERTY(BlueprintAssignable,Category="GAS|Attributes")
	FAttributeInfoSignature AttributeInfoDelegate;
    
};

이제 AttributeInfo 를 방송할수 있다.

우리는 AuraAttributeInfo 타입을 방송중임 -> 그 정보가 필요함 -> Data Asset에서 만들어놓음! -> 변수추가

protected:
    UPROPERTY(EditDefaultsOnly)
    TObjectPtr<UAttributeInfo> AttributeInfo;
    //class AURA_API UAttributeInfo : public UDataAsset

DA에서 우리가 구현한find함수이용 => Info를 set한후 방송하기

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

    check(AttributeInfo) //DA가 set되었는지 확인
    FAuraAttributeInfo Info = AttributeInfo->FindAttributeInfoForTag(FAuraGameplayTags::Get().Attributes_Primary_Strength); //일치태그 정보를 리턴
    Info.AttributeValue=AS->GetStrength(); //속성정보 set 완료, value는 직접넣기로 설계함
    AttributeInfoDelegate.Broadcast(Info); //set완료후 방송해야함
}

 

* BP에서 할일

여기 DA에 의존성 주입

protected:
    UPROPERTY(EditDefaultsOnly)
    TObjectPtr<UAttributeInfo> AttributeInfo; //class AURA_API UAttributeInfo : public UDataAsset

델리게이트에 바인딩

AttributeInfoDelegate.Broadcast(Info); //set완료후 방송해야함

 

* 고려사항

각각 속성행에 Str, Int 등 태그를 추가해줘야함

여기 설정에 들어간다
컨트롤러를 얻고, 이벤트 바인딩
Info 내에 들어있는 정보(이전시간에 열심히 노가다했던 ㅋㅋ)를 맘대로 사용할수 있음!!
DA에 값채우기 노가다

 

그런데, 자식에서 정보접근불가 -> 부모(textrow)에 들어가서 set함수 만들어줌

setter 구현
속성이름을 이용 => 행이름을 바꾸기

* 플레이누르면 바뀔까? No

원인 : 브로드캐스트 초기값 value 함수를 콜해야함 //즉, 방송을 안해줬음 ㅋㅋ

안에 방송코드가 있음

그러나, 우리가만든애는 blueprintcllable 함수가아님

-> 부모 찾아가서 blueprintcallable 달아주면됨

virtual void BroadcastInitialValues() override; //초기값방송
class AURA_API UAuraWidgetController : public UObject
{
    GENERATED_BODY()

public:
   ...

    //속성들 방송하는 함수
	UFUNCTION(BlueprintCallable)
	virtual void BroadcastInitialValues();

방송함수 호출
결과

 

* 왜 올str임?

원인 : 아래에서 힘만 set했기 때문

* 일단 value를 먼저 수정하기로함

마찬가지로 부모(textValueRow)에 Setter를 만들어주고, info를 인자로 전달하면됨!

WBP_FrameValue 내의 TextBlock_Value를 set함
속성의 값을 고대로 set 하면됨
결과

 

* 할일 : 각각 행에 대해 태그를 확인한후, 진행하면 속성별 태그가 될것임

요기서 확인하면 되겠군