0. 개요

오버레이 위젯 컨트롤러는 체력 글로브와 마나 글로브의 초기화, 속성 메뉴 버튼 활성화를 담당하고 있다.

속성 메뉴 버튼을 누르면 속성 메뉴(Attribute Menu) 블루프린트 위젯이 생성된다.

이 위젯에 속성의 정보를 데이터 에셋에서 꺼내와 표시하기 위해 속성 메뉴 위젯 컨트롤러를 생성해야 한다.

위젯 컨트롤러를 생성하기 전에, 위젯 컨트롤러를 효과적으로 다루기 위한 블루프린트 라이브러리를 생성한다.


- 오버레이 위젯 컨트롤러에서 작업하지 않는 이유?

1. 속성 메뉴의 생성 시간이 버튼을 누른 이후이기 때문에 포인터의 유효성이 보장되기 어려움(nullptr일 수 있음)

2. 메뉴가 비활성화 상태일 때 속성 데이터를 표시하는 작업이 불필요


 

1. 라이브러리(Library)

(1) 정의

재사용 가능한 코드를 모아놓은 것.

 

(2) 특징

- 재사용성 : 여러 프로젝트에서 반복적으로 사용 가능

- 모듈화 : 프로그램의 기능을 확장하기 쉬움, 모듈 간 서로 독립적(비종속적)

- 유지보수성 : 문제가 발생한 라이브러리의 코드를 수정하면 사용하는 모든 프로젝트에 반영됨

- 효율성 : 반복 작업 최소화, 개발 속도 상승

 

(3) 종류

(3-1) 정적 라이브러리(Static Library)

- 확장자 : .lib, .a

- 특징 : 컴파일 시 프로그램에 포함되며 실행 중 별도의 라이브러리를 참고할 필요 없음

- 장점 : 외부 파일로 배포할 필요가 없음

- 단점 : 동일한 라이브러리를 사용하는 여러 프로그램이 있다면 각 프로그램의 실행 파일에 라이브러리가 중복됨

 

(3-2) 동적 라이브러리(Dynamic Library)

- 확장자 : .dll, .so, .dylib

- 특징 : 실행 시 로드되며 메모리에 적재되어 여러 프로그램에서 참조 가능

- 장점 : 메모리와 저장공간 절약, 라이브러리 업데이트 이후 프로젝트를 다시 컴파일할 필요 없음

- 단점 : 라이브러리를 불러오지 못하면 실행 불가, 라이브러리 파일이 없으면 실행 불가

 

 

2. 블루프린트 함수 라이브러리(Blueprint Function Library)

인스턴스가 필요하지 않으며 Static 함수로 구성된다.

C++에서 호출하거나 블루프린트 노드로 사용할 수 있다.

 

(1) 블루프린트 생성 - AuraBlueprintLibrary 클래스

Blueprint Function Library를 상속받는 클래스를 생성한다.

 

 

(2) 코드

오버레이 위젯 컨트롤러를 get 하는 함수를 생성한다.

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "UI/WidgetController/OverlayWidgetController.h"
#include "AuraAbilitySystemLibrary.generated.h"

/**
 * 
 */
UCLASS()
class AURA_API UAuraAbilitySystemLibrary : public UBlueprintFunctionLibrary
{
	GENERATED_BODY()
	
public:
	UFUNCTION(BlueprintPure, category="AuraAbilitySystemLibrary|WidgetController")
	static UOverlayWidgetController* GetOverlayWidgetController(const UObject* WorldContextObject);
};

GetOverlayWidgetController 함수는 위젯 컨트롤러를 가져오기 위해 월드 컨텍스트 오브젝트를 참조한다.

#include "AbilitySystem/AuraAbilitySystemLibrary.h"
#include "Kismet/GameplayStatics.h"
#include "UI/WidgetController/OverlayWidgetController.h"
#include "UI/HUD/AuraHUD.h"
#include "Player/AuraPlayerState.h"

UOverlayWidgetController* UAuraAbilitySystemLibrary::GetOverlayWidgetController(const UObject* WorldContextObject)
{
	// 로컬 플레이어의 컨트롤러 가져오기
	if (APlayerController* PC = UGameplayStatics::GetPlayerController(WorldContextObject, 0))
	{
		if (AAuraHUD* AuraHUD = Cast<AAuraHUD>(PC->GetHUD()))
		{
			// 위젯 컨트롤러 파라미터 구조체 생성
			AAuraPlayerState* PS = PC->GetPlayerState<AAuraPlayerState>();
			UAbilitySystemComponent* ASC = PS->GetAbilitySystemComponent();
			UAttributeSet* AS = PS->GetAttributeSet();

			const FWidgetControllerParams Params(PC, PS, ASC, AS);

			return AuraHUD->GetOverlayWidgetController(Params);
		}
	}
	return nullptr;
}

월드 컨텍스트 오브젝트를 통해 로컬 플레이어(인덱스 0)의 플레이어 컨트롤러를 가져온다.

이어서 컨트롤러를 캐스팅하여 AuraHUD를 가져와 HUD가 정상적으로 초기화되었다면 오버레이 위젯 컨트롤러를 가져오기 위해 각 파라미터를 가져온다.

 

 

(3) OverlayWidgetControllerParams 파라미터

① 플레이어 컨트롤러 

② 플레이어 상태(Player State) - 플레이어의 ASC는 플레이어 상태가 소유자(Owner) 이다.

③ 어빌리티 시스템 컴포넌트(ASC)

④ 특성 세트(Attribute Set)

위의 파라미터를 오버레이 위젯 컨트롤러의 getter에 사용하면, 오버레이 위젯 컨트롤러가 존재하지 않을 때 위의 파라미터를 이용하여 새롭게 생성한다.