Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

114 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

CustomUI

CustomUI๋Š” Unreal Engine 5 ํ”„๋กœ์ ํŠธ์—์„œ ๊ณตํ†ต UMG ์œ„์ ฏ ๊ธฐ๋ฐ˜ ํด๋ž˜์Šค, ํŒ์—…/๋“ฑ๋ก ์œ„์ ฏ ๊ด€๋ฆฌ, ๋ฒ„ํŠผ ๊ณ„์—ด ์ปดํฌ๋„ŒํŠธ, ๋ฆฌ์น˜ ํ…์ŠคํŠธ ํƒ€์ดํ•‘, ๋งˆํ‚ค(ํ๋ฅด๋Š”) ์œ„์ ฏ, String Table ์กฐํšŒ ํ—ฌํผ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋Ÿฐํƒ€์ž„ UI ํ”Œ๋Ÿฌ๊ทธ์ธ์ด๋‹ค.

์ด ๋ฌธ์„œ๋Š” Plugins/CustomUIPlugin์˜ ํ˜„์žฌ ์ฝ”๋“œ ๊ธฐ์ค€์œผ๋กœ ์œ ์ง€๋˜๋Š” ๊ธฐ์ˆ  README๋‹ค. ์‹ค์ œ ์‚ฌ์šฉ ์ ˆ์ฐจ ์ค‘์‹ฌ ๋ฌธ์„œ๋Š” UserGuide.md๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.


ํ•ต์‹ฌ ์š”์•ฝ

  • ํ”Œ๋Ÿฌ๊ทธ์ธ์€ CustomUI ๋Ÿฐํƒ€์ž„ ๋ชจ๋“ˆ ํ•˜๋‚˜๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.
  • CommonLibrary ํ”Œ๋Ÿฌ๊ทธ์ธ์— ์˜์กดํ•œ๋‹ค.
  • ์ „์—ญ UI ์„ค์ •์€ UCustomUIDeveloperSettings์— ์ €์žฅํ•œ๋‹ค.
  • UWidgetSubsystem์€ LocalPlayer ๋‹จ์œ„๋กœ ๋“ฑ๋ก ์œ„์ ฏ๊ณผ ํŒ์—… ์Šคํƒ์„ ๊ด€๋ฆฌํ•œ๋‹ค.
  • UWidgetHelper๋Š” Blueprint/C++์—์„œ ๋“ฑ๋ก ์œ„์ ฏ ์กฐํšŒ, ํŒ์—… ์—ด๊ธฐ/๋‹ซ๊ธฐ, String Table ํ…์ŠคํŠธ ์กฐํšŒ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
  • UWidgetBase๋Š” Show/Idle/Hide ์ƒํƒœ์™€ ShowAnim, IdleAnim, HideAnim ์• ๋‹ˆ๋ฉ”์ด์…˜ ํ๋ฆ„์„ ํ‘œ์ค€ํ™”ํ•œ๋‹ค.
  • UPopupBase๋Š” OpenPopup์œผ๋กœ Viewport์— ์ถ”๊ฐ€๋˜๊ณ , Close ์‹œ ํŒ์—… ์Šคํƒ์—์„œ ์ •๋ฆฌ๋œ๋‹ค.
  • UPageBase์™€ Page API๋Š” ํ˜„์žฌ FEATURE_PAGE=0์ด๊ณ  Deprecated ์ฒ˜๋ฆฌ๋˜์–ด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฐœ๋…์ด๋‹ค.
  • ๋ฒ„ํŠผ ๊ณ„์—ด์€ UButtonBase๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ Click, Toggle, Radio, RadioButtonGroup์„ ์ œ๊ณตํ•œ๋‹ค.
  • UTypingRichTextBlock์€ RichText ๋งˆํฌ์—…์„ ์œ ์ง€ํ•˜๋ฉด์„œ ๊ธ€์ž ๋‹จ์œ„ ํƒ€์ดํ•‘์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
  • UMarqueeWidgetBase๋Š” ์Šฌ๋กฏ ์ฝ˜ํ…์ธ ๋ฅผ ๊ฐ€๋กœ/์„ธ๋กœ๋กœ ์Šคํฌ๋กค ๋˜๋Š” ์™•๋ณต ์Šคํฌ๋กคํ•œ๋‹ค.

๋ชจ๋“ˆ ๊ตฌ์„ฑ

ํ”Œ๋Ÿฌ๊ทธ์ธ์€ CommonLibrary ํ”Œ๋Ÿฌ๊ทธ์ธ์— ์˜์กดํ•œ๋‹ค.

๋ชจ๋“ˆ ์—ญํ• 
CustomUI ๋Ÿฐํƒ€์ž„ UI ๊ธฐ๋ฐ˜ ํด๋ž˜์Šค, LocalPlayer Subsystem, Widget Helper, Widget Registry, Popup ๊ด€๋ฆฌ, ๋ฒ„ํŠผ/ํ…์ŠคํŠธ/๋งˆํ‚ค ์œ„์ ฏ ์ปดํฌ๋„ŒํŠธ

CustomUI.Build.cs์˜ ์ฃผ์š” ์˜์กด ๋ชจ๋“ˆ:

  • Core, CoreUObject, Engine
  • InputCore
  • UMG
  • CommonLibrary
  • DeveloperSettings
  • Slate, SlateCore(Private)

๋นŒ๋“œ ์ •์˜:

์ •์˜ ํ˜„์žฌ ๊ฐ’ ์˜๋ฏธ
FEATURE_PAGE 0 Page ์‹œ์Šคํ…œ ๋น„ํ™œ์„ฑํ™”. UPageBase/OpenPage๋Š” Deprecated ๊ฒฝ๋กœ๋‹ค.

