안선생의 개발 블로그
[UE5 멀티플레이 게임 만들기] 10.HUD 만들기,WidgetController 본문
이번에는 저번에 만든 스킬창을 화면에 보이게 할 거예요
그럼 먼저 HUD클래스를 추가해 줄게요.
HUD는 클라이언트만 갖고 있답니다.
클래스를 만들어줄게요
생성해 주시고
이제 HUD클래스에 Widget을 만들고 Addtoviewport 하면 돼요
하지만 위젯은 의존성을 하나만 갖고 있었으면 좋겠어요
그래서 위젯이 의존하는 WidgetController를 하나 만들어줄라고 해요.
위젯은 앞으로 만들면 여러 개를 만들 텐데 그 위젯이 필요할 때마다 캐릭터 클래스 의존하고 스킬 의존하고
위젯마다 의존하고 있으면 나중에 유지보수가 정말 힘들어지기 때문에 위젯은 기능들을 모아둔 클래스인 WidgetController를 따로 만들어서 관리하려고 합니다.
이렇게 하면 만약에 캐릭터 클래스에서 코드가 변경되면 캐릭터 클래스를 참고하는 위젯들을 전부 바꿔줘야 돼요 나중에 위젯이 정말 많아지면 유지보수가 정말 힘들겠죠 하지만 저희가 기능을 따로 만든 WidgetController에 만들어 놓으면 캐릭터 클래스가 변경되면 위젯을 바꿀필요가 없어요 기능을 가지고 있는 WidgetController만 변경하면 돼요 이러면 유지보수 정말 쉽고 관리하기 쉽기 때문에 WidgetController를 만들어볼게요
먼저 Object 클래스를 만들어줄게요.
이름은 WidgetController로 할게요.
만들어만 둘게요 일단
그다음에 UserWidget클래스도 만들어줄게요
다음
생성해주시고
위젯은 전부 WidgetController에 의존한다 했죠?
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "Blueprint/UserWidget.h"
#include "JHUserWidget.generated.h"
/**
*
*/
UCLASS()
class JH_MULTI_RPG_API UJHUserWidget : public UUserWidget
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable)
void SetWidgetController(UObject* InWidgetController);
UPROPERTY(BlueprintReadOnly)
TWeakObjectPtr<UObject> WidgetController; //위젯컨트롤러에 의존할거임
protected:
UFUNCTION(BlueprintImplementableEvent)
void WidgetControllerSet(); //블루프린트에서 구현
};
이렇게 작성해 줄게요.
cpp에도
// Fill out your copyright notice in the Description page of Project Settings.
#include "UI/Widget/JHUserWidget.h"
void UJHUserWidget::SetWidgetController(UObject* InWidgetController)
{
WidgetController = InWidgetController; //위젯컨트롤러 설정
WidgetControllerSet(); //블루프린트에서 구현합니다.
}
이렇게 작성해 줄게요.
그럼 위젯을 만들고 위젯 컨트롤러를 설정해 주면 WidgetController에 기능을 사용할 수 있어요.
HUD에서 해볼게요.
HUD
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/HUD.h"
#include "JHHUD.generated.h"
class UJHUserWidget;
class UJHWidgetController;
class UOverlayWidgetController;
class USkillComponent;
/**
*
*/
UCLASS()
class JH_MULTI_RPG_API AJHHUD : public AHUD
{
GENERATED_BODY()
public:
//virtual void Tick(FGeometry MyGeometry, float InDeleaTIme) override;
void InitOverlay(USkillComponent* SC);
private:
UPROPERTY()
TObjectPtr<UJHUserWidget> OverlayWidget;
UPROPERTY(EditAnywhere)
TSubclassOf<UJHUserWidget> OverlayWidgetClass;
UPROPERTY(BlueprintReadWrite, meta=(AllowPrivateAccess = ture))
TObjectPtr<UJHWidgetController> OverlayWidgetController;
UPROPERTY(EditAnywhere)
TSubclassOf<UJHWidgetController> OverlayWidgetControllerClass;
};
위젯과 컨트롤러를 만들어야기 때문에 각각 멤버 변수로 설정해 주고
cpp
// Fill out your copyright notice in the Description page of Project Settings.
#include "UI/JHHUD.h"
#include "UI/Widget/JHUserWidget.h"
#include "UI/WidgetController/JHWidgetController.h"
void AJHHUD::InitOverlay(USkillComponent* SC)
{
OverlayWidget = CreateWidget<UJHUserWidget>(GetWorld(), OverlayWidgetClass);
OverlayWidgetController = NewObject<UJHWidgetController>(this, OverlayWidgetControllerClass);
OverlayWidget->SetWidgetController(OverlayWidgetController);
OverlayWidget->AddToViewport();
}
이 함수는 OverlayWidget을 만들어주고 OverlayWidgetController도 만들어 준 다음에 Overlay위젯에다 만들어준 OverlayWidgetContoller을 SetWidgetController 해줘서 OverlayWidget에서 OverlayWidgetController를 쓸 수 있게 해 줬어요 그리고 화면에 보이게 AddtoViewprot를 해줬어요.
이제 이 함수를 호출해야 하는데 어디서 해야 하냐면 SkillComponent는 캐릭터 클래스에 있으니깐 캐릭터 클래스에서 호출해 줘야 돼요.
캐릭터 클래스로 가볼게요
BeginPlay에서 호출해 줍시다.
void AJHCharacter::BeginPlay()
{
Super::BeginPlay();
if (APlayerController* PlayerController = Cast<APlayerController>(Controller))
{
if (UEnhancedInputLocalPlayerSubsystem* Subsystem = ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(PlayerController->GetLocalPlayer()))
{
Subsystem->AddMappingContext(DefaultMappingContext, 0);
Subsystem->AddMappingContext(InventoryContext, 0);
}
}
if (IsLocallyControlled())
{
JH_PlayerController = Cast<AJH_PlayerController>(Controller);
if (JH_PlayerController)
{
AJHHUD* JHHUD = Cast<AJHHUD>(JH_PlayerController->GetHUD());
if (JHHUD)
{
JHHUD->InitOverlay(SkillComponent,JHInventoryComponent,HealthComponent);
}
}
}
}
자 이렇게 Beginplay에서 호출해 주고 실행 눌러볼게요
이제 저희가 만든 위젯클래스를 바꿔줘야 돼요 그래야 쓸 수 있겠죠?
위젯에 들어가서 그래프->클래스 세팅 -> 부모 클래스 변경
아래 부모클래스를 바꿔줘야 돼요
이렇게 저희가 만든 Widget클래스로 위젯 전부 다 바꿔주세요.
이제 그런 다음에 HUD블루프린트 클래스를 만들어줄게요
만들어주시고
저희가 만들 클래스를 지정해 줘야겠죠
이렇게 지정해 주시고
마지막으로 프로젝트 세팅 들어가서
이렇게 HUD도 만들 걸로 바꿔주신 다음에 실행해 보시면
짜잔
게임화면에 보이는 거를 볼 수 있어요
리슨서버에서도 해볼게요
짜잔 모든 서버와 클라이언트에서 보이는거를 볼 수 있어요.
그럼 다음 시간에는 데이터에셋을 이용하여 스킬을 관리하고 스킬창에 스킬 이미지를 보이게 해 볼게요!
'언리얼 > 멀티플레이 게임 만들어보자' 카테고리의 다른 글
[UE5 멀티플레이 게임 만들기] 12. 화면에 스킬이미지 띄우기 (0) | 2024.01.25 |
---|---|
[UE5 멀티플레이 게임 만들기] 11. Skill DataAsset (0) | 2024.01.21 |
[UE5 멀티플레이 게임 만들기] 9.HUD SKillOverlay (0) | 2024.01.14 |
[UE5 멀티플레이 게임 만들기] 8. HUD-Skill Slot만들기 (0) | 2024.01.11 |
[UE5 멀티플레이 게임 만들기]7. HUD - Widget 만들기 (0) | 2024.01.08 |