[TIL] 251205

๊น€์„ธํฌยท2025๋…„ 12์›” 5์ผ

โœ๏ธToday I Learned

๐Ÿ“… 2025-12-05

  • ์•„์ดํ…œ ์ƒ์„ธ๋ฐ์ดํ„ฐ ํ‘œ์‹œ ์ •๋ณด ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ GameInstanceSubsystem ๊ตฌํ˜„

์•„์ดํ…œ ์ƒ์„ธ๋ฐ์ดํ„ฐ ํ‘œ์‹œ ์ •๋ณด ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ GameInstanceSubsystem ๊ตฌํ˜„

๐Ÿ“Œ ๋ฌธ์ œ ์ƒํ™ฉ

๋นŒ๋”ฉ/ํฌ๋ž˜ํ”„ํŒ… ์œ„์ ฏ์˜ ๊ฒฐ๊ณผ๋ฌผ ์ƒ์„ธํŽ˜์ด์ง€์—์„œ ์Šคํƒฏ์„ ํ‘œ์‹œํ•  ๋•Œ ๊ฐ ์Šคํƒฏ๊ณผ ํšจ๊ณผ๋งˆ๋‹ค ํ‘œ์‹œ ์šฉ์–ด๊ฐ€ ๋‹ค๋ฆ„

  • "์ฒด๋ ฅ ํšŒ๋ณต", "Health Recovery" ๊ฐ™์€ ๋‹ค๊ตญ์–ด ํ‘œ์‹œ๋ช…
  • "์ดˆ", "%", "๊ฐœ" ๊ฐ™์€ ๋‹จ์œ„
  • ์•„์ดํ…œ ์นดํ…Œ๊ณ ๋ฆฌ(TOOL, WEAPON, ARMOR, CONSUMABLE)๋งˆ๋‹ค ๋ณด์—ฌ์ค„ ์Šคํƒฏ์ด ๋‹ค๋ฆ„
  • ํ•˜๋“œ์ฝ”๋”ฉํ•˜๋ฉด ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ต๊ณ  ํ™•์žฅ์„ฑ์ด ๋–จ์–ด์ง

๐ŸŽฏ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

DeveloperSettings + GameInstanceSubsystem + DataTable ์กฐํ•ฉ์œผ๋กœ ์ค‘์•™ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ ๊ตฌ์ถ•

1. DeveloperSettings๋กœ DT ๊ฒฝ๋กœ ๊ด€๋ฆฌ

// GameplayTagDisplaySettings.h
UCLASS(Config=Game, DefaultConfig)
class UGameplayTagDisplaySettings : public UDeveloperSettings
{
    UPROPERTY(Config, EditAnywhere)
    TSoftObjectPtr<UDataTable> GameplayTagDisplayDataTable;
};
  • Project Settings์—์„œ DT ๊ฒฝ๋กœ๋ฅผ ์„ค์ • ๊ฐ€๋Šฅ
  • ํ•˜๋“œ์ฝ”๋”ฉ ์—†์ด ์—๋””ํ„ฐ์—์„œ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ

2. GameInstanceSubsystem์—์„œ ์ดˆ๊ธฐํ™” & ์บ์‹ฑ

void UGameplayTagDisplaySubsystem::Initialize(FSubsystemCollectionBase& Collection)
{
    const UGameplayTagDisplaySettings* Settings = GetDefault<UGameplayTagDisplaySettings>();
    GameplayTagDisplayTable = Settings->GameplayTagDisplayDataTable.LoadSynchronous();
    
    // TMap์œผ๋กœ ์บ์‹ฑ (O(1) ์กฐํšŒ)
    TArray<FGameplayTagDisplayData*> Rows;
    DataTable->GetAllRows<FGameplayTagDisplayData>(TEXT("LoadDataTable"), Rows);
    for (FGameplayTagDisplayData* Row : Rows)
    {
        CachedDisplayData.Add(Row->Tag, *Row);
    }
}

3. ์œ„์ ฏ์—์„œ ์‹ค์ œ ์‚ฌ์šฉ

void UItemInfo::UpdateCraftingItemStatView(const FItemData& ItemData)
{
    TagDisplaySubsystem = UGameplayTagDisplaySubsystem::Get(this);
    ItemStatView->ClearListItems();
    
    switch (ItemData.Category)
    {
    case EItemCategory::TOOL:
        // ์ฑ„์ทจ ์œ ํ˜• - ์—ฌ๋Ÿฌ ํƒœ๊ทธ๋ฅผ ์‰ผํ‘œ๋กœ ์—ฐ๊ฒฐ
        UStatDataObject* StatData = NewObject<UStatDataObject>();
        StatData->StatName = TagDisplaySubsystem->GetDisplayName_KR(TAG_Display_Stat_HarvestTarget);
        StatData->StatValue = TagDisplaySubsystem->GetDisplayNamesFromContainer_KR(
            ItemData.ToolData.HarvestTargetTag);
        ItemStatView->AddItem(StatData);
        
        // ๊ณต๊ฒฉ๋ ฅ - ๊ฐ’ + ๋‹จ์œ„ ํฌ๋งทํŒ…
        GetStatData_KR(*StatData, TAG_Display_Stat_AttackDamage, ItemData.ToolData.DamageValue);
        ItemStatView->AddItem(StatData);
        break;
    }
}