์ฃผ์š” ๋Ÿฐํƒ€์ž„ ํƒ€์ž…

UCustomUIDeveloperSettings

ํŒŒ์ผ: Source/CustomUI/Public/CustomUIDeveloperSettings.h

Project Settings์— ์ €์žฅ๋˜๋Š” ์ „์—ญ ์„ค์ •์ด๋‹ค.

์„ค์ • ์˜๋ฏธ
_StringTables UStringTableSubsystem์ด ์‹œ์ž‘ ์‹œ ๋กœ๋“œํ•  String Table ๋ชฉ๋ก
_WidgetRegistryDataAsset UWidgetSubsystem์ด ๋“ฑ๋ก ์œ„์ ฏ ๋ชฉ๋ก์œผ๋กœ ์‚ฌ์šฉํ•  Data Asset

UStringTableSubsystem

ํŒŒ์ผ: Source/CustomUI/Public/StringTableSubsystem.h

UGameInstanceSubsystem์ด๋‹ค. ์‹œ์ž‘ ์‹œ UCustomUIDeveloperSettings::_StringTables๋ฅผ ๋™๊ธฐ ๋กœ๋“œํ•˜๊ณ , String Table ์—์…‹ ์ด๋ฆ„์„ StringTableId๋กœ ๋งคํ•‘ํ•œ๋‹ค.

์ฃผ์š” API:

FText UStringTableSubsystem::FindTextFromTable(const FString& _table_name, const FString& _key);

UWidgetHelper::GetStringTableText์™€ GETTEXT(_table_name, _key) ๋งคํฌ๋กœ๊ฐ€ ์ด API๋ฅผ ๊ฐ์‹ผ๋‹ค.

์ฃผ์˜:

  • _table_name์€ ํ˜„์žฌ ์ฝ”๋“œ์ƒ String Table ์—์…‹์˜ GetName() ๊ธฐ์ค€์ด๋‹ค.
  • ์„ค์ •์— ์—†๋Š” ํ…Œ์ด๋ธ” ์ด๋ฆ„์„ ๋„˜๊ธฐ๋ฉด ๋นˆ FName ๊ธฐ๋ฐ˜์œผ๋กœ ์กฐํšŒ๋˜๋ฏ€๋กœ, Project Settings์˜ _StringTables ๋“ฑ๋ก์„ ๋จผ์ € ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.

UWidgetRegistryDataAsset

ํŒŒ์ผ: Source/CustomUI/Public/WidgetRegistryDataAsset.h

๊ณต์šฉ ์œ„์ ฏ ํด๋ž˜์Šค๋ฅผ ์ด๋ฆ„์œผ๋กœ ๋“ฑ๋กํ•˜๋Š” Data Asset์ด๋‹ค.

๋ฐ์ดํ„ฐ ์˜๋ฏธ
_WidgetClassMap FName -> TSubclassOf<UWidgetBase> ๋งคํ•‘

UWidgetSubsystem์€ ์ดˆ๊ธฐํ™” ์‹œ ์ด ๋งต์„ ์ฝ์–ด _RegisteredWidgetDataMap์„ ๋งŒ๋“ ๋‹ค. GetRegisteredWidget ํ˜ธ์ถœ ์‹œ ์ธ์Šคํ„ด์Šค๊ฐ€ ์—†์œผ๋ฉด ์ง€์—ฐ ์ƒ์„ฑํ•˜๊ณ  ์ดํ›„ ๊ฐ™์€ ์ธ์Šคํ„ด์Šค๋ฅผ ์žฌ์‚ฌ์šฉํ•œ๋‹ค.

UWidgetSubsystem

ํŒŒ์ผ: Source/CustomUI/Public/WidgetSubsystem.h

ULocalPlayerSubsystem์ด๋‹ค. LocalPlayer/PlayerController ๊ธฐ์ค€์œผ๋กœ UI ์ธ์Šคํ„ด์Šค๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.

์ฃผ์š” ์ฑ…์ž„:

  • Widget Registry ๋กœ๋“œ ๋ฐ ๋“ฑ๋ก ์œ„์ ฏ ์ง€์—ฐ ์ƒ์„ฑ
  • Popup ์ƒ์„ฑ, Viewport ์ถ”๊ฐ€, ์Šคํƒ ๊ด€๋ฆฌ
  • Popup ์ค‘๋ณต/์ฐจ๋‹จ ๊ทœ์น™ ์ ์šฉ
  • Level ๋ณ€๊ฒฝ ๋˜๋Š” PlayerController ๋ณ€๊ฒฝ ์‹œ ๋‚จ๊ธธ Popup ๋ณต๊ตฌ
  • UInputSettings::DoubleClickTime์„ UClickButton ๋”๋ธ”ํด๋ฆญ ์ž„๊ณ„๊ฐ’์œผ๋กœ ๋ฐ˜์˜
  • Page ์‹œ์Šคํ…œ ์ฝ”๋“œ ๋ณด์œ (ํ˜„์žฌ ๋น„ํ™œ์„ฑ/Deprecated)

์ฃผ์š” ๋‚ด๋ถ€ ํ๋ฆ„:

