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>() 로 얻습니다. 본문 예제도 그렇게 고쳐 두었습니다.
•
설정 시스템 (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 = 플레이어 환경설정 (볼륨, 옵션), 저장 가능










