์„œ๋น„์Šค
๊ต์œก ์ฒ ํ•™

Data Management

Abstract

๐Ÿ“Œ
๊ฒŒ์ž„ ๋ฐ์ดํ„ฐ๋Š” ์„ฑ๊ฒฉ์— ๋”ฐ๋ผ ๋„ค ๊ตฐ๋ฐ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค. ๋ฌด์—‡์„ ์–ด๋””์— ๋„ฃ์„์ง€๋งŒ ์ •ํ•˜๋ฉด ๋‚˜๋จธ์ง€๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค โ€” ํ…์ŠคํŠธ ์—์…‹์„ ์ฝ์–ด ํŒŒ์‹ฑํ•˜๊ณ , ํƒ€์ž…์ด ์žˆ๋Š” API ๋กœ ๊บผ๋‚ด ์ค๋‹ˆ๋‹ค.
์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋””์— ๋„ฃ๋‚˜
๋ชจ๋“ˆ
๋„ฃ๋Š” ๊ฒƒ
์˜ˆ
์“ฐ๊ธฐ
DataTable
๊ฐ™์€ ๋ชจ์–‘์˜ ํ–‰์ด ์—ฌ๋Ÿฌ ๊ฐœ์ธ ํ‘œ
์  5์ข…์˜ ์ฒด๋ ฅยท๊ณต๊ฒฉ๋ ฅยท์ ์ˆ˜, ์•„์ดํ…œ ๋ชฉ๋ก
์ฝ๊ธฐ ์ „์šฉ
Config
์ด๋ฆ„ ํ•˜๋‚˜์— ๊ฐ’ ํ•˜๋‚˜์ธ ์ „์—ญ ์ƒ์ˆ˜
์„œ๋ฒ„ ์ฃผ์†Œ, ์ตœ๋Œ€ ๋™์‹œ ์Šคํฐ ์ˆ˜, ํŠœํ† ๋ฆฌ์–ผ on/off
์ฝ๊ธฐ ์ „์šฉ
Localization
์–ธ์–ด๋ณ„ ๋ฌธ์ž์—ด
"Game Over!", "์ ์ˆ˜: {0}"
์ฝ๊ธฐ ์ „์šฉ
Setting
ํ”Œ๋ ˆ์ด์–ด ๊ธฐ๊ธฐ์— ์ €์žฅ๋˜๋Š” ๊ฐ’
๋ณผ๋ฅจ, ์ตœ๊ณ  ์ ์ˆ˜, ๋งˆ์ง€๋ง‰ ์„ ํƒ ์บ๋ฆญํ„ฐ
์ฝ๊ธฐ + ์“ฐ๊ธฐ
์•ž์˜ ์…‹์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋งŒ๋“ค์–ด ๋ฐฐํฌํ•˜๋Š” ๋ฐ์ดํ„ฐ์ด๊ณ , Setting ๋งŒ ํ”Œ๋ ˆ์ด์–ด ๊ธฐ๊ธฐ์—์„œ ๋ฐ”๋€Œ๋Š” ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค.
ToyboxNightmare ์—์„œ๋Š” โ€” ์•„์ง ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค
์˜ˆ์ œ๋Š” ๊ทœ๋ชจ๊ฐ€ ์ž‘์•„ ์ˆ˜์น˜๋ฅผ C# ์ƒ์ˆ˜๋กœ ๋“ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ๋‚˜์ค‘์— ์˜ฎ๊ธฐ๊ธฐ ์‰ฌ์šด ๋ชจ์–‘์œผ๋กœ ํ•œ๊ณณ์— ๋ชจ์•„ ๋‘์—ˆ์Šต๋‹ˆ๋‹ค.
// EnemyTable.cs โ€” ์ง€๊ธˆ์€ ์ฝ”๋“œ ์ƒ์ˆ˜ // ์ฃผ์†Œ HP ๊ณต๊ฒฉ ๊ฐ„๊ฒฉ ์ ์ˆ˜ ์†๋„ ์ •์ง€ ๊ณต๊ฒฉ๊ตฌ new EnemyStats("Zombunny", 100, 10, 0.5f, 10, 3.5f, 1.1f, 0.8f), new EnemyStats("Hellephant", 200, 35, 2.0f, 50, 3.5f, 1.9f, 1.63f),
C#
๋ณต์‚ฌ
์ด ํ‘œ๊ฐ€ ๊ทธ๋Œ€๋กœ DataTable ์˜ ํ›„๋ณด์ž…๋‹ˆ๋‹ค. ์˜ฎ๊ธฐ๊ณ  ๋‚˜๋ฉด ๊ธฐํš์ž๊ฐ€ ์ฝ”๋“œ๋ฅผ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ  ํ…์ŠคํŠธ ํŒŒ์ผ๋งŒ ๊ณ ์ณ ๋ฐธ๋Ÿฐ์Šค๋ฅผ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ™•์žฅํ•œ๋‹ค๋ฉด โ€” ๊ฐ€์žฅ ํšจ๊ณผ๊ฐ€ ํฐ ์ˆœ์„œ
โ€ข
Setting ์œผ๋กœ ๋ณผ๋ฅจ ์ €์žฅ: ์˜ˆ์ œ์˜ ์ผ์‹œ์ •์ง€ ๋ฉ”๋‰ด๋Š” ๋ณผ๋ฅจ ์Šฌ๋ผ์ด๋”๊ฐ€ ์žˆ์ง€๋งŒ ๊ฒŒ์ž„์„ ๊ป๋‹ค ์ผœ๋ฉด ์ดˆ๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค. SetFloat("Volume.Music", v) + Save() ๋‘ ์ค„์ด๋ฉด ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ์ตœ๊ณ  ์ ์ˆ˜๋„ ๊ฐ™์€ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
โ€ข
DataTable ๋กœ EnemyTable / WeaponTable ์ด์ „: ์  ์ข…๋ฅ˜๋‚˜ ๋ฌด๊ธฐ๊ฐ€ ์—ด ๊ฐœ๋ฅผ ๋„˜์–ด๊ฐ€๋ฉด ์ฝ”๋“œ ์ƒ์ˆ˜๋Š” ๊ด€๋ฆฌ๊ฐ€ ์•ˆ ๋ฉ๋‹ˆ๋‹ค.
โ€ข
Localization: HUD ์˜ ๊ณ ์ • ๋ฌธ๊ตฌ("Game Over!")๋ฅผ ํ‚ค๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
10. ํ™•์žฅ ๊ณผ์ œ โ€” ์—ฌ๊ธฐ์„œ๋ถ€ํ„ฐ๋Š” ์ง์ ‘ ์— ์‹ค์Šต ๊ณผ์ œ๋กœ ์ •๋ฆฌํ•ด ๋‘์—ˆ์Šต๋‹ˆ๋‹ค.
โš ๏ธ
์ด ์—๋””์…˜์—์„œ ๋‹ค๋ฅธ ์ 
โ€ข
๋ฐ์ดํ„ฐ ํŒŒ์ผ์€ TextAsset ์œผ๋กœ Addressables ์— ๋“ฑ๋กํ•˜๊ณ , ReadData ์—๋Š” ๊ทธ ์ฃผ์†Œ๋ฅผ ๋„˜๊น๋‹ˆ๋‹ค.
โ€ข
๋กœ๋“œ๋Š” ๋น„๋™๊ธฐ์ž…๋‹ˆ๋‹ค. ReadData ๋ฅผ ๋ถ€๋ฅธ ๋‹ค์Œ ์ค„์—์„œ ๋ฐ”๋กœ GetDataRow ๋ฅผ ํ•˜๋ฉด ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค. LoadDataTableSuccessEventArgs / LoadConfigSuccessEventArgs / LoadDictionarySuccessEventArgs ๋ฅผ ๊ธฐ๋‹ค๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค.
โ€ข
Config ์™€ Localization ์˜ ๊ธฐ๋ณธ ํฌ๋งท์€ ํƒญ์œผ๋กœ ๊ตฌ๋ถ„๋œ 4์—ด์ด๋ฉฐ 2๋ฒˆ์งธ ์—ด์ด ํ‚ค, 4๋ฒˆ์งธ ์—ด์ด ๊ฐ’์ž…๋‹ˆ๋‹ค. 1ยท3๋ฒˆ์งธ ์—ด์€ ์ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์ฃผ์„ ์šฉ๋„). ์•„๋ž˜ ๋ณธ๋ฌธ ์˜ˆ์‹œ์˜ bool / float / string ์€ ํƒ€์ž… ์ง€์ •์ด ์•„๋‹ˆ๋ผ 3๋ฒˆ์งธ ์—ด์— ์ ์€ ๋ฉ”๋ชจ์ผ ๋ฟ์ด๊ณ , ๊ฐ’์˜ ํƒ€์ž…์€ ๊บผ๋‚ผ ๋•Œ(GetBool, GetFloat โ€ฆ) ์ •ํ•ด์ง‘๋‹ˆ๋‹ค.
โ€ข
๋ณธ๋ฌธ "์ถœ์ฒ˜"์˜ ๊ฒฝ๋กœ์™€ ์ค„ ๋ฒˆํ˜ธ๋Š” ์›์ž‘ ์ €์žฅ์†Œ ๊ธฐ์ค€์ž…๋‹ˆ๋‹ค. ์ด ์—๋””์…˜์—์„œ๋Š” Packages/com.yamyamcoding.gameframework/Runtime/UnityGameFramework/ ์•„๋ž˜์— ์žˆ์Šต๋‹ˆ๋‹ค.