ํ•จ์ˆ˜ ์˜๋ฏธ
Initialize Registry ์œ„์ ฏ๊ณผ ๋ฒ„ํŠผ ์„ค์ • ์ดˆ๊ธฐํ™”
PlayerControllerChanged ๊ธฐ์กด UI ์ •๋ฆฌ ํ›„ Remaining Page/Popup ๋ณต๊ตฌ
GetRegisteredWidget Registry์— ๋“ฑ๋ก๋œ ์œ„์ ฏ ์ธ์Šคํ„ด์Šค๋ฅผ ์ง€์—ฐ ์ƒ์„ฑ/๋ฐ˜ํ™˜
OpenPopup Popup ์œ„์ ฏ ์ƒ์„ฑ, EWidgetZOrder::Popup์œผ๋กœ Viewport ์ถ”๊ฐ€
OnHidePopup RemoveFromParent๋กœ ๋‹ซํžŒ Popup์„ ์Šคํƒ๊ณผ Remaining ๋ชฉ๋ก์—์„œ ์ œ๊ฑฐ
GetTopPopup ํ˜„์žฌ ํŒ์—… ์Šคํƒ์˜ ๋งˆ์ง€๋ง‰ Popup ๋ฐ˜ํ™˜
CheckCanOpenPopup ์œ ํšจ์„ฑ, ์ค‘๋ณต ํ—ˆ์šฉ, ์ƒ๋‹จ Popup์˜ IgnoreOtherPopup ๊ทœ์น™ ๊ฒ€์‚ฌ

UWidgetHelper

ํŒŒ์ผ: Source/CustomUI/Public/WidgetHelper.h

Blueprint/C++์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ •์  ํ—ฌํผ๋‹ค.

ํ•จ์ˆ˜ ์˜๋ฏธ
IsDesignTime ์œ„์ ฏ์˜ Design Time ์—ฌ๋ถ€ ํ™•์ธ
GetStringTableText ๋“ฑ๋ก๋œ String Table์—์„œ FText ์กฐํšŒ
GetRegisteredWidget Registry์— ๋“ฑ๋ก๋œ ๊ณต์šฉ ์œ„์ ฏ ์ธ์Šคํ„ด์Šค ์กฐํšŒ
OpenPopup Popup Class๋กœ Popup ์—ด๊ธฐ
ClosePopup Popup ๋‹ซ๊ธฐ
GetTopPopup ํ˜„์žฌ ์ตœ์ƒ๋‹จ Popup ์กฐํšŒ
OpenPage Deprecated. FEATURE_PAGE=0์—์„œ๋Š” ๋™์ž‘ํ•˜์ง€ ์•Š์Œ

C++ ํ…œํ”Œ๋ฆฟ ์˜ค๋ฒ„๋กœ๋“œ๋Š” ๊ตฌ์ฒด ํƒ€์ž… ๋ฐ˜ํ™˜์„ ๋•๋Š”๋‹ค.

auto Popup = UWidgetHelper::OpenPopup<UMyPopup>(this, UMyPopup::StaticClass());

AWidgetPlayerController

ํŒŒ์ผ: Source/CustomUI/Public/WidgetPlayerController.h

BeginPlay์—์„œ ์ดˆ๊ธฐ Input Mode์™€ Mouse Cursor ์ƒํƒœ๋ฅผ ์ ์šฉํ•˜๋Š” PlayerController ๊ธฐ๋ฐ˜ ํด๋ž˜์Šค๋‹ค.

์„ค์ • ์˜๋ฏธ
_InitialInputMode GameAndUI, GameOnly, UIOnly ์ค‘ ์ดˆ๊ธฐ ์ž…๋ ฅ ๋ชจ๋“œ
_InMouseLockMode UI/GameAndUI ๋ชจ๋“œ์—์„œ ๋งˆ์šฐ์Šค ๋ฝ ๋ฐฉ์‹
_HideCursorDuringCapture GameAndUI ์ž…๋ ฅ ์ค‘ ์บก์ฒ˜ ์‹œ ์ปค์„œ ์ˆจ๊น€ ์—ฌ๋ถ€
_ConsumeCaptureMouseDown GameOnly ์ž…๋ ฅ ๋ชจ๋“œ์—์„œ ์บก์ฒ˜ ๋งˆ์šฐ์Šค ๋‹ค์šด ์†Œ๋น„ ์—ฌ๋ถ€
_ShowMouseCursor BeginPlay ํ›„ ์ปค์„œ ํ‘œ์‹œ ์—ฌ๋ถ€
_InitialPageClass Deprecated. Page ์‹œ์Šคํ…œ์šฉ ์ž”์—ฌ ์„ค์ •

UWidgetSubsystem::OpenPopup์€ LocalPlayer์˜ PlayerController๋ฅผ AWidgetPlayerController๋กœ ์บ์ŠคํŒ…ํ•œ๋‹ค. ํŒ์—… ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํ”„๋กœ์ ํŠธ PlayerController๊ฐ€ ์ด ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•˜๋‹ค.


Widget Base ํ๋ฆ„

UWidgetBase

ํŒŒ์ผ: Source/CustomUI/Public/Widgets/WidgetBase.h

๋ชจ๋“  CustomUI ์œ„์ ฏ์˜ ๊ธฐ๋ณธ ํด๋ž˜์Šค๋‹ค. UUserWidget ์œ„์— ํ‘œ์‹œ/์ˆจ๊น€ ์ƒํƒœ, ์• ๋‹ˆ๋ฉ”์ด์…˜, ์‚ฌ์šด๋“œ, ์ด๋ฒคํŠธ๋ฅผ ์–น๋Š”๋‹ค.

์ฃผ์š” ๋ฐ์ดํ„ฐ:

