[Unity] 직렬화(Serialization)

Gee·2025년 3월 11일

직렬화?

  • 개체(Object)를 저장하거나, 메모리(Memory), 데이터베이스(Database) 또는 파일(File)로 전송하기 위해 개체를 바이트 스트림으로 변환하는 프로세스.
  • 쉽게 말해 객체를 텍스트 형식으로 변환해 저장해 전송할 수 있도록 만드는 과정이다.
  • XML, JSON 등을 통해 직렬화 할 수 있다.
  • 반대로 역직렬화(deserialization)는 직렬화된 데이터를 다시 원래 객체로 변환하는 것. 저장한 데이터(텍스트)를 다시 불러오기 위해 사용한다.

사용하는 이유

  1. 데이터 저장 : 게임 데이터를 파일로 저장하고 불러옴
  2. 네트워크 전송 : 서버와 클라이언트 간 객체 데이터를 주고받음
  3. 객체 복제 : 객체를 메모리 내에서 복사
  4. 설정 저장 : JSON, XML 형식으로 설정 파일을 저장하고 로드

PlayerPrefs

  • PlayerPrefs는 직렬화 방식이 아닌 간단한 데이터(Key Value) 저장 방식이지만, 이해를 돕기 위해 함께 설명.
  • 문자열, 정수, 실수만 저장이 가능하고 데이터는 운영체제의 레지스트리나 특정 파일에 저장된다.
using UnityEngine;

public class PlayerPrefsExample : MonoBehaviour
{
    void Start()
    {
        // 점수 저장
        PlayerPrefs.SetInt("HighScore", 100);
        
        // 데이터 저장
        PlayerPrefs.Save();

        // 점수 불러오기
        int highScore = PlayerPrefs.GetInt("HighScore", 0);
        
        Debug.Log("최고 점수: " + highScore);
    }
}
  • 게임 내 최고 점수를 저장하고 불러오는 등의 간단한 데이터를 저장할 수 있다. (설정값, 점수 등)
  • 하지만 객체는 저장이 불가능. JSON처럼 복잡한 데이터 구조는 저장이 불가능하다.

JSON 직렬화

using UnityEngine;

[System.Serializable] // Unity에서 JSON 직렬화를 위해 반드시 필요
public class PlayerData
{
    public string name;
    public int level;
    public float health;
}

public class Test : MonoBehaviour
{
    void Start()
    {
        PlayerData player = new PlayerData { name = "Gee", level = 5, health = 75.5f };

        // JSON 직렬화
        string json = JsonUtility.ToJson(player);
        
        Debug.Log("저장된 JSON: " + json);

        // JSON 역직렬화
        PlayerData loadedPlayer = JsonUtility.FromJson<PlayerData>(json);
        
        Debug.Log($"이름: {loadedPlayer.name}, 레벨: {loadedPlayer.level}, 체력: {loadedPlayer.health}");
    }
}
  • JSON 직렬화는 객체를 문자열(JSON 포맷)로 변환하여 파일로 저장하는 방식.
  • 유니티에서는 해당 JsonUtility 방식을 가장 많이 사용함. 가볍고 빠르며 네트워크 전송이나 파일 저장에 적합하다.
  • 플레이어의 상태나 인벤토리 등 복잡한 객체의 구조를 저장할 수 있고, 파일로 저장하여 관리하기 때문에 PlayerPrefs보다 데이터 양이 많아도 안정적이다.

세이브 파일을 JSON으로 저장하기

using System.IO;
using UnityEngine;

public class SaveManager : MonoBehaviour
{
    [System.Serializable]
    public class PlayerData
    {
        public string playerName;
        public int level;
        public float health;
    }

    private string savePath;

    void Start()
    {
        savePath = Path.Combine(Application.persistentDataPath, "savefile.json");
        Debug.Log("저장 경로: " + savePath);
    }

    public void SaveGame()
    {
        PlayerData data = new PlayerData { playerName = "Hero", level = 10, health = 100.0f };
        string json = JsonUtility.ToJson(data);
        File.WriteAllText(savePath, json);
        Debug.Log("게임 저장 완료");
    }

    public void LoadGame()
    {
        if (File.Exists(savePath))
        {
            string json = File.ReadAllText(savePath);
            PlayerData data = JsonUtility.FromJson<PlayerData>(json);
            Debug.Log($"불러온 데이터 - 이름: {data.playerName}, 레벨: {data.level}, 체력: {data.health}");
        }
        else
        {
            Debug.Log("저장된 데이터가 없습니다.");
        }
    }
}
  • 이처럼 객체를 JSON으로 변환해 파일로 저장이 가능함
  • 플레이어 정보나 아이템 등의 게임 세이브 데이터 관리에 적합하다.

PlayerPrefs vs JSON

비교 항목PlayerPrefsJSON 직렬화
저장 방식운영체제의 레지스트리 / 내부 저장소파일(JSON)로 저장
저장 데이터 유형int, float, string (단순한 값)객체(클래스, 리스트, 배열 등)
사용 용도설정 값, 최고 점수 저장 게임 저장데이터, 인벤토리 등
파일 위치OS별 특정 저장 위치Application.persistentDataPath에 파일 생성
데이터 크기작음 (몇 개의 변수)큼 (복잡한 데이터 가능)
장점매우 간단, 코드 짧음복잡한 데이터 구조 저장 가능
단점객체 저장 불가, 보안 취약파일 입출력 필요
  • PlayerPrefs는 최고 점수, 게임 설정 값, 컨트롤 설정 등 작은 데이터 저장에 적합
  • JSON 직렬화는 플레이어의 상태, 인벤토리, 퀘스트 진행도 등 보다 복잡하고 많은 양의 데이터 저장에 적합
  • 간단한 값 저장 = PlayerPrefs
  • 객체 저장 & 데이터 파일 생성 = JSON 직렬화
profile
...

0개의 댓글