2015年8月1日土曜日

unity推奨されるデータの保存サンプル

iOSとAndroidでも使用できるunityのデータ保存のサンプルソースです。
保存データ用のクラスをシリアライズして保存しています。
確かunityの推奨している保存方法の一つだったと思います。
iOSnoバージョンが古いとエラーが発生するので旧式の端末ではテストできないかも?

//使用例
    private SaveDatas sd ;
    private string SAVE ="key文字列";
    private void DataSave2(){
        SaveKanri.Save(SAVE, sd);
        PlayerPrefs.Save();

    }
    private SaveDatas DataLoad2(){
        SaveDatas data_str = SaveKanri.Load<SaveDatas>(SAVE);
        if( data_str != null){
            return data_str;
        }else{
            return new SaveDatas();
        }


//管理クラス
using UnityEngine;
using System.Collections;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

public class SaveKanri : MonoBehaviour{
    
    public SaveKanri(){
    }
    
    public static bool Save<T>(string prefKey,T obj){
        MemoryStream memoryStream = new MemoryStream();
        #if UNITY_IPHONE || UNITY_IOS
        System.Environment.SetEnvironmentVariable("MONO_REFLECTION_SERIALIZER", "yes");
        #endif
        BinaryFormatter bf = new BinaryFormatter();
        bf.Serialize( memoryStream, obj );
        
        string str = System.Convert.ToBase64String( memoryStream.ToArray() );
        try {
            PlayerPrefs.SetString ( prefKey, str );
        } catch( PlayerPrefsException ) {
            return false;
        }
        return true;
    }
    
    public static T Load<T>( string prefKey ){
        if (!PlayerPrefs.HasKey(prefKey)) return default(T);
        #if UNITY_IPHONE || UNITY_IOS
        System.Environment.SetEnvironmentVariable("MONO_REFLECTION_SERIALIZER", "yes");
        #endif
        BinaryFormatter bf = new BinaryFormatter();
        string serializedData = PlayerPrefs.GetString( prefKey );
        
        MemoryStream dataStream = new MemoryStream( System.Convert.FromBase64String(serializedData) );
        T deserializedObject = (T)bf.Deserialize( dataStream );
        
        return deserializedObject;
    }

}

//保存するデータクラス
using System.Collections;
[System.Serializable()]
public class SaveDatas{
    [System.Serializable()]
    public class InnerClass{
        public string instr1;
        public int inint;
    }

    public string str1;
    public int[] int10;
    public InnerClass inClass;
    
}


以前までusing PlayerPrefs = PreviewLabs.PlayerPrefs;を使用して保存していました。最近どうもPreviewLabs.PlayerPrefsで以下のエラーが発生して他の保存方法に切り替えました。
以下がエラーログ
PlayerPrefs.Flush NullReferenceException Object reference not set to an instance of an object

0 件のコメント:

コメントを投稿