๋ฐ์ดํ„ฐ ์˜๋ฏธ
_WidgetID Registry/๊ทธ๋ฃน ์„ ํƒ ๋“ฑ์— ์‚ฌ์šฉํ•˜๋Š” ์œ„์ ฏ ์‹๋ณ„์ž
_IsPreventInitialFlicker ShowAnim์ด ์žˆ์„ ๋•Œ ์ฒซ ํ”„๋ ˆ์ž„ Opacity 0์œผ๋กœ ๊นœ๋นก์ž„ ๋ฐฉ์ง€
_IsTraverseWidgetToShow Show ์‹œ ํ•˜์œ„ UWidgetBase๋“ค๋„ Showing ์ƒํƒœ๋กœ ์ˆœํšŒํ• ์ง€
ShowAnim ์„ ํƒ์  Show ์• ๋‹ˆ๋ฉ”์ด์…˜. BindWidgetAnimOptional
IdleAnim ์„ ํƒ์  Idle ๋ฐ˜๋ณต/์ƒํƒœ ์• ๋‹ˆ๋ฉ”์ด์…˜
HideAnim ์„ ํƒ์  Hide ์• ๋‹ˆ๋ฉ”์ด์…˜
_ShowAnimConfig, _IdleAnimConfig, _HideAnimConfig ์• ๋‹ˆ๋ฉ”์ด์…˜ ์žฌ์ƒ ๋ฐฉํ–ฅ/๋ณต์› ์„ค์ •
_ShowSound, _HideSound Show/Hide ์‚ฌ์šด๋“œ

์ƒํƒœ:

์ƒํƒœ ์˜๋ฏธ
Hide ์ˆจ๊น€/์ œ๊ฑฐ ์ƒํƒœ
Showing ShowAnim ์žฌ์ƒ ์ค‘ ๋˜๋Š” Show ์ง„์ž… ์ค‘
Idle ํ‘œ์‹œ ์™„๋ฃŒ ์ƒํƒœ
Hiding HideAnim ์žฌ์ƒ ์ค‘

์ฃผ์š” API:

void Show(EWidgetShowType _show_type, bool _is_skip_anim = false);
void Hide(EWidgetHideType _hide_type, bool _is_skip_anim = false);
void Close(bool _is_skip_anim = false);
EWidgetState GetWidgetState() const;

์ด๋ฒคํŠธ:

์ด๋ฒคํŠธ ํ˜ธ์ถœ ์‹œ์ 
_OnShowEvent / OnShow Showing ์ง„์ž… ์งํ›„
_OnIdleEvent / OnIdle ํ‘œ์‹œ ์™„๋ฃŒ ํ›„ Idle ์ง„์ž…
_OnStartHideEvent / OnStartHide Hide/Close ์š”์ฒญ ์งํ›„
_OnHideEvent / OnHide ์‹ค์ œ ์ˆจ๊น€/์ œ๊ฑฐ ์ง์ „
OnSynchronizeProperties SynchronizeProperties์—์„œ Blueprint๋กœ ์ „๋‹ฌ

์ค‘์š” ์ •์ฑ…:

  • ์ง์ ‘ SetVisibility๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๊ฒฝ๊ณ ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ํ‘œ์‹œ/์ˆจ๊น€์€ Show, Hide, Close๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • Close()๋Š” Hide(EWidgetHideType::RemoveFromParent)์™€ ๊ฐ™๋‹ค.
  • Hide(Collapsed/Hidden)๋Š” Viewport์—์„œ ์ œ๊ฑฐํ•˜์ง€ ์•Š๊ณ  Visibility๋งŒ ๋ณ€๊ฒฝํ•œ๋‹ค.

UPopupBase

ํŒŒ์ผ: Source/CustomUI/Public/Widgets/PopupBase.h

Popup ์ „์šฉ ๊ธฐ๋ณธ ํด๋ž˜์Šค๋‹ค. UWidgetBase๋ฅผ ์ƒ์†ํ•˜๊ณ  Construct ์‹œ Focusable์„ true๋กœ ์„ค์ •ํ•œ๋‹ค.

์„ค์ •:

์„ค์ • ์˜๋ฏธ
_PopupConfig.IgnoreOtherPopup ์ด Popup์ด ์—ด๋ ค ์žˆ๋Š” ๋™์•ˆ ๋‹ค๋ฅธ Popup ์—ด๊ธฐ๋ฅผ ์ฐจ๋‹จ
_PopupConfig.AllowDuplicate ๊ฐ™์€ Popup Class ์ค‘๋ณต ์—ด๊ธฐ ํ—ˆ์šฉ
_PopupConfig.ShowMouseCursor Popup์ด ์—ด๋ ธ์„ ๋•Œ PlayerController ์ปค์„œ ํ‘œ์‹œ ์—ฌ๋ถ€
_PopupConfig.RemainOnLevelChanged PlayerController ๋ณ€๊ฒฝ/๋ ˆ๋ฒจ ๋ณ€๊ฒฝ ํ›„ ๋‹ค์‹œ ์—ด Popup ๋ชฉ๋ก์— ์œ ์ง€

UPageBase (Deprecated)

ํŒŒ์ผ: Source/CustomUI/Public/Widgets/PageBase.h

๊ณผ๊ฑฐ Page ์‹œ์Šคํ…œ์šฉ ๊ธฐ๋ณธ ํด๋ž˜์Šค๋‹ค. ํ˜„์žฌ FEATURE_PAGE=0์œผ๋กœ ๋นŒ๋“œ๋˜๋ฉฐ ํด๋ž˜์Šค์™€ Helper API๊ฐ€ Deprecated ์ฒ˜๋ฆฌ๋˜์–ด ์žˆ๋‹ค.

