Widget in World

3D ¿ùµå¿¡ 2D À§Á¬À» Ç¥½Ã ÇÑ´Ù.
ij¸¯ÅÍ À§¿¡ HP¹Ù³ª ij¸¯ÅÍÀÇ Ç³¼± µµ¿ò¸»À» Ç¥½Ã ÇÒ¼ö ÀÖ´Ù.

1. Widget ¸¸µé±â

°èÃþ ±¸Á¶¿¡¼­ ·çÆ® ĵ¹Ù½º¸¦ ÁöÁ¤ÇÑ´Ù.
¿À¸¥ÂÊ À§ È­¸éÅ©±â ¿·¿¡ "FullScreen"À» "Custom"À¸·Î º¯°æ ÈÄ¿¡ ³Êºñ¿Í  ³ôÀ̸¦ ÁöÁ¤ÇÑ´Ù.
¿©±â¼­´Â 200X34 Å©±â·Î ÁöÁ¤Çß´Ù.




2. Å×½ºÆ®¸¦ À§ÇÑ ºó ¾×Å͸¦ ¸¸µé±â

ºó ¾×ÅÍ´Â Actor¸¦ »ó¼ÓÇÏ¿© ¸¸µç´Ù.
ºó ¾×ÅÍ¿¡ DrawDebugSphere ÇÔ¼ö·Î ±¸¸¦ Ç¥½Ã ÇÑ´Ù.

ºó ¾×ÅÍ »ý¼ºÀº tutorial14.htmlÀ» Âü°í ÇÑ´Ù.
ºó ¾×Å͸¦ »ý¼ºÈÄ Widget Ãß°¡´Â ´ÙÀ½°ú °°ÀÌ ÇÑ´Ù.

3-1 »ý¼ºÀÚ¿¡¼­ Widget Ãß°¡ ÇÏ´Â ¹æ¹ý

CreateDefaultSubobject·Î À§Á¬ ÄÄÆ÷³ÍÆ®¸¦ »ý¼ºÇÑ´Ù.
À§Á¬À» RootComponentÀÇ ÀÚ½ÄÀ¸·Î Ãß°¡ ÇÑ´Ù.
À§Á¬ÀÇ Space´Â 2DÀ̹ǷΠEWidgetSpace::ScreenÀ¸·Î ÁöÁ¤ÇÑ´Ù.
À§Á¬ ¸®¼Ò½º¸¦ ·ÎµùÇÑ´Ù.
À¯Àú À§Á¬ Ŭ·¡½º¸¦  ÁöÁ¤ÇÑ´Ù.
WidgetÀÇ SetDrawSize¸¦ Custom »çÀÌÁî¿Í µ¿ÀÏÇÏ°Ô ÁöÁ¤ Çϴ°ÍÀÌ Áß¿äÇÏ´Ù.

UWidgetComponent* Widget = CreateDefaultSubobject<UWidgetComponent>(TEXT("TargetWidget"));
Widget->SetupAttachment(RootComponent);
Widget->SetWidgetSpace(EWidgetSpace::Screen);

static ConstructorHelpers::FClassFinder<UUserWidget> UI_WIDGET(TEXT("/Game/blueprint/BP_MyText_Widget.BP_MyText_Widget_C"));

if (UI_WIDGET.Succeeded())
{
    Widget->SetWidgetClass(UI_WIDGET.Class);
    Widget->SetDrawSize(FVector2D(200.0f, 34.0f));
}

#include "EmptyActor.h"
#include "Components/SphereComponent.h"
#include "Components/StaticMeshComponent.h"
#include "DrawDebugHelpers.h"
#include "Blueprint/UserWidget.h"
#include "Components/WidgetComponent.h