Data Management

๊ด€๋ จ ์†Œ์Šค ํŒŒ์ผ
โ€ข
Scripts/Runtime/Config/ConfigComponent.cs
โ€ข
Scripts/Runtime/Config/ConfigHelperBase.cs
โ€ข
Scripts/Runtime/Config/DefaultConfigHelper.cs
โ€ข
Scripts/Runtime/DataTable/DataRowBase.cs
โ€ข
Scripts/Runtime/DataTable/DataTableComponent.cs
โ€ข
Scripts/Runtime/DataTable/DataTableHelperBase.cs
โ€ข
Scripts/Runtime/DataTable/DefaultDataTableHelper.cs
โ€ข
Scripts/Runtime/Localization/DefaultLocalizationHelper.cs
โ€ข
Scripts/Runtime/Localization/LocalizationComponent.cs
โ€ข
Scripts/Runtime/Localization/LocalizationHelperBase.cs
โ€ข
Scripts/Runtime/Setting/DefaultSetting.cs
โ€ข
Scripts/Runtime/Setting/DefaultSettingHelper.cs
โ€ข
Scripts/Runtime/Setting/PlayerPrefsSettingHelper.cs
โ€ข
Scripts/Runtime/Setting/PlayerPrefsSettingHelper.cs.meta
โ€ข
Scripts/Runtime/Setting/SettingComponent.cs
โ€ข
Scripts/Runtime/Setting/SettingHelperBase.cs
๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์€ Unity Game Framework์—์„œ ๊ตฌ์กฐํ™”๋œ ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ”, ์ „์—ญ ์„ค์ •, ๋กœ์ปฌ๋ผ์ด์ œ์ด์…˜ ์ž์‚ฐ, ๊ทธ๋ฆฌ๊ณ  ์ง€์†์ ์ธ ํ”Œ๋ ˆ์ด์–ด ์„ค์ •์„ ํฌํ•จํ•œ ๋‹ค์–‘ํ•œ ์œ ํ˜•์˜ ๊ฒŒ์ž„ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด ์„œ๋ธŒ์‹œ์Šคํ…œ๋“ค์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฒŒ์ž„์˜ ๋ผ์ดํ”„์‚ฌ์ดํด ์ „๋ฐ˜์— ๊ฑธ์ณ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

