들어가며
게임 개발에 있어서 데이터의 저장과 불러오기는 매우 중요한 부분입니다. 이번 포스팅에서는 유니티에서 입출력을 사용하여 게임 데이터를 저장하고 불러오는 방법에 대해 알아보겠습니다.
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 스크립트에서 파일 입출력 전후에 데이터를 암호화 및 복호화하면 됩니다.
마치며
이번 포스팅에서는 유니티에서 입출력을 사용하여 게임 데이터를 저장하고 불러오는 방법에 대해 알아보았습니다. 앞으로 게임 데이터 저장 및 불러오기를 구현할 때 이를 참고하여 작업하시면 좋을 것 같습니다.
'Unity3d' 카테고리의 다른 글
유니티에서 2D 게임 개발 기초 (0) | 2023.04.12 |
---|---|
유니티에서 UI 개발하기 - 기본 개념 및 컴포넌트 소개 (0) | 2023.04.11 |
유니티에서 리지드바디와 콜라이더를 사용한 물리 기반 상호작용 (0) | 2023.04.09 |
유니티에서 오브젝트 이동 및 회전하기 - C# 스크립트를 활용한 게임 오브젝트 제어 (0) | 2023.04.08 |
유니티에서 C# 스크립트 작성하기: 기초부터 시작하기 (0) | 2023.04.07 |