ํ˜„์žฌ ์ •์ฑ…:

  • ์‹ ๊ทœ UI๋Š” UWidgetBase ๋˜๋Š” UPopupBase๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • OpenPage ๊ฒฝ๋กœ์— ์˜์กดํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋ฒ„ํŠผ/์ปดํฌ๋„ŒํŠธ ํƒ€์ž…

UButtonBase

ํŒŒ์ผ: Source/CustomUI/Public/Widgets/Components/ButtonBase.h

Click/Toggle/Radio ๋ฒ„ํŠผ์˜ ๊ณตํ†ต ๊ธฐ๋ฐ˜์ด๋‹ค.

ํ•„์ˆ˜ BindWidget ๊ตฌ์„ฑ:

์ด๋ฆ„ ํƒ€์ž… ์˜๋ฏธ
SizeBox USizeBox ๊ณ ์ • ํญ/๋†’์ด ์ ์šฉ
Border UBorder ์ƒํƒœ๋ณ„ Brush/ContentColor ์ ์šฉ
NS_Content UNamedSlot ๋ฒ„ํŠผ ๋‚ด๋ถ€ ์ฝ˜ํ…์ธ  ์Šฌ๋กฏ

์ƒํƒœ:

  • Normal
  • Hovered
  • Pressed
  • Disabled

์ฃผ์š” ๊ธฐ๋Šฅ:

  • _StateStyles๋กœ ์ƒํƒœ๋ณ„ Brush/ContentColor ์ ์šฉ
  • _UseFixedWidth, _UseFixedHeight, _FixedSize๋กœ ํฌ๊ธฐ ์ œ์–ด
  • _ContentHorizontalAlignment, _ContentVerticalAlignment, _ContentPadding์œผ๋กœ ์ฝ˜ํ…์ธ  ์ •๋ ฌ/ํŒจ๋”ฉ ์ œ์–ด
  • _HoverSound, _ClickSound ์žฌ์ƒ
  • _OnClicked, _OnButtonStateChanged ์ด๋ฒคํŠธ ์ œ๊ณต
  • SetButtonDisabled๋กœ Disabled ์ƒํƒœ ์ „ํ™˜

์ •์ฑ…:

  • SetIsEnabled(false) ๋Œ€์‹  SetButtonDisabled(true) ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•˜๋ฉฐ, ์ง์ ‘ ๋น„ํ™œ์„ฑํ™” ์‹œ ๊ฒฝ๊ณ ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
  • ๊ธฐ๋ณธ ํด๋ฆญ ํ‚ค๋Š” LeftMouseButton์ด๋‹ค.

UClickButton

ํŒŒ์ผ: Source/CustomUI/Public/Widgets/Components/ClickButton.h

์ผ๋ฐ˜ ํด๋ฆญ ๋ฒ„ํŠผ์ด๋‹ค.

์ถ”๊ฐ€ ๊ธฐ๋Šฅ:

  • ์ขŒํด๋ฆญ _OnClicked
  • ์šฐํด๋ฆญ ๋“ฑ ๋ณด์กฐ ํด๋ฆญ _OnSubClicked
  • ๋”๋ธ”ํด๋ฆญ _OnDoubleClicked
  • _DontResetButtonStateOnMouseLeaveWhenPressed
  • _UseSubClick
  • _SubClickSound

์ •์ฑ…:

  • ๋ณด์กฐ ํด๋ฆญ ๊ธฐ๋ณธ ํ‚ค๋Š” RightMouseButton์ด๋‹ค.
  • ๋”๋ธ”ํด๋ฆญ ์ž„๊ณ„๊ฐ’์€ UInputSettings::DoubleClickTime์œผ๋กœ ์ดˆ๊ธฐํ™”๋œ๋‹ค.

UToggleButton

ํŒŒ์ผ: Source/CustomUI/Public/Widgets/Components/ToggleButton.h

ํด๋ฆญํ•  ๋•Œ ์„ ํƒ ์ƒํƒœ๋ฅผ ํ† ๊ธ€ํ•˜๋Š” ๋ฒ„ํŠผ์ด๋‹ค.

์ฃผ์š” API:

void SetIsSelected(bool _is_selected, bool _force_update = false);
bool ToggleSelected();
bool GetIsSelected() const;

์„ ํƒ ์ƒํƒœ์ผ ๋•Œ๋Š” _SelectedStateStyles๋ฅผ ์šฐ์„  ์ ์šฉํ•œ๋‹ค.

URadioButton

ํŒŒ์ผ: Source/CustomUI/Public/Widgets/Components/RadioButton.h

๊ทธ๋ฃน ์•ˆ์—์„œ ํ•˜๋‚˜๋งŒ ์„ ํƒ๋˜๋Š” ๋ฒ„ํŠผ์ด๋‹ค. ๊ฐœ๋ณ„ ๋ฒ„ํŠผ์€ _IsSelected์™€ _SelectedStateStyles๋ฅผ ๊ฐ€์ง„๋‹ค.

์ฃผ์š” API:

void SetIsSelected(bool _is_selected, bool _force_update = false);
bool GetIsSelected() const;

ํด๋ฆญ ์‹œ _OnClicked๋ฅผ Broadcastํ•˜๊ณ  ์ž์‹ ์„ ์„ ํƒ ์ƒํƒœ๋กœ ๋งŒ๋“ ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ URadioButtonGroup ์•ˆ์—์„œ ์‚ฌ์šฉํ•œ๋‹ค.

URadioButtonGroup

ํŒŒ์ผ: Source/CustomUI/Public/Widgets/Components/RadioButtonGroup.h

์—ฌ๋Ÿฌ URadioButton์„ ํ•˜๋‚˜์˜ ์„ ํƒ ๊ทธ๋ฃน์œผ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค.