Overview

๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๋„ค ๊ฐ€์ง€ ์ฃผ์š” ์„œ๋ธŒ์‹œ์Šคํ…œ์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค:
โ€ข
Data Tables: ํ–‰๊ณผ ์—ด๋กœ ๊ตฌ์„ฑ๋œ ๊ตฌ์กฐํ™”๋œ ๊ฒŒ์ž„ ๋ฐ์ดํ„ฐ (โ†’ Data Tables ์ฐธ์กฐ)
โ€ข
Configuration: ๋Ÿฐํƒ€์ž„์— ๋กœ๋“œ๋˜๋Š” ์ „์—ญ ๊ฒŒ์ž„ ์„ค์ • (โ†’ Configuration System ์ฐธ์กฐ)
โ€ข
Localization: ๋‹ค๊ตญ์–ด ํ…์ŠคํŠธ์™€ ๋ฆฌ์†Œ์Šค (โ†’ Localization System ์ฐธ์กฐ)
โ€ข
Settings: ๊ฒŒ์ž„ ์„ธ์…˜ ๊ฐ„์— ์ €์žฅ๋˜๋Š” ์ง€์†์ ์ธ ํ”Œ๋ ˆ์ด์–ด ์„ค์ •
๊ฐ ์„œ๋ธŒ์‹œ์Šคํ…œ์€ ์œ ์‚ฌํ•œ ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์„ ๋”ฐ๋ฅด๋ฉฐ, ํ—ฌํผ ํŒจํ„ด์„ ํ†ตํ•œ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
์ถœ์ฒ˜:
Scripts/Runtime/DataTable/DataTableComponent.cs
Scripts/Runtime/Config/ConfigComponent.cs
Scripts/Runtime/Localization/LocalizationComponent.cs
Scripts/Runtime/Setting/SettingComponent.cs

