Configuration (설정) 시스템
관련 소스 파일
•
GameFramework/Config/ConfigManager.cs
•
GameFramework/Config/IConfigHelper.cs
•
GameFramework/Config/IConfigManager.cs
•
GameFramework/DataTable/DataTableManager.cs
•
GameFramework/DataTable/IDataTableHelper.cs
•
GameFramework/DataTable/IDataTableManager.cs
•
GameFramework/Localization/ILocalizationHelper.cs
•
GameFramework/Localization/ILocalizationManager.cs
•
GameFramework/Localization/LocalizationManager.cs
소개
Game Framework의 Configuration(설정) 시스템은 전역 게임 설정을 관리하는 중앙화된 메커니즘을 제공합니다.
이 시스템은 게임 동작의 다양한 측면을 제어하는 키-값(key-value) 쌍의 설정 데이터를 저장, 조회, 수정할 수 있도록 해줍니다.
•
Data Table 시스템이 구조화된 게임 데이터를 처리하는 것과 달리,
•
Localization 시스템이 언어별 텍스트를 처리하는 것과 달리,
•
Configuration 시스템은 단순하고 전역에서 접근 가능한 게임 설정에 초점을 맞춥니다.
시스템 아키텍처
Configuration 시스템은 ConfigManager 클래스와 그 지원 컴포넌트를 중심으로 구성됩니다.
이 시스템은 boolean, integer, float, string의 다양한 형식으로 값을 저장하고 조회할 수 있는 유연한 메커니즘을 제공합니다.
주요 구성 요소
•
IConfigManager : 설정 관리 API를 정의하는 인터페이스
•
ConfigManager : 설정 관리자 구현체
•
ConfigData : 설정 값을 여러 형식으로 저장하는 내부 구조체
•
IConfigHelper : 플랫폼별 설정 유틸리티를 위한 인터페이스
설정 데이터 구조
각 설정 항목은 ConfigData 구조체에 저장되며, 다음 네 가지 형식의 값이 동시에 유지됩니다.
1.
Boolean 값
2.
Integer 값
3.
Float 값
4.
String 값
값이 추가될 때 네 가지 형식으로 모두 파싱되어 저장되므로, 나중에 조회 시 변환 과정 없이 효율적으로 접근할 수 있습니다.
설정 로딩 파이프라인
Configuration 시스템은 리소스 매니저, 데이터 프로바이더, 설정 헬퍼를 사용하여 설정 데이터를 읽어들입니다.
Configuration 시스템 사용법
1. 시스템 초기화
// ConfigManager 인스턴스 얻기
IConfigManager configManager = GameFrameworkEntry.GetModule<IConfigManager>();
// 의존성 주입
configManager.SetResourceManager(resourceManager);
configManager.SetDataProviderHelper(dataProviderHelper);
configManager.SetConfigHelper(configHelper);
C#
복사
2. 설정 값 읽기
존재 여부 확인
bool exists = configManager.HasConfig("MusicVolume");
C#
복사
값 가져오기 (없으면 예외 발생)
bool enableMusic = configManager.GetBool("EnableMusic");
int enemyCount = configManager.GetInt("EnemyCount");
float movementSpeed = configManager.GetFloat("MovementSpeed");
string serverAddress = configManager.GetString("ServerAddress");
C#
복사
기본값을 설정하여 가져오기 (없어도 안전)
bool enableVibration = configManager.GetBool("EnableVibration", false);
int maxPlayers = configManager.GetInt("MaxPlayers", 4);
float timescale = configManager.GetFloat("Timescale", 1.0f);
string defaultName = configManager.GetString("DefaultName", "Player");
C#
복사
3. 설정 추가/삭제
// 새로운 설정 추가
configManager.AddConfig("NewSetting", "true");
// 형식별 값 지정하여 추가
configManager.AddConfig("ComplexSetting", true, 42, 3.14f, "Hello");
// 설정 삭제
configManager.RemoveConfig("ObsoleteSetting");
// 모든 설정 제거
configManager.RemoveAllConfigs();
C#
복사
4. 외부 리소스에서 설정 로드
// 설정 파일 로드
configManager.ReadData("GameConfig.txt");
// 우선순위 지정하여 로드
configManager.ReadData("GameConfig.txt", 100);
// 사용자 데이터와 함께 로드
configManager.ReadData("GameConfig.txt", userData);
// 로딩 이벤트 핸들링
configManager.ReadDataSuccess += OnConfigLoadSuccess;
configManager.ReadDataFailure += OnConfigLoadFailure;
C#
복사
다른 프레임워크 시스템과의 관계
시스템 | 목적 | 구조 | 지속성 | 사용 예시 |
Configuration | 전역 게임 설정 | 단순 key-value | 런타임 전용 | 게임 파라미터, 플래그, 설정 |
Data Table | 구조화된 게임 데이터 | ID 기반 행(Row) | 런타임 전용 | 캐릭터 스탯, 아이템 |
Localization | 언어별 텍스트 | 언어 키 딕셔너리 | 런타임 전용 | UI 텍스트, 대사 |
Setting | 사용자 설정 | 직렬화 가능 값 | 세션 간 지속 | 세이브 데이터 |
Data Node | 계층적 데이터 | 트리 구조 | 런타임 전용 | 복잡한 게임 상태 |
ConfigData 구조 예시
public bool AddConfig(string configName, string configValue)
{
bool boolValue = false;
bool.TryParse(configValue, out boolValue);
int intValue = 0;
int.TryParse(configValue, out intValue);
float floatValue = 0f;
float.TryParse(configValue, out floatValue);
return AddConfig(configName, boolValue, intValue, floatValue, configValue);
}
C#
복사
→ 문자열 값이 입력되면, Boolean / Int / Float / String 네 가지 형태로 모두 변환하여 저장합니다.
베스트 프랙티스
1.
초기화 순서
•
다른 시스템이 의존하기 전에 게임 시작 시 가장 먼저 초기화
2.
기본값 활용
•
설정이 없을 경우 안전하게 기본값을 반환하는 오버로드 사용
3.
설정 네이밍 규칙
•
"Graphics.Quality", "Audio.Volume"처럼 그룹화
4.
에러 처리
•
파일 로드 실패, 필수 설정 누락 시 처리 로직 추가
5.
값 검증
•
범위와 형식을 체크 후 저장
6.
캐싱
•
자주 쓰는 설정 값은 별도 변수에 저장하여 반복 조회 최소화