ํ•„์ˆ˜ BindWidget ๊ตฌ์„ฑ:

์ด๋ฆ„ ํƒ€์ž… ์˜๋ฏธ
StackBox UStackBox RadioButton ์ž์‹๋“ค์„ ๋‹ด๋Š” ์ปจํ…Œ์ด๋„ˆ

์ฃผ์š” ๊ธฐ๋Šฅ:

  • StackBox Orientation ์„ค์ •
  • ๋ฒ„ํŠผ ์Šฌ๋กฏ Padding/Alignment/SizeRule ์ ์šฉ
  • ์ž์‹์ด URadioButton์ด ์•„๋‹ˆ๋ฉด ์˜ค๋ฅ˜ ์ถœ๋ ฅ
  • WidgetID ๋˜๋Š” Index๋กœ ์„ ํƒ
  • ์„ ํƒ ์‹œ _OnRadioButtonSelected Broadcast

์ฃผ์š” API:

void SelectRadioButtonByWidgetID(FName _widget_id);
void SelectRadioButtonByIndex(int32 _index);

์ฃผ์˜:

  • SelectRadioButtonByWidgetID๋ฅผ ์“ฐ๋ ค๋ฉด ๊ฐ URadioButton์˜ _WidgetID๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.

UTypingRichTextBlock

ํŒŒ์ผ: Source/CustomUI/Public/Widgets/Components/TypingRichTextBlock.h

URichTextBlock์„ ์ƒ์†ํ•œ ํƒ€์ดํ•‘ ํ…์ŠคํŠธ ์ปดํฌ๋„ŒํŠธ๋‹ค.

์ฃผ์š” ๋ฐ์ดํ„ฐ:

๋ฐ์ดํ„ฐ ์˜๋ฏธ
_AutoStart ๋Ÿฐํƒ€์ž„ SynchronizeProperties ํ›„ ์ž๋™ ํƒ€์ดํ•‘ ์‹œ์ž‘
_FullText ์ „์ฒด ํ…์ŠคํŠธ
_TypingSpeed ์ดˆ๋‹น ์ถœ๋ ฅ ํ† ํฐ ์ˆ˜. ์ตœ์†Œ 1๋กœ ๋ณด์ •

์ฃผ์š” API:

void StartTyping(bool _is_resume);
void StopTyping(bool _is_clear);
void SetTypingSpeed(float _speed);
bool GetIsTyping() const;
float GetTypingSpeed() const;

๋งˆํฌ์—… ์ฒ˜๋ฆฌ:

  • <Style>๋ฌธ์ž</> ํ˜•ํƒœ์˜ RichText ์Šคํƒ€์ผ์€ ๊ฐ ๋ฌธ์ž ํ† ํฐ์— ๋‹ค์‹œ ๊ฐ์‹ธ์„œ ๋ˆ„์  ํ‘œ์‹œํ•œ๋‹ค.
  • \r\n, \r, \n์€ ์ค„๋ฐ”๊ฟˆ ํ† ํฐ์œผ๋กœ ์œ ์ง€ํ•œ๋‹ค.
  • <img .../> ๊ฐ™์€ ์…€ํ”„ ํด๋กœ์ง• ํƒœ๊ทธ๋Š” ํ•˜๋‚˜์˜ ํ† ํฐ์œผ๋กœ ์œ ์ง€ํ•œ๋‹ค.
  • Design Time์—์„œ๋Š” ์ „์ฒด ํ…์ŠคํŠธ๋ฅผ ์ฆ‰์‹œ ํ‘œ์‹œํ•œ๋‹ค.

UMarqueeWidgetBase

ํŒŒ์ผ: Source/CustomUI/Public/Widgets/MarqueeWidgetBase.h

NamedSlot ์ฝ˜ํ…์ธ ๋ฅผ ๊ฐ€๋กœ/์„ธ๋กœ๋กœ ์›€์ง์ด๋Š” ๋งˆํ‚ค ์œ„์ ฏ์ด๋‹ค.

ํ•„์ˆ˜ BindWidget ๊ตฌ์„ฑ:

์ด๋ฆ„ ํƒ€์ž… ์˜๋ฏธ
CanvasPanel UCanvasPanel ์ฝ˜ํ…์ธ ๊ฐ€ ์ž˜๋ฆด ์˜์—ญ. ์ž๋™์œผ๋กœ ClipToBounds ์„ค์ •
NS_Content UNamedSlot ์ด๋™ํ•  ์ฝ˜ํ…์ธ  ์Šฌ๋กฏ

์„ค์ •:

์„ค์ • ์˜๋ฏธ
_MarqueeType NA, Scroll, AlternateScroll
_Orientation Horizontal ๋˜๋Š” Vertical
_IsReverse ์ด๋™ ๋ฐฉํ–ฅ ๋ฐ˜์ „
_MarqueeSpeed ์ด๋™ ์†๋„
_DelayTime ๋์  ๋„๋‹ฌ ํ›„ ๋Œ€๊ธฐ ์‹œ๊ฐ„

ํƒ€์ž…:

  • Scroll: ์ฝ˜ํ…์ธ ๊ฐ€ ์˜์—ญ ๋ฐ–์—์„œ ๋ฐ˜๋Œ€์ชฝ ๋ฐ–๊นŒ์ง€ ํ๋ฅธ ๋’ค ์‹œ์ž‘ ์œ„์น˜๋กœ ๋Œ์•„๊ฐ„๋‹ค.
  • AlternateScroll: ์˜์—ญ ์•ˆ์—์„œ ์‹œ์ž‘์ ๊ณผ ๋์ ์„ ์™•๋ณตํ•œ๋‹ค.