Common Architecture Pattern

๋„ค ๊ฐ€์ง€ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ์„œ๋ธŒ์‹œ์Šคํ…œ ๋ชจ๋‘ ์ผ๊ด€์„ฑ๊ณผ ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ๋™์ผํ•œ ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.
๊ฐ ์„œ๋ธŒ์‹œ์Šคํ…œ์€ ๋‹ค์Œ์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค:
โ€ข
Component: ํผ๋ธ”๋ฆญ API๋ฅผ ์ œ๊ณตํ•˜๋Š” Unity MonoBehaviour
โ€ข
Manager: Game Framework๊ฐ€ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•ต์‹ฌ ๊ตฌํ˜„
โ€ข
Helper Base: ๋ฐ์ดํ„ฐ ๋กœ๋“œ ๋ฐ ํŒŒ์‹ฑ ๋ฐฉ์‹์„ ์ •์˜ํ•˜๋Š” ์ถ”์ƒ ํด๋ž˜์Šค
โ€ข
Default Helper: ํ—ฌํผ ์ธํ„ฐํŽ˜์ด์Šค์˜ ํ‘œ์ค€ ๊ตฌํ˜„
์ถœ์ฒ˜:
Scripts/Runtime/DataTable/DataTableHelperBase.cs
Scripts/Runtime/Config/ConfigHelperBase.cs
Scripts/Runtime/Localization/LocalizationHelperBase.cs
Scripts/Runtime/Setting/SettingHelperBase.cs

Data Table System

๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ” ์‹œ์Šคํ…œ์€ ํ–‰๊ณผ ์—ด๋กœ ๊ตฌ์„ฑ๋œ ๊ตฌ์กฐํ™”๋œ ๊ฒŒ์ž„ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ํƒ€์ž… ์•ˆ์ •์„ฑ์ด ๋ณด์žฅ๋œ ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œ, ํŒŒ์‹ฑ, ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
์ฃผ์š” ์ž‘์—…:
โ€ข
Create Data Tables: CreateDataTable<T>() (T๋Š” IDataRow๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค)
โ€ข
Load Data: DataTableBase.ReadData(์ฃผ์†Œ) ๋กœ ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ” ํŒŒ์ผ ๋กœ๋“œ
โ€ข
Access Data: GetDataRow(id) ๋˜๋Š” ์ฟผ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ํ–‰ ์ ‘๊ทผ
โ€ข
Destroy Tables: ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์„ ๋•Œ ๋ฆฌ์†Œ์Šค ํ•ด์ œ
์˜ˆ์‹œ:
// ์ปค์Šคํ…€ ๋ฐ์ดํ„ฐ ํƒ€์ž…์šฉ ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ” ์ƒ์„ฑ IDataTable<ItemData> itemTable = GameEntry.GetComponent<DataTableComponent>().CreateDataTable<ItemData>(); // ๋ฆฌ์†Œ์Šค์—์„œ ๋ฐ์ดํ„ฐ ๋กœ๋“œ (๋น„๋™๊ธฐ). ReadData ๋Š” IDataTable<T> ๊ฐ€ ์•„๋‹ˆ๋ผ DataTableBase ์— ์žˆ๋‹ค ((DataTableBase)itemTable).ReadData("Items"); // "Items" = Addressables ์ฃผ์†Œ // LoadDataTableSuccess ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›์€ ๋’ค์— ID๋กœ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ItemData item = itemTable.GetDataRow(10001);
C#
๋ณต์‚ฌ
์ถœ์ฒ˜:
Scripts/Runtime/DataTable/DataTableComponent.cs 144-264
Scripts/Runtime/DataTable/DefaultDataTableHelper.cs 22-169
Scripts/Runtime/DataTable/DataRowBase.cs 15-51

