라이브 세션 : 직렬화
목차
1.직렬화란 무엇인가?
2.Unity에서 직렬화가 필요한 이유
3.Unity에서 직렬화 가능한 구조와 제한
4.Unity 직렬화 방식 비교 : Unity 내장 vs C# JSON 직렬화
5.유저 데이터를 저장하는 방법과 시점
6.실무에서 직렬화가 쓰이는 사례와 구조화 예시
7.실습 코드 예시 : 유저 데이터를 저장하고 불러오기
Unity의 직렬화 언어, YAML
코딩을 잘하고 싶나요?
- 머릿 속에 공간을 확보하세요 (공간 지각 능력)
- 펜과 노트를 들고 다니세요~
1. 직렬화란 무엇인가?
객체를 하나의 파일로 만들어서 저장하거나 다른 시스템에 전송해야 할 때 사용
비유 : 택배 상자 포장
- 객체 : 여러 정보를 담고 있는 가방
- 직렬화 :
- 역직렬화 :
직렬화를 사용하는 이유
- 데이터 저장
- 데이터 전송
- 에디터 저장
예시 : C# -> JSON
[System.Serializable]
Unity에서의 직렬화
- 인스펙터에서 보이는 값
Unity 직렬화가 필요한 이유
- Inspector에 노출되는 필드 값 저장 : public field || [Serializable]가 붙은 private field
- d
- ScriptableObject : 고정된 데이터만 사용 || 이벤트 버스 설정할 떼
- 유저 데이터 저장 -> 런타임 중의 유저 상태 보존
- 서버와의 데이터 송수신
3. Unity에서 직렬화 가능한 구조와 제한
3. 지원되는 타입만 가능
| 지원됨 | 지원 안됨 |
| Ditcionary, HashSet 등 컬렉션 | |
직렬화에서 주의할 점
1. Dictionary 사용 불가
- Unity는 Dictionary 직렬화 불가
- 변환용 클래스를 따로 만들어 key-value 쌍을 List 형태로 바꾸기
- 사실상 객체를 중간 중간 저장하면 고민할 필요가 없다.
2. Property는 직렬의 대상이 아님
3.
4. Static
4. Unity 직렬화 방식 비교 : Unity 내장 vs C# JSON 직렬화
장점
- 직관적
- 인스펙터 UI 제공
- ScriptableObject와 함께 설정 자산으로 활용 가능
단점
- 제한된 타입만 직렬화 가능 (Dictionary, Property 등 사용 불가)
- 저장 포맷 공개 X (Unity 전용)
- 런타임 저장에는 직접 사용 불가능
사용 예시
- 직접적인 참조
- ㅇ
- ㅇ
- 프리팹 내 변수값
2. JSON 직렬화 (런타임 데이터 저장)
장점
단점
사용 예시
- 유저 정보 저장
- ㅇ
- ㅇ
5. 유저 데이터를 저장하는 방법과 시점
1. 저장 방법 선택
| 저장 방식 | 특징 | 예시 |
| PlayerPrefebs | 간단한 key-value 지정 | 설정값, 튜토리얼 완료 여부 등 |
| JSON 파일 (Application.persistentDataPath) |
자유로운 구조 저장, 경량 | 인벤토리, 캐릭터 상태 |
| 바이너리 파일 | 압축 및 보안 유리 | 랭킹 데이터, 암호화 필요 시 |
| 서버 저장 | 네트워크 기반 | 클라우드 세이브, PvP 전적 |
Registry Trash file 찾아보기 -> 버리기
- 암호화도 필요없는 쓸데 없는 파일들
JSON 파일 : 경로 잘 잡기~ -> Unity 경로 확인하기!
JSON을 통한 유저 데이터 저장 예시
[System.Serializable]
3. 저장 시점
- 앱 종료 직전
- 특정 행동 완료 시
- 주기적 자동 저장
private float saveInterval = 60f;
private float timer;
void Update()
{
timer = Time.deltaTime;
}
4. 유저 데이터 저장 시 주의할 점
- 파일 유실 대비 :
- 데이터 충돌 방지 :
- 보안 : 민감 데이터는 암호화 필요 (예 : 유료 재화, 퀘스트 무한 깨기 등 금전적 손실 초래하는 경우)
- 버전 관리 : 저장 구조 변경 시 버전 필드 추가 필요
[System.Serializable]
public class UserData
{
public int version = 1;
// 다른 필드들...
}
5. 저장 실패 대응 예시
try
{
}
6. 실무에서 직렬화가 쓰이는 사례와 구조화 예시
1. 게임 밸런스 설정 (ScriptableObject)
2. 플레이 로그 기록 (JSON 직렬화)
- 플레이 시간, 행동 경로, 클리어 여부 등을 저장 -> 유저 행동 분석
3. 외부 데이터 연동
- 밸런스 데이터를 Excel이나 Google Sheet에서 관리하고
- 툴을 통해 JSON으로 변환 -> Unity에서 로딩
public class EnemyData
{
public int id;
public string name;
}
4. 게임 진행 상태 저장
- 스테이지 클리어 여부, 보상 획득 상태 등
- 유저 데이터에 포함시키거나 별도 ProgressData로 분리 -> (예시 : 클리어한 아이디로 저장 ..)
5. 에디터 툴 개발 시 사용
- 커스텀 에디터에서 직렬화 필드를 그대로 사용
- 에디터 툴로 입력 -> 직렬화된 데이터 저장 -> 런타임에서 로딩
6. 서버 연동 구조
- JSON 직렬화를 기반으로 서버 API 통신 구현
- ㅇ
- ㅇ
7. 실습 코드 예시 : 유저 코드 불러오고 저장하기
[System.Serializable]
public class UserData
{
public int gold; // 저장이 되는 구조와 안되는 구조 나누기 (기준은 알아서 정하면 됨)
public int level;
public List<string> items;
}
// 한 번에 나눌 필요 없이 나눠서 정리해도 무방하다.
[System.Serializable]
public class UserData
{
public int goldl
public int level;
public List<string> items;
[SerializeField] private int userId;
public UserData()
{
gold = ;
level = ;
items = ;
}
}
예시 2
SaveManager.cs (주로 static 으로 사용)
-> 예외 처리 시 코드가 간단해진다~