2015年8月1日土曜日

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

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

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

    }
    private SaveDatas DataLoad2(){
        SaveDatas data_str = SaveKanri.Load<SaveDatas>(SAVE);
        ifdata_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.SerializememoryStreamobj );
        
        string str = System.Convert.ToBase64StringmemoryStream.ToArray() );
        try {
            PlayerPrefs.SetString ( prefKeystr );
        } catchPlayerPrefsException ) {
            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.GetStringprefKey );
        
        MemoryStream dataStream = new MemoryStreamSystem.Convert.FromBase64String(serializedData) );
        T deserializedObject = (T)bf.DeserializedataStream );
        
        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 件のコメント:

コメントを投稿