서비스
교육 철학

설정 시스템 (Configuration System)

Abstract

📌
이름이 비슷해서 헷갈리지만 둘은 방향이 반대입니다. Config 는 개발자가 정해서 내보내는 값(읽기 전용), Setting 은 플레이어 기기에 저장되는 값(읽고 쓰기)입니다. "게임을 껐다 켜도 남아 있어야 하는가?"가 예라면 Setting 입니다.
실무에서 필요한 순간
•
Setting: 볼륨·화면 옵션, 최고 점수, 튜토리얼을 봤는지, 마지막으로 고른 캐릭터
•
Config: 서버 주소, 동시 스폰 상한, 기능 on/off 스위치처럼 빌드를 다시 하지 않고 바꾸고 싶은 상수
직접 해 보기 — ToyboxNightmare 의 볼륨을 저장하기
예제의 일시정지 메뉴(PauseMenuForm)에는 볼륨 슬라이더가 있지만, 값이 저장되지 않아 게임을 다시 켜면 초기화됩니다. Setting 으로 고쳐 봅니다.
// PauseMenuForm.cs private const string MusicVolumeKey = "Volume.Music"; // 폼이 열릴 때: 저장된 값이 있으면 믹서에 먼저 넣는다 protected override void OnOpen(object userData) { base.OnOpen(userData); SetPanelActive(false); GamePause.SetPaused(false); RestoreVolumeFromSetting(); // ← 추가 PullVolumeFromMixer(); // 기존: 믹서 값을 슬라이더에 반영 } private void RestoreVolumeFromSetting() { if (masterMixer == null) return; SettingComponent setting = GameEntry.GetComponent<SettingComponent>(); if (!setting.HasSetting(MusicVolumeKey)) return; // 처음 실행: 믹서 기본값을 그대로 둔다 masterMixer.SetFloat(MusicVolumeParam, setting.GetFloat(MusicVolumeKey)); } // 슬라이더가 움직일 때: 믹서에 적용하고 기록한다 public void SetMusicLevel(float level) { if (masterMixer == null) return; masterMixer.SetFloat(MusicVolumeParam, level); GameEntry.GetComponent<SettingComponent>().SetFloat(MusicVolumeKey, level); // ← 추가 } // 폼이 닫힐 때: 디스크에 쓴다 protected override void OnClose(bool isShutdown, object userData) { GamePause.Clear(); GameEntry.GetComponent<SettingComponent>().Save(); // ← 추가 base.OnClose(isShutdown, userData); }
C#
복사
SetFloat 는 메모리에만 기록합니다. Save() 를 불러야 파일에 쓰입니다. 슬라이더를 끄는 동안 매 프레임 저장하지 않도록, 저장은 닫을 때 한 번만 합니다. 프레임워크가 정상 종료될 때도 Save() 가 한 번 자동으로 불리지만, 모바일에서 앱이 강제 종료되면 그 경로를 타지 않습니다. 중요한 변경 직후에는 직접 저장하는 습관을 들이세요.
저장 위치 바꾸기
GameFramework.prefab 의 Setting 오브젝트에서 Setting Helper Type Name 을 바꿉니다.
헬퍼
저장 위치
고를 때
UnityGameFramework.Runtime.DefaultSettingHelper (기본)
persistentDataPath/GameFrameworkSetting.dat
파일 하나로 관리, 백업·삭제가 쉽다
UnityGameFramework.Runtime.PlayerPrefsSettingHelper
Unity PlayerPrefs
WebGL 처럼 파일 접근이 불편한 플랫폼
클라우드 저장이 필요하면 SettingHelperBase 를 상속한 헬퍼를 직접 만들어 끼우면 되고, 게임 코드의 GetFloat / SetFloat 호출은 그대로 둡니다.
⚠️
자주 걸리는 곳
•
저장된 설정은 SettingComponent 의 Start 에서 로드됩니다. 다른 MonoBehaviour 의 Awake / Start 에서 읽으면 아직 비어 있을 수 있습니다. Procedure 의 OnEnter 나 UI 폼의 OnOpen 처럼 프레임워크가 돈 뒤의 시점에서 읽으세요.
•
Config 의 ReadData 는 비동기입니다. LoadConfigSuccessEventArgs 를 받은 뒤에 GetInt 등을 부릅니다.
•
이 에디션에는 GameEntry.Config / GameEntry.Setting 같은 정적 프로퍼티가 없습니다. GameEntry.GetComponent<T>() 로 얻습니다. 본문 예제도 그렇게 고쳐 두었습니다.
•
ToyboxNightmare 는 현재 Config 와 Setting 을 쓰지 않습니다. 위 볼륨 저장은 10. 확장 과제 — 여기서부터는 직접 로 직접 구현해 보는 부분입니다.

설정 시스템 (Configuration System)

관련 소스 파일

•
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의 설정 시스템은 게임 전역 설정과 플레이어의 지속적 설정을 관리하기 위한 메커니즘을 제공합니다.
이 시스템은 두 가지 주요 컴포넌트로 구성됩니다:
1.
Config 컴포넌트 – 게임 전역 읽기 전용 설정 관리
2.
Setting 컴포넌트 – 플레이어별 읽기/쓰기 가능한 지속적 설정 관리