AEmptyActor::AEmptyActor(const FObjectInitializer& ObjectInitializer)
{
    PrimaryActorTick.bCanEverTick = true;

    USceneComponent* SceneComponent = ObjectInitializer.CreateDefaultSubobject<USceneComponent>(this, TEXT("RootComponent"));
    SceneComponent->SetMobility(EComponentMobility::Movable);
    SetRootComponent(SceneComponent);

    USphereComponent* SphereComponent = CreateDefaultSubobject<USphereComponent>(TEXT("SphereComponent"));
    SphereComponent->InitSphereRadius(10.0f);
    SphereComponent->SetCollisionProfileName(TEXT("Pawn"));
    SphereComponent->SetupAttachment(RootComponent);

    //1¹ø ¹æ½Ä - »ý¼ºÀÚ¿¡¼­ Widget Ãß°¡
    UWidgetComponent* Widget = CreateDefaultSubobject<UWidgetComponent>(TEXT("TargetWidget"));
    Widget->SetupAttachment(RootComponent);
    Widget->SetWidgetSpace(EWidgetSpace::Screen);

    static ConstructorHelpers::FClassFinder<UUserWidget> UI_WIDGET(TEXT("/Game/blueprint/BP_MyText_Widget.BP_MyText_Widget_C"));

    if (UI_WIDGET.Succeeded())
    {
        Widget->SetWidgetClass(UI_WIDGET.Class);
        Widget->SetDrawSize(FVector2D(200.0f, 34.0f));  //ÀÌ°Í Áß¿äÇÏ´Ù... ¾ÈÇϸé È­¸é Àüü·Î ±×·Á ÁÂÇ¥°¡ ÀÌ»óÇÏ´Ù.
    } 
}

void AEmptyActor::BeginPlay()
{
    Super::BeginPlay();
   
    UWorld* World = GetWorld();
    if (World)
    {
        float Radius = 10.0f;
        FVector Center = GetActorLocation();
        DrawDebugSphere(World, Center, Radius, 16, FColor(181, 0, 0), true, -1, 0, 1.0f);
    }
}

void AEmptyActor::Tick(float DeltaTime)
{
    Super::Tick(DeltaTime);
}


3-2 BeginPlay¿¡¼­ Widget Ãß°¡

»ý¼ºÀÚ¿¡¼­ ´ÙÀ½°ú °°Àº ¸í·ÉÀ» ½ÇÇàÇÑ´Ù.
CreateDefaultSubobject·Î À§Á¬ ÄÄÆ÷³ÍÆ®¸¦ »ý¼ºÇÑ´Ù.
À§Á¬À» RootComponentÀÇ ÀÚ½ÄÀ¸·Î Ãß°¡ ÇÑ´Ù.
À§Á¬ÀÇ Space´Â 2DÀ̹ǷΠEWidgetSpace::ScreenÀ¸·Î ÁöÁ¤ÇÑ´Ù.

UWidgetComponent* Widget = CreateDefaultSubobject<UWidgetComponent>(TEXT("TargetWidget"));
Widget->SetupAttachment(RootComponent);
Widget->SetWidgetSpace(EWidgetSpace::Screen);

BeginPlay¿¡¼­ ´ÙÀ½°ú °°Àº ¸í·ÉÀ» ½ÇÇàÇÑ´Ù.
»ý¼ºÀÚ¿¡¼­ ¸¸µç À§Á¬ Ŭ·¡½º¸¦ ã´Â´Ù.
À§Á¬ ¸®¼Ò½º¸¦ ·ÎµùÇÑ´Ù.
UserWidget ÀνºÅϽº¸¦ »ý¼º½Ã À§Á¬ ¸®¼Ò½º¸¦ ÁöÁ¤ÇÑ´Ù.
À¯Àú À§Á¬ Ŭ·¡½º¸¦  ÁöÁ¤ÇÑ´Ù.
WidgetÀÇ SetDrawSize¸¦ Custom »çÀÌÁî¿Í µ¿ÀÏÇÏ°Ô ÁöÁ¤ Çϴ°ÍÀÌ Áß¿äÇÏ´Ù.

UWidgetComponent* Widget = this->FindComponentByClass<UWidgetComponent>();

