05 «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.» 07

ハルシオンシステムの気まま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   

コメント

コメントの投稿

Secret

トラックバック

トラックバックURL
→http://halcyonsystemblog.blog.fc2.com/tb.php/144-61016dca
この記事にトラックバックする(FC2ブログユーザー)