두 가지 목적

1.
글로벌 설정 (Config)
•
외부 설정 파일에서 읽어온 전역 설정 값 제공
•
런타임에서는 읽기 전용
•
게임 상수, 기본값, 정적 데이터 관리에 사용
1.
지속적 설정 (Setting)
•
게임 플레이 중 변경 가능한 설정을 관리
•
세션 간 저장/유지 (예: 오디오 볼륨, 그래픽 옵션, 플레이어 이름 등)
구조화된 게임 데이터를 관리하려면 Data Tables 시스템을 참고하세요.

Config Component

•
게임 전역 설정 데이터를 제공
•
보통 외부 파일에서 불러오며 런타임에서는 읽기 전용

설정 파일 포맷 (기본)

•
DefaultConfigHelper는 탭으로 구분된 텍스트 형식을 사용
# 주석 ID Name Type Value
Plain Text
복사
•
실제 게임에서 사용하는 값은 Name과 Value 컬럼에서 가져옴
•
열은 반드시 4개여야 하며(탭 구분), ID 와 Type 열은 읽지 않는다. 값의 타입은 파일이 아니라 꺼내는 메서드(GetBool, GetInt …)가 정한다

로딩 예시

ConfigComponent config = GameEntry.GetComponent<ConfigComponent>(); // 설정 파일 로드 (비동기. "GameConfig" = Addressables 주소) config.ReadData("GameConfig"); // ↓ LoadConfigSuccess 이벤트를 받은 뒤에 // 값 가져오기 (기본값 제공 가능) bool soundEnabled = config.GetBool("SoundEnabled", true); int maxPlayers = config.GetInt("MaxPlayers", 4); float gravity = config.GetFloat("Gravity", 9.8f); string welcomeMessage = config.GetString("WelcomeMessage", "Hello World!");
C#
복사

Setting Component

•
지속적 게임 설정을 관리
•
플레이어의 기기나 환경에 맞게 저장됨
•
게임 세션 간 유지됨

저장 방식

1.
DefaultSettingHelper
•
GameFrameworkSetting.dat (바이너리 파일)
•
앱의 persistentDataPath에 저장
2.
PlayerPrefsSettingHelper
•
Unity의 PlayerPrefs 사용
•
플랫폼 의존적이지만 Unity 개발자에게 익숙함

사용 예시

SettingComponent setting = GameEntry.GetComponent<SettingComponent>(); // 값 읽기 (없으면 기본값 사용) bool musicEnabled = setting.GetBool("MusicEnabled", true); int volumeLevel = setting.GetInt("VolumeLevel", 7); float brightness = setting.GetFloat("Brightness", 0.8f); string playerName = setting.GetString("PlayerName", "Player"); // 값 저장 setting.SetBool("MusicEnabled", false); setting.SetInt("VolumeLevel", 5); setting.SetFloat("Brightness", 0.7f); setting.SetString("PlayerName", "NewPlayer"); // 커스텀 객체 저장/로드 PlayerData playerData = new PlayerData(); setting.SetObject("PlayerData", playerData); PlayerData savedData = setting.GetObject<PlayerData>("PlayerData"); // 디스크에 저장 setting.Save();
C#
복사

헬퍼 패턴 & 커스터마이징

Config, Setting 모두 Helper 패턴을 사용해 로직을 커스터마이징할 수 있음.

커스텀 Config Helper 작성

•
ConfigHelperBase 상속
•
데이터 읽기/파싱 로직 구현
•
ConfigComponent에 할당

커스텀 Setting Helper 작성

•
SettingHelperBase 상속
•
데이터 로드/저장/관리 로직 구현
•
SettingComponent에 할당

Config vs Setting 비교

특징
Config System
Setting System
목적
전역, 읽기 전용 설정
사용자 환경 설정
저장소
외부 설정 파일
바이너리 파일 / PlayerPrefs
접근
읽기 전용
읽기/쓰기 가능
대표 사용 예
게임 상수, 기본값
볼륨, 그래픽 옵션, 플레이어 이름
로딩
리소스에서 불러옴
퍼시스턴트 스토리지에서 불러옴
저장
없음 (읽기 전용)
언제든 저장 가능
데이터 타입
Bool, Int, Float, String
Bool, Int, Float, String, 객체(JSON 직렬화)

다른 시스템과의 통합

•
리소스 시스템 – Config 파일 로드
•
이벤트 시스템 – 설정 로드/실패 이벤트 발생
•
직렬화 – Setting은 바이너리 또는 JSON 직렬화 사용

베스트 프랙티스

•
Config vs Setting 역할 구분
◦
전역 상수/기본값 → Config
◦
사용자 설정 → Setting
•
초기화 순서
◦
다른 시스템보다 먼저 Config 로드
•
기본값 제공
◦
값이 없을 경우 대비하여 항상 기본값 인자 제공
•
저장 시점
◦
중요한 변경 이후 Save() 호출 (레벨 완료, 앱 일시정지 등)
•
커스텀 객체 저장 시
◦
반드시 직렬화 가능해야 하며 에러 처리 필요
👉 요약하자면,
•
Config = 읽기 전용, 전역 설정 (상수, 게임 기본값)
•
Setting = 플레이어 환경설정 (볼륨, 옵션), 저장 가능