FrameWork

[Unity] 프레임워크 개발 - 6. 데이터(파일) 쓰기/읽기

EveryDay.DevUp 2020. 5. 5. 15:30

게임 중에 일시적으로 저장되고 사용되는 정보들도 있지만, 유저의 환경 설정 데이터와 같이 앱이 설치되어 있는 한 유지되어야 하는 데이터도 존재 이런 데이터는 파일로 만들어 단말기 또는 PC에 저장

▶ Unity에서 제공하는 PlayerPrefs 를 이용한 데이터 읽기/쓰기

참고 자료 : https://docs.unity3d.com/ScriptReference/PlayerPrefs.html

: string, int, float 타입의 데이터를 저장할 수 있음

: 단일한 값으로 사용되기 보다는 게임에서 사용하고 있는 데이터 포맷 Json, xml과 같은 것들을 string으로 변환해서 저장하는 형태로 잘 사용 됨

: PlayerPrefs가 보안에 취약하기 때문에 래핑해서 사용 

( Window PC를 기준으로 HKEY_CURRENT_USER/Software/Unity/UnityEditor/{$CompanyName}/{$ProjectName} 에서  PlayerPrefs의 내용 확인 가능 )

: Key는 App의 이름을 합쳐 Base64로 인코딩

: Value는 암호화를 사용할 경우 AES를 사용 

using UnityEngine;
using System.IO;
using System.Text;

public class FileUtil
{
	static string GetPlayerPrefKey(string key)
	{
		key = string.Format( "{0}_{1}", Application.productName, key );
		return Crypto.EncodingBase64( key );
	}

	public static bool HasPlayerPrefsKey(string key)
	{
		string playerPrefsKey = GetPlayerPrefKey( key );
		return PlayerPrefs.HasKey( playerPrefsKey );
	}

	public static void DeletePlayerPrefs(string key)
	{
		string playerPrefsKey = GetPlayerPrefKey( key );
		PlayerPrefs.DeleteKey( playerPrefsKey );
		PlayerPrefs.Save();
	}

	public static void SavePlayerPrefs(string key, string data)
	{
		string playerPrefsKey = GetPlayerPrefKey( key );

		PlayerPrefs.SetString( playerPrefsKey, data );
		PlayerPrefs.Save();
	}

	public static void SavePlayerPrefs(string key, int data)
	{
		string playerPrefsKey = GetPlayerPrefKey( key );

		PlayerPrefs.SetInt( playerPrefsKey, data );
		PlayerPrefs.Save();
	}

	public static void SavePlayerPrefs(string key, float data)
	{
		string playerPrefsKey = GetPlayerPrefKey( key );

		PlayerPrefs.SetFloat( playerPrefsKey, data );
		PlayerPrefs.Save();
	}

	public static void SavePlayerPrefs(string key, string data, string base64AesKey, string base64AesIV)
	{
		data = Crypto.EncryptAESbyBase64Key( data, base64AesKey, base64AesIV );
		SavePlayerPrefs( key, data );
	}

	public static string GetPlayerPrefs(string key, string defaultData)
	{
		string playerPrefsKey = GetPlayerPrefKey( key );
		return PlayerPrefs.GetString( playerPrefsKey, defaultData );
	}

	public static int GetPlayerPrefs(string key, int defaultData)
	{
		string playerPrefsKey = GetPlayerPrefKey( key );
		return PlayerPrefs.GetInt( playerPrefsKey, defaultData );
	}

	public static float GetPlayerPrefs(string key, float defaultData)
	{
		string playerPrefsKey = GetPlayerPrefKey( key );
		return PlayerPrefs.GetFloat( playerPrefsKey, defaultData );
	}

	public static string GetPlayerPrefs(string key, string defaultData, string base64AesKey, string base64AesIV)
	{
		string data = GetPlayerPrefs( key, defaultData );
		if( string.IsNullOrEmpty( data ) == false )
		{
			return Crypto.EncryptAESbyBase64Key( data, base64AesKey, base64AesIV );
		}

		return defaultData;
	}
}

▶ C#에서 제공하는 API를 이용한 데이터 읽기/쓰기

: AES를 사용하여 파일 데이터의 암복호화

using UnityEngine;
using System.IO;
using System.Text;

public class FileUtil
{
	public static void WriteFile(string folderPath, string fileName, string extention, string data, string base64AesKey, string base64AesIV)
	{
		data = Crypto.EncryptAESbyBase64Key( data, base64AesKey, base64AesIV );
		WriteFile( folderPath, fileName, extention, data );
	}

	public static string ReadFile(string folderPath, string fileName, string extention, string base64AesKey, string base64AesIV)
	{
		string data = ReadFile( folderPath, fileName, extention );
		return Crypto.DecryptAESByBase64Key( data, base64AesKey, base64AesIV );
	}

	public static void WriteFile(string folderPath, string fileName, string extention, string data)
	{
		File.WriteAllText( Path.Combine( folderPath, string.Format( fileName, extention ) ), data, Encoding.UTF8 );
	}

	public static string ReadFile(string folderPath, string fileName, string extention)
	{
		return File.ReadAllText( Path.Combine( folderPath, string.Format( fileName, extention )), Encoding.UTF8 );
	}
}