UISystem - osy9611/ProjectPT GitHub Wiki

UISystem

Project PT๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ Unity์—์„œ ์‚ฌ์šฉํ–ˆ๋˜ UI ๊ด€๋ฆฌ ๋ฐฉ์‹์„ Unreal ํ™˜๊ฒฝ์— ๋งž์ถฐ ๋ณ€๊ฒฝํ•˜์˜€๋‹ค. ์ด ๋ฌธ์„œ๋Š” Unity์—์„œ ์‚ฌ์šฉํ–ˆ๋˜ UI ๊ด€๋ฆฌ ๋ฐฉ์‹๊ณผ Unreal์—์„œ ์ƒˆ๋กญ๊ฒŒ ์ ์šฉํ•œ ๋ฐฉ์‹์„ ์ •๋ฆฌํ•œ ๋ฌธ์„œ์ด๋‹ค.

Unity์˜ UISystem ๊ตฌ์กฐ

๊ธฐ์กด Unity UI ์‹œ์Šคํ…œ ๊ฐœ์š”

  • Unity ์—์„œ๋Š” UI๋ฅผ Stack๊ธฐ๋ฐ˜์œผ๋กœ ๊ด€๋ฆฌํ•˜์—ฌ ์ด์ „ UI ์ƒํƒœ๋ฅผ ์ถ”์ ํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ–ˆ๋‹ค.
  • UIManager๊ฐ€ UI ์ƒ์„ฑ, ๊ฒ€์ƒ‰ ๋ฐ ์ œ๊ฑฐ๋ฅผ ์ง์ ‘ ์ฒ˜๋ฆฌํ–ˆ๋‹ค.

Uniyt์—์„œ ์‚ฌ์šฉํ•œ UI ๊ตฌ์กฐ

  • UI ํƒ€์ž… ๊ตฌ๋ถ„

    UI ํƒ€์ž… ์„ค๋ช… ์˜ˆ์‹œ
    Static ํ•ญ์ƒ ์œ ์ง€๋˜๋Š” UI (Stack์œผ๋กœ ๊ด€๋ฆฌ๋จ) ๋ฉ”์ธ ๋กœ๋น„, ์„ค์ • ์ฐฝ, ์บ๋ฆญํ„ฐ ์ƒํƒœ์ฐฝ
    Dynamic ๋™์ ์œผ๋กœ ์ƒ์„ฑ๋˜๋ฉฐ Stack์œผ๋กœ ๊ด€๋ฆฌ๋˜์ง€ ์•Š์Œ ์ธ๋ฒคํ† ๋ฆฌ, ํ€˜์ŠคํŠธ, UI, ์•„์ดํ…œ ์ •๋ณด์ฐฝ
    System ๊ฒŒ์ž„ ์ „์—ญ์—์„œ ์‚ฌ์šฉ๋˜๋Š” UI ์•Œ๋ฆผ ๋ฉ”์‹œ์ง€, ํŒ์—… ์ฐฝ

Unreal์˜ UISystem ์ ์šฉ ๊ณผ์ •

Unity์—์„œ ์‚ฌ์šฉํ–ˆ๋˜ UIManager ๊ตฌ์กฐ๋ฅผ Unreal ์— ๋งž๊ฒŒ ๋ณ€๊ฒฝํ•˜์˜€๋‹ค.

