카테고리 없음

Unity 본캠프 41일차

julesnow 2025. 6. 5. 15:59

라이브 세션 : 직렬화

 

목차

1.직렬화란 무엇인가?

2.Unity에서 직렬화가 필요한 이유

3.Unity에서 직렬화 가능한 구조와 제한

4.Unity 직렬화 방식 비교 : Unity 내장 vs C# JSON 직렬화

5.유저 데이터를 저장하는 방법과 시점

6.실무에서 직렬화가 쓰이는 사례와 구조화 예시

7.실습 코드 예시 : 유저 데이터를 저장하고 불러오기


Unity의 직렬화 언어, YAML

 

코딩을 잘하고 싶나요? 

  • 머릿 속에 공간을 확보하세요 (공간 지각 능력) 
  • 펜과 노트를 들고 다니세요~

 


1. 직렬화란 무엇인가?

객체를 하나의 파일로 만들어서 저장하거나 다른 시스템에 전송해야 할 때 사용

 

비유 : 택배 상자 포장

  • 객체 : 여러 정보를 담고 있는 가방
  • 직렬화 :
  • 역직렬화 :

 

직렬화를 사용하는 이유

  • 데이터 저장
  • 데이터 전송
  • 에디터 저장

 

예시 : C# -> JSON

[System.Serializable]

 

 

Unity에서의 직렬화

  • 인스펙터에서 보이는 값
  •  
  •  



Unity 직렬화가 필요한 이유

  1. Inspector에 노출되는 필드 값 저장 : public field || [Serializable]가 붙은 private field
  2. d
  3. ScriptableObject : 고정된 데이터만 사용 || 이벤트 버스 설정할 떼
  4. 유저 데이터 저장 -> 런타임 중의 유저 상태 보존
  5. 서버와의 데이터 송수신

 

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. 저장 시점

  1. 앱 종료 직전
  2. 특정 행동 완료 시
  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 으로 사용)

 -> 예외 처리 시 코드가 간단해진다~