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 );
}
}