본문 바로가기

Unity3d

유니티에서 입출력을 사용하여 게임 데이터 저장 및 불러오기

들어가며

게임 개발에 있어서 데이터의 저장과 불러오기는 매우 중요한 부분입니다. 이번 포스팅에서는 유니티에서 입출력을 사용하여 게임 데이터를 저장하고 불러오는 방법에 대해 알아보겠습니다.

PlayerPrefs를 이용한 간단한 데이터 저장 및 불러오기

유니티에서는 PlayerPrefs를 사용하여 간단한 데이터를 저장하고 불러올 수 있습니다. PlayerPrefs는 키-값 쌍으로 데이터를 저장하며, int, float, string 데이터 타입을 지원합니다.

 

// 데이터 저장
PlayerPrefs.SetInt("HighScore", 100);
PlayerPrefs.SetFloat("Volume", 0.5f);
PlayerPrefs.SetString("PlayerName", "John Doe");

// 데이터 불러오기
int highScore = PlayerPrefs.GetInt("HighScore", 0);
float volume = PlayerPrefs.GetFloat("Volume", 1.0f);
string playerName = PlayerPrefs.GetString("PlayerName", "Unknown");

// 데이터 삭제
PlayerPrefs.DeleteKey("HighScore");

// 모든 데이터 삭제
PlayerPrefs.DeleteAll();

 

하지만 PlayerPrefs는 복잡한 데이터 구조를 저장하기에는 한계가 있으며, 보안 측면에서도 취약하므로 제한적인 용도로 사용하는 것이 좋습니다.

파일 입출력을 이용한 데이터 저장 및 불러오기

더 복잡한 데이터 구조를 저장하고 불러오기 위해서는 파일 입출력을 사용할 수 있습니다. C#에서는 System.IO 네임스페이스를 사용하여 파일을 생성, 수정, 삭제할 수 있습니다. 다음은 JSON 형식으로 데이터를 저장하고 불러오는 예제입니다.

 

using System.IO;
using UnityEngine;
using Newtonsoft.Json;

[System.Serializable]
public class GameData
{
    public string playerName;
    public int highScore;
    public float volume;
}

public class SaveLoadManager : MonoBehaviour
{
    private string filePath;

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

    public void SaveData(GameData gameData)
    {
        string jsonData = JsonConvert.SerializeObject(gameData, Formatting.Indented);
        File.WriteAllText(filePath, jsonData);
    }

    public GameData LoadData()
    {
        if (File.Exists(filePath))
        {
            string jsonData = File.ReadAllText(filePath);
            GameData gameData = JsonConvert.DeserializeObject<GameData>(jsonData);
            return gameData;
        }
        else
        {
            Debug.LogError("파일이 존재하지 않습니다.");
            return null;
        }
    }
}

 

이 스크립트를 게임 오브젝트에 추가하면, GameData 클래스의 인스턴스를 JSON 형식으로 저장하여 파일에 저장할 수 있고, 해당 파일을 불러와 다시 GameData 객체로 변환하여 사용할 수 있습니다.

데이터 암호화를 통한 보안 강화

게임 데이터를 저장할 때, 사용자가 쉽게 접근하여 수정하지 못하도록 데이터를 암호화하는 것이 좋습니다. C#에서는 System.Security.Cryptography 네임스페이스를 사용하여 데이터를 암호화하고 복호화할 수 있습니다. 다음은 AES 암호화 방식을 사용하여 데이터를 암호화하고 복호화하는 예제입니다.

 

using System.IO;
using System.Security.Cryptography;
using UnityEngine;

public class EncryptionManager : MonoBehaviour
{
    private static readonly byte[] key = new byte[32] { /* 32 바이트 키 값 입력 */ };
    private static readonly byte[] iv = new byte[16] { /* 16 바이트 IV 값 입력 */ };

    public static string Encrypt(string plainText)
    {
        byte[] encrypted;

        using (Aes aes = Aes.Create())
        {
            aes.Key = key;
            aes.IV = iv;

            ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV);

            using (MemoryStream msEncrypt = new MemoryStream())
            {
                using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                {
                    using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                    {
                        swEncrypt.Write(plainText);
                    }

                    encrypted = msEncrypt.ToArray();
                }
            }
        }

        return System.Convert.ToBase64String(encrypted);
    }

    public static string Decrypt(string cipherText)
    {
        byte[] cipherBytes = System.Convert.FromBase64String(cipherText);

        string decryptedText = null;

        using (Aes aes = Aes.Create())
        {
            aes.Key = key;
            aes.IV = iv;

            ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV);

            using (MemoryStream msDecrypt = new MemoryStream(cipherBytes))
            {
                using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                {
                    using (StreamReader srDecrypt = new StreamReader(csDecrypt))
                    {
                        decryptedText = srDecrypt.ReadToEnd();
                    }
                }
            }
        }

        return decryptedText;
    }
}

 

이제 SaveLoadManager 스크립트에서 파일 입출력 전후에 데이터를 암호화 및 복호화하면 됩니다.

마치며

이번 포스팅에서는 유니티에서 입출력을 사용하여 게임 데이터를 저장하고 불러오는 방법에 대해 알아보았습니다. 앞으로 게임 데이터 저장 및 불러오기를 구현할 때 이를 참고하여 작업하시면 좋을 것 같습니다.