언리얼 엔진/Gameplay Ability System - Udemy
[UE5/Gameplay Ability System(GAS)] - WidgetController
mane
2024. 2. 12. 22:37
728x90
반응형
인사말
안녕하세요. 이번 포스트에서 언리얼엔진에서 MVC 패턴 중 Controller 에 해당하는 UObject
를 구성하는 것에 대해 작성하겠습니다.
초기화 순서
초기화는 캐릭터가
PossessedBy
될 때InitAbilityActorInfo
를 통해 초기화를 합니다.그리고
AuraHUD->InitOverlay
를 통해서WidgetController
를 생성 후 OverlayWidget 에 WidgetController 를 설정합니다.WidgetController 의 설정이 끝나면 AddToViewport 를 이용해서 만들어진 위젯을 뷰포트에 추가합니다.
void AAuraCharacter::InitAbilityActorInfo() { AAuraPlayerState* AuraPlayerState = GetPlayerState<AAuraPlayerState>(); check(AuraPlayerState); AuraPlayerState->GetAbilitySystemComponent()->InitAbilityActorInfo(AuraPlayerState, this); AbilitySystemComponent = AuraPlayerState->GetAbilitySystemComponent(); AttributeSet = AuraPlayerState->GetAttributeSet(); if(AAuraPlayerController* AuraPlayerController = Cast<AAuraPlayerController>(GetController())) { if(AAuraHUD* AuraHUD = Cast<AAuraHUD>(AuraPlayerController->GetHUD())) { AuraHUD->InitOverlay(AuraPlayerController, AuraPlayerState, AbilitySystemComponent, AttributeSet); } } }
위젯 컨트롤러 초기화
위젯 컨트롤러에는 APlayerController
, APlayerState
, UAbilitySystemComponent
, UAttributeSet
라는 네 가지 주요 변수가 있습니다. 이 변수들을 쉽게 설정할 수 있도록 하기 위해, 이 네 가지를 포함하는 구조체를 만들고 이를 이용해 각각의 위젯 컨트롤러를 초기화할 수 있도록 합니다.
구조체 생성
USTRUCT(BlueprintType)
struct FWidgetControllerParams
{
GENERATED_BODY()
FWidgetControllerParams(){}
FWidgetControllerParams(APlayerController* PC, APlayerState* PS, UAbilitySystemComponent* ASC, UAttributeSet* AS)
: PlayerController(PC), PlayerState(PS), AbilitySystemComponent(ASC), AttributeSet(AS) {}
UPROPERTY(EditAnywhere, BlueprintReadWrite)
TObjectPtr<APlayerController> PlayerController = nullptr;
UPROPERTY()
TObjectPtr<APlayerState> PlayerState = nullptr;
UPROPERTY()
TObjectPtr<UAbilitySystemComponent> AbilitySystemComponent = nullptr;
UPROPERTY()
TObjectPtr<UAttributeSet> AttributeSet = nullptr;
};
이 구조체는 위젯 컨트롤러를 위한 파라미터를 저장하며, 생성자를 통해 쉽게 초기화할 수 있습니다.
위젯 컨트롤러에 변수 설정
위젯 컨트롤러 클래스 내에서 이 구조체를 사용해 위젯 컨트롤러의 변수들을 설정하는 함수를 생성합니다.
UCLASS()
class AURA_API UAuraWidgetController : public UObject
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable, Category = "WidgetController")
void SetWidgetControllerParams(const FWidgetControllerParams& WCParams);
protected:
UPROPERTY(BlueprintReadOnly, Category = "WidgetController")
TObjectPtr<APlayerController> PlayerController;
UPROPERTY(BlueprintReadOnly, Category = "WidgetController")
TObjectPtr<APlayerState> PlayerState;
UPROPERTY(BlueprintReadOnly, Category = "WidgetController")
TObjectPtr<UAbilitySystemComponent> AbilitySystemComponent;
UPROPERTY(BlueprintReadOnly, Category = "WidgetController")
TObjectPtr<UAttributeSet> AttributeSet;
};
- 이 함수는 위젯 컨트롤러의 멤버 변수들을 구조체로부터 받은 값으로 설정합니다.
- 위젯 컨트롤러를 초기화하는 과정에서 이 구조체와 함수를 사용하면, HUD에서 위젯을 뷰포트에 추가하는 과정에서 각각의 위젯에 적절한 컨트롤러를 쉽게 할당할 수 있습니다. 이러한 설정은 게임 내에서 위젯이 플레이어의 입력과 게임 상태에 반응하도록 만드는 데 중요한 부분입니다.
Aura HUD
Aura HUD
클래스 내에서 void InitOverlay(APlayerController* PC, APlayerState* PS, UAbilitySystemComponent* ASC, UAttributeSet* AS)
함수를 통해서 오버레이 위젯을 초기화합니다.
void AAuraHUD::InitOverlay(APlayerController* PC, APlayerState* PS, UAbilitySystemComponent* ASC, UAttributeSet* AS)
{
checkf(OverlayWidgetClass, TEXT("Overlay Widget Class uninitialized, please fill out BP_AuraHUD"))
checkf(OverlayWidgetControllerClass, TEXT("Overlay Widget Controller Class uninitialized, please fill out BP_AuraHUD"))
UUserWidget* Widget = CreateWidget<UUserWidget>(GetWorld(), OverlayWidgetClass);
OverlayWidget = Cast<UAuraUserWidget>(Widget);
const FWidgetControllerParams WidgetControllerParams(PC, PS, ASC, AS);
UOverlayWidgetController* WidgetController = GetOverlayWidgetController(WidgetControllerParams);
OverlayWidget->SetWidgetController(WidgetController);
Widget->AddToViewport();
}
728x90
반응형