FC2ブログ
    07 «1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.» 09

    ハルシオンシステムの気ままBlog

    株式会社ハルシオンシステムのメンバーが送る、UnityやらJavaやらの技術的話題から、自社開発のアプリの宣伝とかとかのブログです。ほんと気ままにいきたいと思います。更新日は毎週 月 木でっす!

     

    【Unity】みなさん、データの保存ってどうやってます?俺はこうやっちゃってます。 

    こんにちは!坂内です。
    台風19号でかいっすね。直撃御免って感じですが、みなさん大丈夫でしょうか?
    いきなり肌寒くなってきて、風邪にも注意でごわす。

    さて、本日はUnityにおけるデータの保存についてちょこっと書いてみます。

    皆さんUnityでゲームを作る際、データの保存はどのように行ってますか?
    基本、少ないデータならばPlayerPrefs、もしくはテキストとかのデータファイルに書き込みってのが一般的なんですかね?
    他にもDBとしてSQLiteとか使えるようですが、使ったことありません。うひひ

    PlayerPrefsですと、「string」「int」「float」くらいしか使えませんよね?
    これってめんどいですよね。色々なデータをわざわざintとかfloatに変えないと保存できないし、ロードの際にも逆に変換とかしないといけないと・・・・・
    そういえば、どこかにPlayerPrefsXというのもありましたね。以前ちょっと使ったことはあります。

    ってことで、僕はいつも以下のクラスを使っております。(これどこかのサイトで見つけたんだと思ったけど・・・どこか忘れました)

    「FileController.cs」

    using UnityEngine;
    using System.Collections;
    using System.IO;
    using System.Runtime.Serialization.Formatters.Binary;

    public class FileController : MonoBehaviour{

    public FileController(){
    }

    public static bool Save<T>( string prefKey, T serializableObject ){
    MemoryStream memoryStream = new MemoryStream();
    #if UNITY_IPHONE || UNITY_IOS
    System.Environment.SetEnvironmentVariable("MONO_REFLECTION_SERIALIZER", "yes");
    #endif
    BinaryFormatter bf = new BinaryFormatter();
    bf.Serialize( memoryStream, serializableObject );

    string tmp = System.Convert.ToBase64String( memoryStream.ToArray() );
    try {
    PlayerPrefs.SetString ( prefKey, tmp );
    } 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;
    }

    public void save(SaveData data) {
    // 保存用クラスにデータを格納.
    FileController.Save("{PlayerPrefsに保存するキー}", data);
    PlayerPrefs.Save();
    }

    public SaveData load() {
    SaveData data_tmp = FileController.Load("{PlayerPrefsに保存するキー}");
    if( data_tmp != null){
    return data_tmp;
    }else{
    return null;
    }
    }


    「SaveData.cs」実際に保存されるクラス
    using System.Collections;

    [System.Serializable()]
    public class SaveData{
    [System.Serializable()]
    public class InnerClass{
    public string ppppppp;
    public int ggggggg;
    }

    public int aaaaaaa;
    public float bbbbbb;
    public string cccccccc;
    public int[] ddddddd;
    public InnerClass eeeeeeee;

    }

    と、まぁどんな形のクラスでもいいですが、シリアライズできるならそのままマルっと保存できちゃいます。
    もちろん上記のように内部クラスがあっても問題ナッシング!
    なんでも保存できちゃうのが素敵っすよね!
    もちろん、AndroidiOSどっちも対応してます。

    ということで、Unityのデータ保存ライフ楽しんで! アデュ~ノシ

    Category: 開発日記(Unity)

    Tag: Unity  Android  iOS 
    tb 0 : cm 0