Configuration System

์„ค์ • ์‹œ์Šคํ…œ์€ ์ „์—ญ ๊ฒŒ์ž„ ์„ค์ •์„ ์ €์žฅํ•˜๊ณ  ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์„ค์ •์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋Ÿฐํƒ€์ž„์— ๊ตฌ์„ฑ ํŒŒ์ผ์—์„œ ๋กœ๋“œ๋˜๋ฉฐ ๊ฒŒ์ž„ ์„ธ์…˜ ๋™์•ˆ ์ผ์ •ํ•˜๊ฒŒ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

์ฃผ์š” ํŠน์ง•

โ€ข
๊ฐ„๋‹จํ•œ Key-Value ํ˜•์‹: ํƒญ์œผ๋กœ ๊ตฌ๋ถ„๋œ ํ‚ค-๊ฐ’ ํฌ๋งท
โ€ข
์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ ํƒ€์ž… ์ง€์›: bool, int, float, string ๊ฐ’ ์ง€์›
โ€ข
๊ธฐ๋ณธ๊ฐ’ ์ œ๊ณต: ์„ค์ • ํ‚ค๊ฐ€ ์—†์„ ๊ฒฝ์šฐ ๊ธฐ๋ณธ๊ฐ’ ์ œ๊ณต ๊ฐ€๋Šฅ
โ€ข
๋Ÿฐํƒ€์ž„ ์ ‘๊ทผ: ๊ฒŒ์ž„ ์–ด๋””์„œ๋“  ์†์‰ฝ๊ฒŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ
์˜ˆ์‹œ:
// ๊ตฌ์„ฑ ํŒŒ์ผ ๋กœ๋“œ GameEntry.GetComponent<ConfigComponent>().ReadData("DefaultConfig"); // ์„ค์ • ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ bool enableTutorial = GameEntry.GetComponent<ConfigComponent>().GetBool("EnableTutorial", true); float musicVolume = GameEntry.GetComponent<ConfigComponent>().GetFloat("MusicVolume", 0.8f); string serverAddress = GameEntry.GetComponent<ConfigComponent>().GetString("ServerAddress", "localhost");
C#
๋ณต์‚ฌ
์ƒ˜ํ”Œ ๊ตฌ์„ฑ ํŒŒ์ผ ํ˜•์‹:
# Comment line 1 EnableTutorial bool true 2 MusicVolume float 0.8 3 ServerAddress string localhost
Plain Text
๋ณต์‚ฌ
์ถœ์ฒ˜:
Scripts/Runtime/Config/ConfigComponent.cs 20-407
Scripts/Runtime/Config/DefaultConfigHelper.cs 20-180
Scripts/Runtime/Config/ConfigHelperBase.cs 17-68

Localization System

๋กœ์ปฌ๋ผ์ด์ œ์ด์…˜ ์‹œ์Šคํ…œ์€ ๋‹ค๊ตญ์–ด ํ…์ŠคํŠธ์™€ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์„ ํƒ๋œ ์–ธ์–ด์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋ฌธ์ž์—ด ์‚ฌ์ „์„ ๋กœ๋“œํ•˜์—ฌ ์—ฌ๋Ÿฌ ์–ธ์–ด ์ง€์›์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์š” ํŠน์ง•

โ€ข
๋‹ค๊ตญ์–ด ์ง€์›
โ€ข
์‹œ์Šคํ…œ ์–ธ์–ด ์ž๋™ ๊ฐ์ง€
โ€ข
๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํฌํ•จํ•œ ๋ฌธ์ž์—ด ํฌ๋งท ์ง€์›
โ€ข
Key-Value ์Œ์˜ ๋”•์…”๋„ˆ๋ฆฌ ํŒŒ์ผ ๊ตฌ์กฐ
โ€ข
๋Ÿฐํƒ€์ž„ ์–ธ์–ด ์ „ํ™˜ ๊ฐ€๋Šฅ
์˜ˆ์‹œ:
// ํ˜„์žฌ ์–ธ์–ด ์„ค์ • GameEntry.GetComponent<LocalizationComponent>().Language = Language.English; // ํ˜„์žฌ ์–ธ์–ด์— ๋งž๋Š” ๋”•์…”๋„ˆ๋ฆฌ ๋กœ๋“œ GameEntry.GetComponent<LocalizationComponent>().ReadData("UI"); // ์ง€์—ญํ™”๋œ ๋ฌธ์ž์—ด ๊ฐ€์ ธ์˜ค๊ธฐ string welcomeMessage = GameEntry.GetComponent<LocalizationComponent>().GetString("Welcome"); string greetingMessage = GameEntry.GetComponent<LocalizationComponent>().GetString("Greeting", playerName);
C#
๋ณต์‚ฌ
์ƒ˜ํ”Œ ๋”•์…”๋„ˆ๋ฆฌ ํŒŒ์ผ ํ˜•์‹:
# Comment line 1 Welcome string Welcome to our game! 2 Greeting string Hello, {0}! 3 Score string Your score: {0}
Plain Text
๋ณต์‚ฌ
์ถœ์ฒ˜:
Scripts/Runtime/Localization/LocalizationComponent.cs 20-1113
Scripts/Runtime/Localization/DefaultLocalizationHelper.cs 20-238
Scripts/Runtime/Localization/LocalizationHelperBase.cs 17-76

Setting System

์„ค์ • ์‹œ์Šคํ…œ์€ ๊ฒŒ์ž„ ์„ธ์…˜ ๊ฐ„์— ์ €์žฅ๋˜์–ด์•ผ ํ•˜๋Š” ์ง€์†์ ์ธ ํ”Œ๋ ˆ์ด์–ด ์„ค์ •์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์„ค์ • ์‹œ์Šคํ…œ์€ ์ฝ๊ธฐ๋ฟ ์•„๋‹ˆ๋ผ ์“ฐ๊ธฐ๋„ ์ง€์›ํ•œ๋‹ค๋Š” ์ ์—์„œ ๊ตฌ์„ฑ ์‹œ์Šคํ…œ๊ณผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

์ฃผ์š” ํŠน์ง•

โ€ข
๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ํƒ€์ž… ์ง€์›: bool, int, float, string, ์ง๋ ฌํ™”๋œ ๊ฐ์ฒด
โ€ข
์ž๋™ ์ €์žฅ ๋ฐ ๋กœ๋”ฉ
โ€ข
๊ธฐ๋ณธ๊ฐ’ ์ œ๊ณต
โ€ข
์—ฌ๋Ÿฌ ์ €์žฅ ์˜ต์…˜: ๊ธฐ๋ณธ ํŒŒ์ผ ๊ธฐ๋ฐ˜ ์ €์žฅ ๋˜๋Š” PlayerPrefs ๊ธฐ๋ฐ˜ ์ €์žฅ
โ€ข
๊ฐ์ฒด ์ง๋ ฌํ™”: JSON ์ง๋ ฌํ™”๋ฅผ ํ†ตํ•œ ๋ณต์žกํ•œ ๊ฐ์ฒด ์ €์žฅ ์ง€์›
์˜ˆ์‹œ:
// ์„ค์ • ๊ฐ’ ์ฝ๊ธฐ bool musicEnabled = GameEntry.GetComponent<SettingComponent>().GetBool("MusicEnabled", true); float volume = GameEntry.GetComponent<SettingComponent>().GetFloat("MusicVolume", 0.8f); // ์„ค์ • ๊ฐ’ ๋ณ€๊ฒฝ GameEntry.GetComponent<SettingComponent>().SetBool("MusicEnabled", false); GameEntry.GetComponent<SettingComponent>().SetFloat("MusicVolume", 0.5f); // ๋ณต์žกํ•œ ๊ฐ์ฒด ์ €์žฅ PlayerProfile profile = new PlayerProfile(); GameEntry.GetComponent<SettingComponent>().SetObject("PlayerProfile", profile); // ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์ €์žฅ GameEntry.GetComponent<SettingComponent>().Save();
C#
๋ณต์‚ฌ
โ€ข
๊ธฐ๋ณธ ์„ค์ • ์‹œ์Šคํ…œ์€ Application.persistentDataPath/GameFrameworkSetting.dat ๊ฒฝ๋กœ์— ์žˆ๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
โ€ข
PlayerPrefs ํ—ฌํผ๋Š” Unity์˜ PlayerPrefs ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
์ถœ์ฒ˜:
Scripts/Runtime/Setting/SettingComponent.cs 21-322
Scripts/Runtime/Setting/DefaultSettingHelper.cs 19-386
Scripts/Runtime/Setting/DefaultSetting.cs 19-313
Scripts/Runtime/Setting/PlayerPrefsSettingHelper.cs 18-312
Scripts/Runtime/Setting/SettingHelperBase.cs 18-208

Data Management Initialization Process

์•„๋ž˜ ์‹œํ€€์Šค ๋‹ค์ด์–ด๊ทธ๋žจ์€ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ์ปดํฌ๋„ŒํŠธ์˜ ์ดˆ๊ธฐํ™” ๊ณผ์ •์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ด ์ดˆ๊ธฐํ™” ํ”Œ๋กœ์šฐ๋Š” ๋„ค ๊ฐ€์ง€ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ์ปดํฌ๋„ŒํŠธ (DataTableComponent, ConfigComponent, LocalizationComponent, SettingComponent)์— ๋ชจ๋‘ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
์ถœ์ฒ˜:
Scripts/Runtime/DataTable/DataTableComponent.cs 69-124
Scripts/Runtime/Config/ConfigComponent.cs 67-135
Scripts/Runtime/Localization/LocalizationComponent.cs 93-162
Scripts/Runtime/Setting/SettingComponent.cs 45-77

Helper Pattern Implementation

๋‹ค์Œ ํ‘œ๋Š” ๋‹ค์–‘ํ•œ ํ—ฌํผ ์ธํ„ฐํŽ˜์ด์Šค์— ๊ฑธ์นœ ๊ณตํ†ต ๋ฉ”์„œ๋“œ๋ฅผ ๋น„๊ตํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค:
Method
DataTableHelper
ConfigHelper
LocalizationHelper
SettingHelper
ReadData from asset
โœ“
โœ“
โœ“
-
ReadData from bytes
โœ“
โœ“
โœ“
-
ParseData from string
โœ“
โœ“
โœ“
-
ParseData from bytes
โœ“
โœ“
โœ“
-
ReleaseDataAsset
โœ“
โœ“
โœ“
-
Load
-
-
-
โœ“
Save
-
-
-
โœ“
Get/Set values
-
-
-
โœ“
ํ—ฌํผ ํŒจํ„ด์€ ํ”„๋ ˆ์ž„์›Œํฌ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ๋ฐ์ดํ„ฐ์˜ ๋กœ๋“œ, ํŒŒ์‹ฑ, ์ €์žฅ ๋ฐฉ์‹์„ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ๊ด€๋œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
์ถœ์ฒ˜:
Scripts/Runtime/DataTable/DataTableHelperBase.cs 17-68
Scripts/Runtime/Config/ConfigHelperBase.cs 17-68
Scripts/Runtime/Localization/LocalizationHelperBase.cs 17-76
Scripts/Runtime/Setting/SettingHelperBase.cs 18-208

Customizing Data Management

๊ฐ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ์„œ๋ธŒ์‹œ์Šคํ…œ์€ ํ—ฌํผ ํด๋ž˜์Šค๋ฅผ ๊ตฌํ˜„ํ•จ์œผ๋กœ์จ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
1.
์ ์ ˆํ•œ ํ—ฌํผ ๋ฒ ์ด์Šค ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜๋Š” ํด๋ž˜์Šค ์ƒ์„ฑ:
โ€ข
DataTableHelperBase
โ€ข
ConfigHelperBase
โ€ข
LocalizationHelperBase
โ€ข
SettingHelperBase
2.
๋ฐ์ดํ„ฐ์˜ ๋กœ๋“œ, ํŒŒ์‹ฑ, ์ €์žฅ ๋ฐฉ์‹์„ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„
3.
Unity ์ธ์ŠคํŽ™ํ„ฐ ๋˜๋Š” ์ฝ”๋“œ์—์„œ ์ปดํฌ๋„ŒํŠธ์— ์ปค์Šคํ…€ ํ—ฌํผ ํ• ๋‹น
โ†’ ์ด๋ฅผ ํ†ตํ•ด ์ปค์Šคํ…€ ๋ฐ์ดํ„ฐ ํฌ๋งท ์ง€์›, ๋‹ค์–‘ํ•œ ์ €์žฅ ์†”๋ฃจ์…˜, ์™ธ๋ถ€ ์„œ๋น„์Šค์™€์˜ ํ†ตํ•ฉ ๋“ฑ์„ ํ”„๋ ˆ์ž„์›Œํฌ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ ๋„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Best Practices

โ€ข
๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ” ๊ตฌ์„ฑ: ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ”์— ์˜ฌ๋ฐ”๋ฅธ ์Šคํ‚ค๋งˆ๋ฅผ ๋งŒ๋“ค๊ณ  ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜์„ธ์š”.
โ€ข
ํƒ€์ž… ์•ˆ์ „ ์ ‘๊ทผ ์‚ฌ์šฉ: ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ํ•ญ์ƒ ํƒ€์ž… ์•ˆ์ „ํ•œ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
โ€ข
๋กœ๋”ฉ ์‹คํŒจ ์ฒ˜๋ฆฌ: ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ ์„ฑ๊ณต ์—ฌ๋ถ€๋ฅผ ํ•ญ์ƒ ํ™•์ธํ•˜๊ณ , ๋Œ€์ฒด ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•˜์„ธ์š”.
โ€ข
๋กœ์ปฌ๋ผ์ด์ œ์ด์…˜ ์›Œํฌํ”Œ๋กœ์šฐ: ์–ธ์–ด ๋™๊ธฐํ™”๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋กœ์ปฌ๋ผ์ด์ œ์ด์…˜ ํ‚ค ์ถ”๊ฐ€/์—…๋ฐ์ดํŠธ์— ๋Œ€ํ•œ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ๊ตฌ์ถ•ํ•˜์„ธ์š”.
โ€ข
๋ฐ์ดํ„ฐ ๊ฒ€์ฆ: ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ”๊ณผ ์„ค์ • ํŒŒ์ผ์— ๋Œ€ํ•œ ๊ฒ€์ฆ์„ ๊ตฌํ˜„ํ•˜์—ฌ ์˜ค๋ฅ˜๋ฅผ ์กฐ๊ธฐ์— ๋ฐœ๊ฒฌํ•˜์„ธ์š”.
โ€ข
์„ค์ • ๋ฐฑ์—…: ํ”Œ๋ ˆ์ด์–ด ์„ค์ • ๋ฐ์ดํ„ฐ ์†์‹ค์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐฑ์—… ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๊ณ ๋ คํ•˜์„ธ์š”.
โ€ข
๋Ÿฐํƒ€์ž„ ๋กœ๋”ฉ ์ตœ์†Œํ™”: ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๊ณผ ๋กœ๋”ฉ ์‹œ๊ฐ„์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ๋Ÿฐํƒ€์ž„์—๋Š” ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ๋กœ๋“œํ•˜์„ธ์š”.