Company
교육 철학

Configuration (설정) 시스템

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.
캐싱
자주 쓰는 설정 값은 별도 변수에 저장하여 반복 조회 최소화