본 문서는 유니티에서 데이터를 저장하고 관리하는 방법에 대한 튜토리얼입니다. 4가지 로컬 저장 옵션을 다루며, 각각의 저장 방식에 대한 간단한 설명과 사용법을 제공합니다.

PlayerPrefs 사용법

PlayerPrefs는 유니티에서 기본적으로 제공하는 간단한 데이터 저장 방법으로, 키-값 쌍을 사용하여 데이터를 저장합니다. 주로 게임 설정, 세이브 파일, 플레이어의 기록 등을 저장할 때 사용됩니다.

장점과 단점

장점: 사용이 쉽고, 빠르게 데이터를 저장하고 읽을 수 있습니다.
단점: 데이터 타입이 제한적이고, 복잡한 데이터 구조를 저장하기 어렵습니다.

이 방식은 간단한 데이터를 저장하고 읽어야 할 때, 예를 들어 게임 설정이나 최고 점수를 저장할 때 사용하면 좋습니다.

예제 코드

다음은 PlayerPrefs 를 사용하는 방법에 대한 예제 코드입니다.

// 값을 저장하기
PlayerPrefs.SetInt("HighScore", 100);
PlayerPrefs.SetString("PlayerName", "John");
PlayerPrefs.SetFloat("MusicVolume", 0.5f);

// 값을 불러오기
int highScore = PlayerPrefs.GetInt("HighScore");
string playerName = PlayerPrefs.GetString("PlayerName");
float musicVolume = PlayerPrefs.GetFloat("MusicVolume");

JSON 파일 저장

JSON (JavaScript Object Notation)은 데이터를 교환하는 데 사용되는 경량 텍스트 형식입니다. 유니티에서는 JSONUtility를 사용하여 객체를 JSON 문자열로 변환하거나 JSON 문자열을 객체로 변환할 수 있습니다.

장점과 단점

장점: 데이터 구조를 유지하면서 저장할 수 있으며, 읽기 쉽고 편집 가능합니다.
단점: 텍스트 형식이므로 큰 데이터를 저장하는 데 비효율적일 수 있습니다.

이 방식은 복잡한 데이터 구조를 저장하고 읽어야 할 때, 예를 들어 게임 세이브 파일이나 설정 파일을 저장할 때 사용하면 좋습니다.

예제 코드

다음은 JSON 방식을 사용해서 데이터를 저장하고 불러오는 방법입니다.

using UnityEngine;
using System.IO;

[System.Serializable]
public class PlayerData
{
    public string playerName;
    public int level;
    public float experience;
}

public class JSONExample : MonoBehaviour
{
    private string filePath;

    private void Start()
    {
        filePath = Path.Combine(Application.dataPath, "playerData.json");
    }

    private void SaveData(PlayerData data)
    {
        string jsonString = JsonUtility.ToJson(data);
        File.WriteAllText(filePath, jsonString);
    }

    private PlayerData LoadData()
    {
        if (File.Exists(filePath))
        {
            string jsonString = File.ReadAllText(filePath);
            return JsonUtility.FromJson<PlayerData>(jsonString);
        }
        return null;
    }
}

위 예제에서는 PlayerData 클래스를 생성하여 플레이어 데이터를 저장합니다. SaveData 함수를 사용하여 데이터를 JSON 형식으로 변환하고 파일에 저장합니다. 그리고 나서 LoadData 함수를 사용하여 JSON 파일을 읽고, 이를 다시 PlayerData 객체로 변환합니다.

XML 파일 저장

XML (eXtensible Markup Language)은 데이터를 계층적으로 구조화하고 저장할 수 있는 마크업 언어입니다. 유니티에서는 System.Xml.Serialization 네임스페이스를 사용하여 객체를 XML 형식으로 직렬화하거나 역직렬화할 수 있습니다.

장점과 단점