if (Widget && Widget->GetName() == TEXT("TargetWidget"))
{
    FStringClassReference WidgetRef(TEXT("/Game/blueprint/BP_MyText_Widget.BP_MyText_Widget_C"));

    if (UClass* WidgetClass = WidgetRef.TryLoadClass<UUserWidget>())
    {
        UUserWidget* UserWidget = CreateWidget<UUserWidget>(GetWorld(), WidgetClass);
        Widget->SetWidgetClass(UserWidget->GetClass());
        Widget->SetDrawSize(FVector2D(200.0f, 34.0f));
    }
}

#include "EmptyActor.h"
#include "Components/SphereComponent.h"
#include "Components/StaticMeshComponent.h"
#include "DrawDebugHelpers.h"
#include "Blueprint/UserWidget.h"
#include "Components/WidgetComponent.h

AEmptyActor::AEmptyActor(const FObjectInitializer& ObjectInitializer)
{
    PrimaryActorTick.bCanEverTick = true;

    USceneComponent* SceneComponent = ObjectInitializer.CreateDefaultSubobject<USceneComponent>(this, TEXT("RootComponent"));
    SceneComponent->SetMobility(EComponentMobility::Movable);
    SetRootComponent(SceneComponent);

    USphereComponent* SphereComponent = CreateDefaultSubobject<USphereComponent>(TEXT("SphereComponent"));
    SphereComponent->InitSphereRadius(10.0f);
    SphereComponent->SetCollisionProfileName(TEXT("Pawn"));
    SphereComponent->SetupAttachment(RootComponent);

    //2¹ø ¹æ½Ä - BeginPlay¿¡¼­ Widget Ãß°¡
    UWidgetComponent* Widget = CreateDefaultSubobject<UWidgetComponent>(TEXT("TargetWidget"));
    Widget->SetupAttachment(RootComponent);
    Widget->SetWidgetSpace(EWidgetSpace::Screen); 
}

void AEmptyActor::BeginPlay()
{
    Super::BeginPlay();
   
    UWorld* World = GetWorld();
    if (World)
    {
        float Radius = 10.0f;
        FVector Center = GetActorLocation();
        DrawDebugSphere(World, Center, Radius, 16, FColor(181, 0, 0), true, -1, 0, 1.0f);
    }

    //2¹ø ¹æ½Ä - BeginPlay¿¡¼­ Widget Ãß°¡
    UWidgetComponent* Widget = this->FindComponentByClass<UWidgetComponent>();

    if (Widget && Widget->GetName() == TEXT("TargetWidget"))
    {
        FStringClassReference WidgetRef(TEXT("/Game/blueprint/BP_MyText_Widget.BP_MyText_Widget_C"));

        if (UClass* WidgetClass = WidgetRef.TryLoadClass<UUserWidget>())
        {
            UUserWidget* UserWidget = CreateWidget<UUserWidget>(GetWorld(), WidgetClass);
            Widget->SetWidgetClass(UserWidget->GetClass());
            Widget->SetDrawSize(FVector2D(200.0f, 34.0f));  //ÀÌ°Í Áß¿äÇÏ´Ù... ¾ÈÇϸé È­¸é Àüü·Î ±×·Á ÁÂÇ¥°¡ ÀÌ»óÇÏ´Ù.
        }
    }
}

void AEmptyActor::Tick(float DeltaTime)
{
    Super::Tick(DeltaTime);
}

½ÇÇà È­¸éÀº ´ÙÀ½°ú °°´Ù.



¹®Á¦Á¡ :  À§Á¬ "TEXT SHOW"´Â 3D º®À̳ª Àå¾Ö¹°¿¡ °¡·Á ÄøµÀÌ ÀÚµ¿À¸·Î ¾ÈµÈ´Ù.
           º®ÀÌ ÀÖÀ¸¸é ij¸¯ÅÍ´Â ¼û¾îµµ GUI´Â ·»´õ¸µÀÌ µÈ´Ù.
            3D ¸Þ½¬¿¡ ÀÇÇØ Äøµ µÇ´Â ¹æ¹ýÀº ¾ÆÁ÷ ãÁö¸¦ ¸øÇß´Ù.