void UItemInfo::GetStatData_KR(UStatDataObject& OutStatData, const FGameplayTag& StatTag, const float& StatValue)
{
    FGameplayTagDisplayData DisplayData;
    if (TagDisplaySubsystem->GetDisplayData(StatTag, DisplayData))
    {
        OutStatData.StatName = DisplayData.DisplayName_KR;
        OutStatData.StatValue = FText::AsNumber(StatValue);
        OutStatData.StatUnit = TagDisplaySubsystem->GetUnit(StatTag); // "์ดˆ", "%", "๊ฐœ" ๋“ฑ
    }
}

๐Ÿ”‘ ํ•ต์‹ฌ ํฌ์ธํŠธ

  1. DeveloperSettings ํ™œ์šฉ: ์—๋””ํ„ฐ์—์„œ ์ง์ ‘ DT ๊ฒฝ๋กœ ์„ค์ •, ์ฝ”๋“œ ์ˆ˜์ • ์—†์ด ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ
  2. Initialize์—์„œ ์บ์‹ฑ: ๋Ÿฐํƒ€์ž„๋งˆ๋‹ค DT๋ฅผ ์ˆœํšŒํ•˜์ง€ ์•Š๊ณ  TMap์œผ๋กœ O(1) ์กฐํšŒ
  3. Static Get() ํ—ฌํผ: WorldContextObject๋งŒ ์žˆ์œผ๋ฉด ์–ด๋””์„œ๋“  ์ ‘๊ทผ ๊ฐ€๋Šฅ
  4. ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜ ์ œ๊ณต:
    • GetDisplayName_KR/EN - ๋‹จ์ผ ํƒœ๊ทธ ํ‘œ์‹œ๋ช…
    • GetDisplayNamesFromContainer_KR - ์—ฌ๋Ÿฌ ํƒœ๊ทธ๋ฅผ ์‰ผํ‘œ๋กœ ์—ฐ๊ฒฐ
    • GetUnit - ๋‹จ์œ„๋งŒ ๊ฐ€์ ธ์˜ค๊ธฐ
    • GetDisplayData - ์ „์ฒด ๋ฐ์ดํ„ฐ ํ•œ ๋ฒˆ์—
  5. ListView์™€์˜ ์กฐํ•ฉ: UStatDataObject๋ฅผ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•ด์„œ AddItem โ†’ ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„๋กœ ๋‹ค๋ฅธ ์Šคํƒฏ ํ‘œ์‹œ

๐Ÿ“‚ ๊ตฌ์กฐ

Settings (์—๋””ํ„ฐ) โ†’ Subsystem (์บ์‹ฑ) โ†’ Widget (์‚ฌ์šฉ)
     โ†“                    โ†“                โ†“
  DT ๊ฒฝ๋กœ ์„ค์ •      Initialize์—์„œ      Get()์œผ๋กœ ์ ‘๊ทผ
                  TMap์— ์บ์‹ฑ         GetDisplayName_KR()

๐Ÿ’ก ๋А๋‚€ ์  (What I Felt)

์ฒ˜์Œ์—” ํšจ๊ณผ ํƒœ๊ทธ, ์Šคํƒฏ ๋ณ„๋กœ ์ถœ๋ ฅํ•  ์ด๋ฆ„๊ณผ ๋‹จ์œ„๋ฅผ ๋งคํ•‘ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๋‹ค๊ฐ€ ํšจ๊ณผ๊ฐ€ ์ถ”๊ฐ€๋˜๊ฑฐ๋‚˜ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์„ ๋•Œ ๋ถˆํŽธํ•จ์ด ์ปค์งˆ๊ฒƒ ๊ฐ™์•„ ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ”๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์„ ์„ ํƒํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ”์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด ๊ฒŒ์ž„์ธ์Šคํ„ด์Šค ์„œ๋ธŒ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ–ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์œ„์ ฏ์—์„œ ์•„์ดํ…œ ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„๋กœ ๋ถ„๊ธฐ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ถ€๋ถ„์ด ์ข€ ์ง€์ €๋ถ„ํ•ด ๋ณด์ด๊ธด ํ•˜๋Š”๋ฐ ์ด๊ฑด ๋‚˜์ค‘์— ํŒฉํ† ๋ฆฌ ํŒจํ„ด์œผ๋กœ ๊ฐœ์„ ํ•ด๋ด์•ผ๊ฒ ๋‹ค.


1๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2025๋…„ 12์›” 6์ผ

๋ฉ‹์ง€๋‹ค

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