728x90
반응형
이번 포스트에서는 기존에 사용하던 WidgetController의 코드를 리팩토링하겠습니다.
이전의 WidgetController는 Attribute 별로 델리게이트가 존재하고,
델리게이트 별로 연결하는 콜백함수가 따로 존재하였습니다.
하지만, 생각해보면 위의 로직은 Attribute가 변경될 때마다 호출되고,
float값을 인자로 사용한다는 공통점이 존재합니다.
따라서 델리게이트를 하나로 묶어 관리하면
Attribute가 추가될 때마다 델리게이트를 만들지 않아도 되고
또 콜백함수가 아닌 람다를 사용하면 불필요한 콜백함수를 선언 + 정의할 필요도 없어집니다.
따라서 다음과 같이 코드를 수정하겠습니다.
1) AuraOverlayWdigetController
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnAttributeChangedSignature, float, NewValue);
.
.
.
/**
*
*/
UCLASS(BlueprintType, Blueprintable)
class AURA_API UAuraOverlayWidgetController : public UAuraWidgetController
{
GENERATED_BODY()
public:
virtual void BroadcastInitialValues() override;
virtual void BindCallbacksToDependencies() override;
/*
* Delgate Section
*/
UPROPERTY(BlueprintAssignable, Category = "GAS|Attributes")
FOnAttributeChangedSignature OnHealthChanged;
UPROPERTY(BlueprintAssignable, Category = "GAS|Attributes")
FOnAttributeChangedSignature OnMaxHealthChanged;
UPROPERTY(BlueprintAssignable, Category = "GAS|Attributes")
FOnAttributeChangedSignature OnManaChanged;
UPROPERTY(BlueprintAssignable, Category = "GAS|Attributes")
FOnAttributeChangedSignature OnMaxManaChanged;
.
.
.
};
.
.
.
.
.
.
void UAuraOverlayWidgetController::BindCallbacksToDependencies()
{
const UAuraAttributeSet* AuraAttributeSet = CastChecked<UAuraAttributeSet>(AttributeSet);
AbilitySystemComponent->GetGameplayAttributeValueChangeDelegate(AuraAttributeSet->GetHealthAttribute()).AddLambda(
[this](const FOnAttributeChangeData& Data)
{
OnHealthChanged.Broadcast(Data.NewValue);
}
);
AbilitySystemComponent->GetGameplayAttributeValueChangeDelegate(AuraAttributeSet->GetMaxHealthAttribute()).AddLambda(
[this](const FOnAttributeChangeData& Data)
{
OnMaxHealthChanged.Broadcast(Data.NewValue);
}
);
AbilitySystemComponent->GetGameplayAttributeValueChangeDelegate(AuraAttributeSet->GetManaAttribute()).AddLambda(
[this](const FOnAttributeChangeData& Data)
{
OnManaChanged.Broadcast(Data.NewValue);
}
);
AbilitySystemComponent->GetGameplayAttributeValueChangeDelegate(AuraAttributeSet->GetMaxManaAttribute()).AddLambda(
[this](const FOnAttributeChangeData& Data)
{
OnMaxManaChanged.Broadcast(Data.NewValue);
}
);
.
.
.
}
Attribute의 변화에 관한 델리게이트는 FOnAttributeChangedSignature 델리게이트로 통일합니다.
따라서 기존의 Attribute 마다 존재하던 델리게이트를 교체하고,
델리게이트 이벤트 발생 시 연결하던 콜백 함수를 따로 만들지 않고
위와 같이 람다식을 사용하여 연결하도록 수정하였습니다.
이제 언리얼 에디터에서 기존 UI 블루프린트가 사용하던 노드들을 수정해야 합니다.
2) 언리얼 에디터
실행하여 에러가 발생한 블루 프린트를 열고,
해당 블루 프린트에서 에러가 발생한 노드들을 우클릭 후 Refresh Node를 선택합니다.
그 후 다시 적절하게 연결을 수행하면 됩니다.
리팩토링 후의 실행결과는 다음과 같습니다.
문제없이 체력 바와 마나 바가 채워지는 것을 볼 수 있습니다.
728x90
반응형
'언리얼 > 게임 프로젝트' 카테고리의 다른 글
다커 앤 다커 모작 - 1일차_GladiatorCore (0) | 2025.01.13 |
---|---|
다커 앤 다커 모작 - 1일차_모듈과 플러그인 (0) | 2025.01.13 |
GameplayAbilitySystem을 이용한 RPG 프로젝트 - (26) 메세지를 위한 전용 UI 만들기 (0) | 2025.01.09 |
GameplayAbilitySystem을 이용한 RPG 프로젝트 - (25) Data Table을 활용하여 GE별 메세지 출력하기 (0) | 2025.01.09 |
Lyra 클론코딩 - (9 - 1) Camera_01 (0) | 2025.01.09 |