UAdvancedDragDropOperation

ํŒŒ์ผ: Source/CustomUI/Public/AdvancedDragDropOperation.h

UDragDropOperation์— ๋“œ๋ž˜๊ทธ ์‹œ์ž‘/๋กœ์ปฌ ์˜คํ”„์…‹ ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•œ ๊ฐ„๋‹จํ•œ ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค๋‹ค.

๋ฐ์ดํ„ฐ ์˜๋ฏธ
_LocalOffset ์œ„์ ฏ ๋‚ด๋ถ€์—์„œ Pivot ๊ธฐ์ค€ ๋งˆ์šฐ์Šค Offset
_DragStartScreenPos ๋“œ๋ž˜๊ทธ ์‹œ์ž‘ Screen Position

๋Ÿฐํƒ€์ž„ ํ๋ฆ„

๋“ฑ๋ก ์œ„์ ฏ ์กฐํšŒ

  1. UWidgetSubsystem์ด ์ดˆ๊ธฐํ™”๋œ๋‹ค.
  2. UCustomUIDeveloperSettings::_WidgetRegistryDataAsset์„ ๋™๊ธฐ ๋กœ๋“œํ•œ๋‹ค.
  3. Registry์˜ _WidgetClassMap์„ FName -> Class๋กœ ์ €์žฅํ•œ๋‹ค.
  4. UWidgetHelper::GetRegisteredWidget(WorldContext, WidgetName) ํ˜ธ์ถœ ์‹œ ์ธ์Šคํ„ด์Šค๊ฐ€ ์—†์œผ๋ฉด ์ƒ์„ฑํ•œ๋‹ค.
  5. ์ƒ์„ฑ๋œ ์ธ์Šคํ„ด์Šค๋Š” ๊ฐ™์€ LocalPlayer Subsystem ์•ˆ์—์„œ ์žฌ์‚ฌ์šฉ๋œ๋‹ค.

๋“ฑ๋ก ์œ„์ ฏ์€ ๋ฐ˜ํ™˜๋งŒ ํ•œ๋‹ค. Viewport ์ถ”๊ฐ€, ๋ถ€๋ชจ ํŒจ๋„ ๋ฐฐ์น˜, ์ด๋ฒคํŠธ ๋ฐ”์ธ๋”ฉ/ํ•ด์ œ๋Š” ํ˜ธ์ถœ์ž๊ฐ€ ์ฒ˜๋ฆฌํ•œ๋‹ค.

ํŒ์—… ์—ด๊ธฐ

  1. UWidgetHelper::OpenPopup ํ˜ธ์ถœ
  2. LocalPlayer์˜ UWidgetSubsystem ์กฐํšŒ
  3. PlayerController๋ฅผ AWidgetPlayerController๋กœ ์บ์ŠคํŒ…
  4. Popup Class ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ
  5. AllowDuplicate == false๋ฉด ๊ฐ™์€ Class๊ฐ€ ์ด๋ฏธ ์—ด๋ ค ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌ
  6. ์ตœ์ƒ๋‹จ Popup์˜ IgnoreOtherPopup์ด true๋ฉด ์ƒˆ Popup ์—ด๊ธฐ ์ฐจ๋‹จ
  7. CreateWidget<UPopupBase> ์‹คํ–‰
  8. Popup _OnHideEvent์— Subsystem ์ •๋ฆฌ ์ฝœ๋ฐฑ ๋ฐ”์ธ๋”ฉ
  9. EWidgetZOrder::Popup์œผ๋กœ Viewport ์ถ”๊ฐ€
  10. RemainOnLevelChanged์ด๋ฉด Remaining ๋ชฉ๋ก์— Class ๋ณด๊ด€
  11. Popup ์„ค์ •์— ๋งž์ถฐ PlayerController Mouse Cursor ๊ฐฑ์‹ 
  12. _CurrentPopups ์Šคํƒ์— ์ถ”๊ฐ€

ํŒ์—… ๋‹ซ๊ธฐ

  1. UWidgetHelper::ClosePopup(Popup, SkipAnim) ๋˜๋Š” Popup->Close(SkipAnim) ํ˜ธ์ถœ
  2. UWidgetBase::Hide(RemoveFromParent) ์‹คํ–‰
  3. HideAnim์ด ์žˆ์œผ๋ฉด ์žฌ์ƒ, ์—†๊ฑฐ๋‚˜ skip์ด๋ฉด ์ฆ‰์‹œ Hide ์ƒํƒœ
  4. _OnHideEvent Broadcast
  5. Subsystem์ด RemoveFromParent ๋‹ซํž˜์„ ๊ฐ์ง€ํ•ด ์Šคํƒ/Remaining ๋ชฉ๋ก์—์„œ ์ œ๊ฑฐ
  6. ๋‹ค์Œ ์ตœ์ƒ๋‹จ Popup ๋˜๋Š” PlayerController ๊ธฐ๋ณธ๊ฐ’์— ๋”ฐ๋ผ Mouse Cursor ๊ฐฑ์‹ 

์ฃผ์˜:

  • Popup์„ Hide(Collapsed/Hidden)์œผ๋กœ ์ˆจ๊ธฐ๋ฉด RemoveFromParent๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ _CurrentPopups์—์„œ ์ œ๊ฑฐ๋˜์ง€ ์•Š๋Š”๋‹ค.
  • ํŒ์—… ์Šคํƒ ์ •๋ฆฌ๊นŒ์ง€ ๊ธฐ๋Œ€ํ•œ๋‹ค๋ฉด Close()๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•˜๋‹ค.