UIManagerSubsystem ๋„์ž…

  • Unity์—์„œ๋Š” UIManager๊ฐ€ UI๋ฅผ ์ง์ ‘ ๊ด€๋ฆฌํ–ˆ์ง€๋งŒ, Unreal์—์„œ๋Š” UIManagerSubsystem ์„ ํ™œ์šฉํ•˜์—ฌ UI๋ฅผ ์ค‘์•™์—์„œ ๊ด€๋ฆฌ

  • ์ฃผ์š” ์ฝ”๋“œ

    void UUIManagerSubsystem::CreateLayoutWidget(UCommonLocalPlayer* LocalPlayer)
    {
        if (!LocalPlayer)
        {
            UE_LOG(LogTemp, Error, TEXT("[UIManageSubsystem]This PlayerController is Nullptr"));
            return;
        }
    
        if (CurrentWidgetClass == nullptr)
        {
            TSubclassOf<UCommonUserWidgetBase> WidgetClass = DefualtWidget.LoadSynchronous();
            RegisterWidget(WidgetClass);
        }
    
        check(CurrentWidgetClass);
        if (APlayerController* PlayerController = LocalPlayer->GetPlayerController(GetWorld()))
        {
            if (UCommonUserWidgetBase* NewWidgetBase = CreateWidget<UCommonUserWidgetBase>(PlayerController, CurrentWidgetClass))
            {
                CurrentWidget = NewWidgetBase;
                AddToLayoutViewport(LocalPlayer);
            }
        }
    }

GameplayTag ๊ธฐ๋ฐ˜ UI ๊ณ„์ธต ๊ตฌ์กฐ

  • GameplayTag๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ UI๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌ

    UI Layer
    โ”œโ”€โ”€ System UI (GameplayTag: UI.System)
    โ”‚   โ”œโ”€โ”€ ์•Œ๋ฆผ ๋ฉ”์‹œ์ง€
    โ”‚   โ”œโ”€โ”€ ํŒ์—… ์ฐฝ
    โ”‚   โ””โ”€โ”€ ํŠœํ† ๋ฆฌ์–ผ UI
    โ”œโ”€โ”€ Static UI (GameplayTag: UI.Static)
    โ”‚   โ”œโ”€โ”€ ๋ฉ”์ธ ๋กœ๋น„ UI
    โ”‚   โ”œโ”€โ”€ ์„ค์ • ์ฐฝ
    โ”‚   โ””โ”€โ”€ ์บ๋ฆญํ„ฐ ์ƒํƒœ์ฐฝ
    โ””โ”€โ”€ Dynamic UI (GameplayTag: UI.Dynamic)
        โ”œโ”€โ”€ ์ธ๋ฒคํ† ๋ฆฌ UI
        โ”œโ”€โ”€ ํ€˜์ŠคํŠธ UI
        โ””โ”€โ”€ ์•„์ดํ…œ ์ •๋ณด์ฐฝ
  • GameplayTag์„ ํ™œ์šฉํ•œ UI ํƒ์ƒ‰ ๋ฐ ๋“ฑ๋ก

    void UCommonUserWidgetBase::RegisterLayer(FGameplayTag LayerTag, UCommonActivatableWidgetContainerBase* LayerWidget)
    {
        if (!IsDesignTime())
        {
            LayerWidget->SetTransitionDuration(0.0);
            Layers.Add(LayerTag, LayerWidget);
        }
    }

UI ์žฌ์‚ฌ์šฉ์„ ์œ„ํ•œ ์บ์‹ฑ

  • ๋น„ํ™œ์„ฑํ™”๋œ UI๋ฅผ ์บ์‹ฑํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ UI ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐฉ์ง€

  • UI ์ƒํƒœ ์ €์žฅ โ†’ ๋น„ํ™œ์„ฑํ™” ์ „ ์ƒํƒœ ๋ณต์› ๊ฐ€๋Šฅ

    void UCommonActivatableWidgetBase::NativeOnDeactivated()
    {
        Super::NativeOnDeactivated();
    
        if (!CacheWidgets.IsEmpty())
        {
            for (FUserWidgetData& WidgetInfo : CacheWidgets)
            {
                if (WidgetInfo.IsActivated())
                {
                    PrevVisibleWidgets.Add(WidgetInfo);
                    WidgetInfo.SetActiveWidget(false);
                }
            }
        }
    }
โš ๏ธ **GitHub.com Fallback** โš ๏ธ