๐
2025-12-09
๋น๋ฉ/์์ดํ ์คํฏ ํ์ ์์คํ ์์:
FItemData์ FBuildingData๋ ์์ ํ ๋ค๋ฅธ ๊ตฌ์กฐ์ฒด โ ํจ์๋ฅผ ๋ฐ๋ก ๋ง๋ค์ด์ผ ํจ// Before: ๋๋ฌด ๊ธธ๊ณ ์ ์ง๋ณด์ ์ด๋ ค์
void UpdateCraftingItemStatView(const FItemData& ItemData)
{
switch (ItemData.Category)
{
case EItemCategory::TOOL:
// ์ฑ์ทจ ์ ํ, ๊ณต๊ฒฉ๋ ฅ, ๋ด๊ตฌ๋... 50์ค
break;
case EItemCategory::WEAPON:
// ๊ณต๊ฒฉ๋ ฅ, ์ฌ๊ฑฐ๋ฆฌ, ๋ด๊ตฌ๋... 50์ค
break;
// ...
}
}
void UpdateBuildingItemStatView(const FBuildingData& BuildingData)
{
switch (BuildingData.Type) { /* ... */ }
}
์ธํฐํ์ด์ค ๋ํผ + ํฉํ ๋ฆฌ ํจํด ์กฐํฉ์ผ๋ก ํด๊ฒฐ
// IDisplayDataProvider (์์ C++ ์ธํฐํ์ด์ค)
class IDisplayDataProvider
{
public:
virtual FGameplayTag GetCategoryTag() const = 0;
virtual float GetStatValue(const FGameplayTag& StatTag) const = 0;
// ...
};
// ๊ฐ ๋ฐ์ดํฐ ํ์
์ ๋ํ
class FItemDataProvider : public IDisplayDataProvider { /* ... */ };
class FBuildingDataProvider : public IDisplayDataProvider { /* ... */ };
// ์ถ์ ํด๋์ค
UCLASS(Abstract)
class UStatViewer : public UObject
{
virtual void ShowStats(
UListView* ListView,
const IDisplayDataProvider& DataProvider,
UGameplayTagDisplaySubsystem* DisplaySystem) PURE_VIRTUAL();
};
// ์นดํ
๊ณ ๋ฆฌ๋ณ ๊ตฌํ
UCLASS() class UToolStatViewer : public UStatViewer { /* ๋๊ตฌ ์คํฏ ํ์ */ };
UCLASS() class UWeaponStatViewer : public UStatViewer { /* ๋ฌด๊ธฐ ์คํฏ ํ์ */ };
UCLASS() class UWallStatViewer : public UStatViewer { /* ๋ฒฝ ์คํฏ ํ์ */ };
// ํฉํ ๋ฆฌ๊ฐ ์ ์ ํ Viewer ๋ฐํ
UCLASS()
class UStatViewerFactory : public UObject
{
UStatViewer* GetViewer(const FGameplayTag& CategoryTag)
{
if (CategoryTag == TAG_Category_Tool)
return CachedToolViewer;
// ...
}
};
// After: 5์ค๋ก ์ถ์ฝ, ๋ชจ๋ ํ์
ํตํฉ!
void UItemInfo::UpdateStatViewInternal(const IDisplayDataProvider& DataProvider)
{
FGameplayTag CategoryTag = DataProvider.GetCategoryTag();
UStatViewer* Viewer = ViewerFactory->GetViewer(CategoryTag);
Viewer->ShowStats(ItemStatView, DataProvider, TagDisplaySubsystem);
}
void UpdateCraftingItemStatView(const FItemData& ItemData)
{
FItemDataProvider Provider(ItemData);
UpdateStatViewInternal(Provider);
}
void UpdateBuildingItemStatView(const FBuildingData& BuildingData)
{
FBuildingDataProvider Provider(BuildingData);
UpdateStatViewInternal(Provider);
}
์ธํฐํ์ด์ค ๋ํผ (IDisplayDataProvider)
ํฉํ ๋ฆฌ ํจํด (UStatViewerFactory)
Strategy ํจํด (UStatViewer)
UI/StatDisplay/
โโโ DisplayDataProvider.h # ์ธํฐํ์ด์ค
โโโ Providers/
โ โโโ ItemDataProvider.h/cpp # ์์ดํ
๋ํผ
โ โโโ BuildingDataProvider.h/cpp # ๋น๋ฉ ๋ํผ
โโโ Viewers/
โ โโโ StatViewer.h/cpp # ์ถ์ ํด๋์ค
โ โโโ Items/
โ โ โโโ ToolStatViewer.h/cpp
โ โ โโโ WeaponStatViewer.h/cpp
โ โ โโโ ...
โ โโโ Buildings/
โ โโโ CraftingStatViewer.h/cpp
โ โโโ ...
โโโ StatViewerFactory.h/cpp # ํฉํ ๋ฆฌ
์ฒ์์ switch-case๊ฐ ๊ฐ๋จํด ๋ณด์๋๋ฐ ์นดํ ๊ณ ๋ฆฌ๊ฐ ๋์ด๋๋ฉด์ ํจ์๊ฐ ๋๋ฌด ๊ธธ์ด์ก๋ค. ์ธํฐํ์ด์ค ๋ํผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ถ์ํํ๊ณ , ํฉํ ๋ฆฌ ํจํด์ผ๋ก ๊ฐ ๋ก์ง์ ๋ถ๋ฆฌํ๋๊น ์ฝ๋๊ฐ ํจ์ฌ ๊น๋ํด์ก๋ค. ํนํ FItemData์ FBuildingData๋ฅผ ์ ํ ๊ฑด๋๋ฆฌ์ง ์๊ณ Provider๋ก๋ง ๊ฐ์ธ์ ํด๊ฒฐํ ์ ์๋๊ฒ ์ ๊ธฐํ๋ค.
ํฉํ ๋ฆฌ ํจํด์ด ์ฒ์์ ์ค๋ฒ์์ง๋์ด๋ง ๊ฐ์๋๋ฐ, ์ดํ ๋น๋ฉ์ ํน์ ์นดํ ๊ณ ๋ฆฌ์ ๋ด์ฉ๋ง ์์ ํ ๋ ํจ์ฌ ๊ฐ๋จํด ํธํ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ Viewer ํด๋์ค๊ฐ 30~50์ค ์ ๋๋ก ์งง์์ ์ฝ๊ธฐ๋ ํธํ๊ณ ํ ์คํธํ๊ธฐ๋ ์ข์๋ค.
UCLASS๋ก ๊ตฌํํ Viewer ํด๋์ค๋ค์ด ์์ C++ ์ธํฐํ์ด์ค(IDisplayDataProvider)๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์์ ์ธ ์ ์๋ค๋ ๊ฒ ์๋ก์ ๋ค. UObject ๊ณ์ด๊ณผ ์์ C++์ ์กฐํฉํด์ ์ธ ์ ์๋ค๋ ๊ฑธ ๋ชฐ๋๋๋ฐ, ์คํ์ ์์ฑํ Provider๋ฅผ UObject์ธ Viewer๊ฐ ์ฐธ์กฐ๋ก ๋ฐ์์ ์ฌ์ฉํ๋ ๊ตฌ์กฐ๊ฐ ๊น๋ํ๋ค. ์ธ๋ฆฌ์ผ์์๋ ์์ C++๊ณผ ๋์์ธ ํจํด์ ์ค์ ์ ์ ๋๋ก ์ ์ฉํด๋ณธ ๊ฒฝํ์ด์๋ค.