WidgetBase Show/Hide

Show:

Show() -> Visibility ์„ค์ • -> Showing -> OnShow/_OnShowEvent -> ShowAnim -> Idle -> OnIdle/_OnIdleEvent

Hide/Close:

Hide()/Close() -> OnStartHide/_OnStartHideEvent -> Hiding -> HideAnim -> Hide -> OnHide/_OnHideEvent -> Remove/Collapsed/Hidden

_IsTraverseWidgetToShow๊ฐ€ true์ด๋ฉด Show ์ง„์ž… ์‹œ ํ‘œ์‹œ ์ค‘์ธ ํ•˜์œ„ UWidgetBase๋“ค๋„ Showing ์ƒํƒœ๋กœ ์ˆœํšŒํ•œ๋‹ค. WidgetSwitcher์˜ ๋น„ํ™œ์„ฑ ์ž์‹์€ ์ˆœํšŒํ•˜์ง€ ์•Š๋Š”๋‹ค.


Content / Sample

ํ”Œ๋Ÿฌ๊ทธ์ธ์€ CanContainContent=true์ด๋ฉฐ ์ƒ˜ํ”Œ ์ฝ˜ํ…์ธ ๋ฅผ ํฌํ•จํ•œ๋‹ค.

์ฃผ์š” ์ƒ˜ํ”Œ ๊ฒฝ๋กœ:

๊ฒฝ๋กœ ๋‚ด์šฉ
Content/Sample/DA_SampleWidgetRegistry.uasset Widget Registry ์ƒ˜ํ”Œ Data Asset
Content/Sample/L_Sample.umap ์ƒ˜ํ”Œ ๋ ˆ๋ฒจ
Content/Sample/L_Sample2.umap ์ƒ˜ํ”Œ ๋ ˆ๋ฒจ 2
Content/Sample/Widgets/... Popup, Button, Toggle, Radio, Marquee ๋“ฑ ์ƒ˜ํ”Œ ์œ„์ ฏ Blueprint
Content/Sample/RichTextBlock/... RichText ์Šคํƒ€์ผ/์ด๋ฏธ์ง€ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ์ƒ˜ํ”Œ
Content/Sample/ST_Sample.uasset String Table ์ƒ˜ํ”Œ

ํ˜„์žฌ ํ•œ๊ณ„ / ์ฃผ์˜์‚ฌํ•ญ

  • FEATURE_PAGE=0์ด๋ฏ€๋กœ Page ์‹œ์Šคํ…œ์€ ๋น„ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๋‹ค.
  • UPageBase์™€ UWidgetHelper::OpenPage๋Š” Deprecated ๊ฒฝ๋กœ๋‹ค.
  • OpenPopup์€ AWidgetPlayerController ์บ์ŠคํŒ…์— ์˜์กดํ•œ๋‹ค.
  • GetRegisteredWidget์€ ์œ„์ ฏ์„ ์ƒ์„ฑ/๋ฐ˜ํ™˜๋งŒ ํ•˜๋ฉฐ ์ž๋™์œผ๋กœ Viewport์— ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • Registry์™€ String Table์€ ์„ค์ •๋œ Soft Object๋ฅผ ์ดˆ๊ธฐํ™” ์‹œ ๋™๊ธฐ ๋กœ๋“œํ•œ๋‹ค.
  • SetVisibility์™€ SetIsEnabled(false)๋Š” ์ง์ ‘ ์‚ฌ์šฉ๋ณด๋‹ค Show/Hide์™€ SetButtonDisabled ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•œ๋‹ค.
  • GETTEXT ๋งคํฌ๋กœ๋Š” ๋์— ์„ธ๋ฏธ์ฝœ๋ก ์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ํ‘œํ˜„์‹ ์œ„์น˜์—์„œ ์‚ฌ์šฉํ•  ๋•Œ ์ฃผ์˜ํ•œ๋‹ค.
  • Editor ์ „์šฉ ๋ชจ๋“ˆ์ด๋‚˜ ์ „์šฉ Asset Factory๋Š” ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค. Data Asset/Widget Blueprint๋Š” ์ผ๋ฐ˜ Unreal ์ƒ์„ฑ ํ๋ฆ„์„ ์‚ฌ์šฉํ•œ๋‹ค.

์ถ”์ฒœ ์ฝ”๋“œ ์ฝ๊ธฐ ์ˆœ์„œ

  1. CustomUI.Build.cs
  2. WidgetDefines.h
  3. CustomUIDeveloperSettings.h
  4. WidgetRegistryDataAsset.h
  5. WidgetSubsystem.h/.cpp
  6. WidgetHelper.h/.cpp
  7. StringTableSubsystem.h/.cpp
  8. Widgets/WidgetBase.h/.cpp
  9. Widgets/PopupBase.h/.cpp
  10. Widgets/Components/ButtonBase.h/.cpp
  11. Widgets/Components/ClickButton.h/.cpp
  12. Widgets/Components/ToggleButton.h/.cpp
  13. Widgets/Components/RadioButton.h/.cpp
  14. Widgets/Components/RadioButtonGroup.h/.cpp
  15. Widgets/Components/TypingRichTextBlock.h/.cpp
  16. Widgets/MarqueeWidgetBase.h/.cpp
  17. WidgetPlayerController.h/.cpp
  18. AdvancedDragDropOperation.h/.cpp

๊ด€๋ จ ๋ฌธ์„œ

  • User Guide โ€” ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๋””์ž์ด๋„ˆ/๊ฐœ๋ฐœ์ž์šฉ ์ž‘์—… ๊ฐ€์ด๋“œ

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages