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: 리소스에서 데이터 테이블 파일 로드
•
Access Data: GetDataRow(id) 또는 쿼리 메서드를 통해 데이터 행 접근
•
Destroy Tables: 더 이상 필요하지 않을 때 리소스 해제
예시:
// 커스텀 데이터 타입용 데이터 테이블 생성
IDataTable<ItemData> itemTable = GameEntry.GetComponent<DataTableComponent>().CreateDataTable<ItemData>();
// 리소스에서 데이터 로드
GameEntry.GetComponent<DataTableComponent>().LoadDataTable("Items");
// 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
•
데이터 테이블 구성: 데이터 테이블에 올바른 스키마를 만들고 일관성을 유지하세요.
•
타입 안전 접근 사용: 가능한 경우 항상 타입 안전한 데이터 접근 메서드를 사용하세요.
•
로딩 실패 처리: 데이터 로딩 성공 여부를 항상 확인하고, 대체 메커니즘을 제공하세요.
•
로컬라이제이션 워크플로우: 언어 동기화를 유지하기 위해 로컬라이제이션 키 추가/업데이트에 대한 워크플로우를 구축하세요.
•
데이터 검증: 데이터 테이블과 설정 파일에 대한 검증을 구현하여 오류를 조기에 발견하세요.
•
설정 백업: 플레이어 설정 데이터 손실을 방지하기 위해 백업 메커니즘을 고려하세요.
•
런타임 로딩 최소화: 메모리 사용과 로딩 시간을 줄이기 위해 런타임에는 필요한 데이터만 로드하세요.