본문 바로가기

언리얼5/언리얼5 개발

UE Hpbar 만들기

0. 슬라이더 체력바 만들기

1. Userwidget을  상속받는 hpbar 클래스를 생성한다.

2. 케릭터 클래스에서 체력바를 붙일수있게 위젯 컴포넌트를  생성한다.

3. 케릭터와 Ui와 간접 커플링하기위해 interface를 생성한다

4. Ui가 초기화되는 시점에서 interface로 가져온 케릭터 정보로 셋업을 진행한다.


캐릭터 UWidgetComponent 구현부

HpBar = CreateDefaultSubobject<UABWidgetComponent>(TEXT("Widget"));
	HpBar->SetupAttachment(GetMesh());
	HpBar->SetRelativeLocation(FVector(0.0f, 0.0f, 180.0f));
	static ConstructorHelpers::FClassFinder<UUserWidget> HpBarWidgetRef(TEXT("/Game/ArenaBattle/UI/WBP_HpBar.WBP_HpBar_C"));

 

컴포넌트란 다른 대상에게 붙착이 가능하게끔 만들어진 존재입니다.

여기서는 캐릭터 매쉬 하위에 붙착하기 위해 HPBar를 위젯 컴포넌트를 사용합니다.

 

HPBar 초기화

	HpBar = CreateDefaultSubobject<UWidgetComponent>("Widget");
	HpBar->SetupAttachment(GetMesh());
	HpBar->SetRelativeLocation(FVector(0.0f,0.0f,180.0f));
	static ConstructorHelpers::FClassFinder<UUserWidget> HpBarWidget_Ref(TEXT("/Game/Ui/BP_HPBar.BP_HPBar_C"));
	if(HpBarWidget_Ref.Class)
	{
		HpBar->SetWidgetClass( HpBarWidget_Ref.Class);
		HpBar->SetWidgetSpace(EWidgetSpace::Screen);
		HpBar->SetDrawSize(FVector2D(200.0f,17.0f));
		HpBar->SetCollisionEnabled(ECollisionEnabled::NoCollision);
	}

 

SetRelativeLocation 상대적위치정의 말그대로 붙착된 매쉬를 0,0,0 기준으로 좌표를 정의합니다. 

블루프린트로 생성한 Ui의 레퍼런스로 위젯 컴포넌트의 클래스를 초기화 합니다.

SetWidgetSpace의 EwidgetSpace Screen 타입은 유니티의 월드 스페이스와 동일합니다. Default 설정값은 World 입니다.

 

 

 

hpbar 헤더

public:
	UABHpBarWidget(const FObjectInitializer& ObjectInitializer);

protected:
	virtual void NativeConstruct() override;

public:
	FORCEINLINE void SetMaxHp(float NewMaxHp) { MaxHp = NewMaxHp; }
	void UpdateHpBar(float NewCurrentHp);

protected:
	UPROPERTY()
	TObjectPtr<class UProgressBar> HpProgressBar;

	UPROPERTY()
	float MaxHp;

 

생성자

UABHpBarWidget();

UObject 생성자의 기본 타입이다

이 생성자는 클래스 티폴트 오브젝트 CDO를 초기화시키는데 이는 앞으로의 클래스 인스턴의 기반이 되는 사본체이다.

 

UABHpBarWidget(const FObjectInitializer& ObjectInitializer)
{
	CDO 프로퍼티를 초기화시킨다.
}

해당 생성자는 어디에서도 실제로 초기화 작업을 하지않는다 하지만 CDO로 instance를 만들어내면 해당 정보는 

CreateObject() 또는 SpawnActor 함수를 통해서 이전 만들어진 CDO를 토대로 복사될것이다.

생성자에 전달되는 FObjectInitalizer 파라미터는 프로퍼티와 서브오브젝트를 const 관계 없이 덮어쓸수있습니다.

생성되는 UObject는 이러한 변경사항에 영향을 받을 것이며 이를 사용해서 등록된 프로퍼티 또는 컴포넌트의 값을 변경할 수 있습니다.

 

virtual void NativeConstruct() override;

위젯의 초기화 시점에서 호출되는 함수입니다.

해당 함수로 위젯의 프로그래스마를 이름으로 찾아와 변수를 초기화합니다.

void UABHpBarWidget::NativeConstruct()
{
	Super::NativeConstruct();

	HpProgressBar = Cast<UProgressBar>(GetWidgetFromName(TEXT("PbHpBar")));
	ensure(HpProgressBar);

	IABCharacterWidgetInterface* CharacterWidget = Cast<IABCharacterWidgetInterface>(OwningActor);
	if (CharacterWidget)
	{
		CharacterWidget->SetupCharacterWidget(this);
	}
}