서비스
교육 철학

Settings (설정 시스템)

Abstract

📌
Setting 은 프레임워크의 유일한 "저장되는" 데이터 모듈입니다. 값을 넣고 Save() 하면 플레이어 기기에 남아 다음 실행 때 그대로 돌아옵니다. Unity 의 PlayerPrefs 와 같은 자리를 차지하지만, 어디에 어떻게 저장할지를 헬퍼로 갈아 끼울 수 있다는 점이 다릅니다. 볼륨 슬라이더에 적용하는 실습은 Unity 쪽 설정 시스템 (Configuration System) 페이지에 있습니다.
PlayerPrefs 를 직접 쓰는 것과 무엇이 다른가
PlayerPrefs 직접
Setting 모듈
저장 위치
플랫폼이 정한 곳 (Windows 는 레지스트리)
헬퍼가 정한다. 기본은 파일 하나
객체 저장
직접 JSON 으로 바꿔 문자열로
SetObject / GetObject<T>
저장소 교체 (클라우드 세이브 등)
호출부를 전부 고친다
헬퍼만 바꾼다. 호출부는 그대로
세이브 초기화·백업
키를 하나씩 지운다
파일 하나를 지우거나 복사한다
저장되는 모양 — 전부 문자열이다
기본 구현은 모든 값을 이름 → 문자열 표 하나에 넣고, 그것을 통째로 파일에 씁니다. SetInt("Score", 100) 은 내부적으로 "100" 을 저장합니다. 여기서 몇 가지 성질이 나옵니다.
•
같은 키를 SetInt 로 넣고 GetString 으로 꺼낼 수 있다 ("100")
•
타입 검사가 없다. SetString("Volume", "크게") 후 GetFloat("Volume") 은 예외다
•
SetObject 는 객체를 JSON 문자열로 바꿔 넣는다
객체 통째로 저장하기 — 간단한 세이브 데이터
[System.Serializable] public class BestRecord { public int Score; // public 필드만 저장된다 public string Character; public float SurvivedSeconds; } SettingComponent setting = GameEntry.GetComponent<SettingComponent>(); // 저장 BestRecord record = new BestRecord { Score = 1250, Character = "Girl", SurvivedSeconds = 184.5f }; setting.SetObject("Record.Best", record); setting.Save(); // 불러오기 (없으면 null) BestRecord loaded = setting.GetObject<BestRecord>("Record.Best", null);
C#
복사
JSON 변환은 기본적으로 Unity 의 JsonUtility 가 합니다. 따라서 [Serializable] + public 필드(또는 [SerializeField])만 저장되고, 프로퍼티·Dictionary 는 저장되지 않습니다. 더 복잡한 구조가 필요하면 BaseComponent 의 Json Helper 를 다른 라이브러리용으로 교체합니다.
언제 Save() 를 부르나
Set… 은 메모리만 바꿉니다. 파일에 쓰이는 시점은 둘뿐입니다 — Save() 를 직접 불렀을 때, 그리고 프레임워크가 정상 종료될 때(자동). 모바일에서는 앱이 백그라운드에서 그냥 죽는 일이 흔하므로 자동 저장에 기대면 안 됩니다. 판이 끝났을 때, 옵션 창을 닫을 때, 그리고 OnApplicationPause(true) 에서 저장하는 것이 안전합니다. 매 프레임 Save() 는 파일 전체를 다시 쓰는 것이라 피합니다.
⚠️
자주 걸리는 곳
•
이것은 보안 저장소가 아닙니다. 기본 파일은 누구나 열어 고칠 수 있습니다. 재화·구매 내역처럼 조작되면 안 되는 값은 서버에 두세요.
•
숫자는 기기 언어와 무관하게 저장됩니다. SetFloat("Volume", 0.5f) 는 어느 나라 기기에서든 "0.5" 로 저장되고 그대로 읽힙니다(InvariantCulture). 원작은 기기 언어를 따라 변환해서 저장 후 기기 언어를 바꾸면 값을 읽다가 실패할 수 있었고, 이 에디션에서 고쳤습니다.
•
없는 키를 기본값 없이 꺼내면 예외가 아니라 경고 로그와 함께 0 / false / null 이 나옵니다. 본문에 "예외 발생"으로 적혀 있던 주석을 고쳤습니다. 기본값을 받는 오버로드를 쓰는 편이 의도가 분명합니다.
•
저장된 값은 SettingComponent 의 Start 에서 로드됩니다. 다른 MonoBehaviour 의 Awake 에서 읽으면 아직 비어 있습니다.
•
게임 코드에서는 본문의 settingManager 대신 GameEntry.GetComponent<SettingComponent>() 를 쓰고, 헬퍼 지정과 Load() 는 컴포넌트가 대신 합니다.
•
디버거의 Console 필터 상태처럼 프레임워크 자신도 Setting 에 값을 저장합니다(Debugger. 로 시작하는 키). RemoveAllSettings() 는 그것까지 지웁니다.

Settings (설정 시스템)

관련 소스 파일

•
GameFramework/Base/GameFrameworkException.cs
•
GameFramework/Setting/ISettingHelper.cs
•
GameFramework/Setting/ISettingManager.cs
•
GameFramework/Setting/SettingManager.cs

소개

Settings 시스템은 게임 세션 간에 지속적으로 유지되어야 하는 사용자 환경 설정 및 게임 설정을 관리합니다.
Configuration 시스템이 보통 사전에 정의된 데이터에서 로드되는 정적 게임 설정을 관리하는 반면, Settings 시스템은 플레이 중에 수정 가능하며 세션 간 보존되어야 하는 사용자별 설정을 다룹니다.

시스템 아키텍처

Settings 시스템은 GameFramework의 다른 모듈과 일관된 매니저-헬퍼 아키텍처 패턴을 따릅니다.
•
SettingManager
◦
설정을 관리하는 API와 기능을 제공
•
ISettingHelper 인터페이스 구현체
◦
실제 저장 및 불러오기 작업 담당 (플랫폼별로 다를 수 있음)
즉, SettingManager는 GameFrameworkModule을 상속하고 ISettingManager 인터페이스를 구현하며, 실제 저장/로드 작업은 ISettingHelper 구현체에 위임합니다.

핵심 구성 요소

SettingManager

•
중앙 관리 클래스
•
ISettingManager를 구현하고 GameFrameworkModule을 상속
•
프레임워크의 모듈 시스템을 통해 접근 가능
주요 특징:
•
헬퍼 인터페이스를 통해 설정 관리
•
다양한 데이터 타입 읽기/쓰기 메서드 제공
•
설정 존재 여부 확인 지원
•
프레임워크 종료 시 자동 저장 수행

ISettingHelper

플랫폼별로 구현해야 하는 인터페이스.
책임:
•
영구 저장소에서 설정 로드
•
영구 저장소로 설정 저장
•
메모리 내 설정 컬렉션 관리
•
데이터 타입 변환
•
객체 직렬화/역직렬화

데이터 흐름과 동작

게임 로직은 SettingManager를 통해 설정에 접근합니다.
SettingManager는 ISettingHelper 구현체에 실제 저장/불러오기 작업을 위임합니다.

지원 데이터 타입

데이터 타입
Get 메서드
Set 메서드
Boolean
GetBool(name), GetBool(name, defaultValue)
SetBool(name, value)
Integer
GetInt(name), GetInt(name, defaultValue)
SetInt(name, value)
Float
GetFloat(name), GetFloat(name, defaultValue)
SetFloat(name, value)
String
GetString(name), GetString(name, defaultValue)
SetString(name, value)
Object
GetObject(name), GetObject(name, defaultObj) …
SetObject(name, obj), SetObject(name, obj)
※ 존재하지 않는 설정에 대비해 기본값을 지정할 수 있는 오버로드 메서드 제공.

주요 동작

초기화 및 설정

Settings 시스템을 사용하기 전 준비 단계:
1.
플랫폼에 맞는 ISettingHelper 구현체 생성
2.
SettingManager.SetSettingHelper()로 헬퍼 설정
3.
Load()를 호출하여 기존 설정 로드

읽기와 쓰기

// 읽기 bool enableMusic = settingManager.GetBool("EnableMusic", true); // 기본값 true int volume = settingManager.GetInt("Volume", 50); // 기본값 50 float sensitivity = settingManager.GetFloat("Sensitivity"); // 없으면 경고 로그 + 0 반환 (기본 헬퍼 기준. 예외는 아니다) string playerName = settingManager.GetString("PlayerName", ""); // 기본값 "" PlayerConfig config = settingManager.GetObject<PlayerConfig>("PlayerConfig"); // 쓰기 settingManager.SetBool("EnableMusic", false); settingManager.SetInt("Volume", 75); settingManager.SetFloat("Sensitivity", 0.85f); settingManager.SetString("PlayerName", "Player1"); settingManager.SetObject("PlayerConfig", playerConfig);
C#
복사

관리 기능

// 존재 여부 확인 bool hasVolume = settingManager.HasSetting("Volume"); // 특정 설정 삭제 settingManager.RemoveSetting("TemporarySetting"); // 모든 설정 삭제 settingManager.RemoveAllSettings(); // 모든 설정 이름 조회 string[] allSettings = settingManager.GetAllSettingNames();
C#
복사

설정 저장 및 로드

// 로드 bool loadSuccess = settingManager.Load(); // 저장 bool saveSuccess = settingManager.Save();
C#
복사
※ 프레임워크 종료 시 자동 저장됩니다.

구현 시 고려사항

ISettingHelper 구현 시 주의할 점:
•
저장 방식: Unity는 PlayerPrefs, 웹은 localStorage, Windows는 레지스트리/파일 등 플랫폼 적합한 방식 선택
•
데이터 직렬화: 복잡한 객체 저장 시 직렬화/역직렬화 필요
•
성능: 자주 쓰이는 설정은 빠르게 접근 가능하도록 최적화
•
에러 처리: 불러오기/저장 실패에 대비한 예외 처리
•
스레드 안정성: 멀티스레드 접근 가능 시 동기화 필요
👉 요약하자면, Settings 시스템은 사용자 맞춤형 데이터를 세션 간 보존하기 위한 모듈이며,
플랫폼에 맞는 ISettingHelper를 구현해 SettingManager와 연결하면 손쉽게 확장할 수 있는 구조입니다.