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와 연결하면 손쉽게 확장할 수 있는 구조입니다.