장점: 데이터 구조를 유지하면서 저장할 수 있으며, 사람이 읽고 편집하기 쉽습니다.
단점: 텍스트 형식이므로 큰 데이터를 저장하는 데 비효율적일 수 있으며, XML 구문이 JSON보다 더 복잡합니다.

이 방식은 JSON 과 마찬가지로 복잡한 데이터 구조를 저장하고 읽어야 할 때, 예를 들어 게임 세이브 파일이나 설정 파일을 저장할 때 사용하면 좋습니다.

예제 코드

다음은 XML 방식을 사용해서 데이터를 저장하고 불러오는 방법입니다.

using UnityEngine;
using System.IO;
using System.Xml.Serialization;

[System.Serializable]
public class PlayerData
{
    public string playerName;
    public int level;
    public float experience;
}

public class XMLExample : MonoBehaviour
{
    private string filePath;

    private void Start()
    {
        filePath = Path.Combine(Application.dataPath, "playerData.xml");
    }

    private void SaveData(PlayerData data)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(PlayerData));
        using (FileStream stream = new FileStream(filePath, FileMode.Create))
        {
            serializer.Serialize(stream, data);
        }
    }

    private PlayerData LoadData()
    {
        if (File.Exists(filePath))
        {
            XmlSerializer serializer = new XmlSerializer(typeof(PlayerData));
            using (FileStream stream = new FileStream(filePath, FileMode.Open))
            {
                return (PlayerData)serializer.Deserialize(stream);
            }
        }
        return null;
    }
}

위 예제에서는 PlayerData 클래스를 생성하여 플레이어 데이터를 저장합니다. SaveData 함수를 사용하여 데이터를 XML 형식으로 직렬화하고 파일에 저장합니다. 또한 LoadData 함수를 사용하여 XML 파일을 열고, 이를 다시 PlayerData 객체로 역직렬화합니다.

바이너리 파일 저장

바이너리 파일 저장은 데이터를 이진 형식으로 저장하는 방법입니다. 유니티에서는 System.Runtime.Serialization.Formatters.Binary 네임스페이스를 사용하여 객체를 바이너리 형식으로 직렬화하거나 역직렬화할 수 있습니다.

장점과 단점

장점: 데이터 크기가 작아져 저장 공간을 절약할 수 있으며, 로딩 속도가 빠르고, 데이터 보안이 상대적으로 높습니다.
단점: 사람이 읽거나 편집하기 어렵습니다.

이 방식은 데이터 크기가 크거나 보안이 중요한 경우, 예를 들어 게임 세이브 파일이나 암호화된 설정 파일을 저장할 때 사용하면 좋습니다.

예제 코드

다음은 바이너리 파일 방식을 사용해서 데이터를 저장하고 불러오는 방법입니다.

using UnityEngine;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

[System.Serializable]
public class PlayerData
{
    public string playerName;
    public int level;
    public float experience;
}

public class BinaryExample : MonoBehaviour
{
    private string filePath;

    private void Start()
    {
        filePath = Path.Combine(Application.dataPath, "playerData.bin");
    }

    private void SaveData(PlayerData data)
    {
        BinaryFormatter formatter = new BinaryFormatter();
        using (FileStream stream = new FileStream(filePath, FileMode.Create))
        {
            formatter.Serialize(stream, data);
        }
    }

    private PlayerData LoadData()
    {
        if (File.Exists(filePath))
        {
            BinaryFormatter formatter = new BinaryFormatter();
            using (FileStream stream = new FileStream(filePath, FileMode.Open))
            {
                return (PlayerData)formatter.Deserialize(stream);
            }
        }
        return null;
    }
}

위 예제에서는 PlayerData 클래스를 생성하여 플레이어 데이터를 저장합니다. SaveData 함수를 사용하여 데이터를 바이너리 형식으로 직렬화하고 파일에 저장합니다. LoadData 함수를 사용하여 바이너리 파일을 열고, 이를 다시 PlayerData 객체로 역직렬화합니다.