セキュリティ系の勉強・その他開発メモとか雑談. Twitter, ブログカテゴリ一覧
本ブログはあくまでセキュリティに関する情報共有の一環として作成したものであり,公開されているシステム等に許可なく実行するなど、違法な行為を助長するものではありません.

雑談 Unity〜PlayerPrefsX少し触った

//

PlayerPrefsXはとても便利ですね。
ArrayPrefs2 - Unify Community Wiki
こちらのリンクから飛ぶことができますが、Gitに乗っているわけではないので、自分でコピペしてスクリプトを作成してください。


 boolean配列を適当な順番で値を変更し、その度にその状況を保存しようとしました。この時、PlayerPrefsXさんのSetBoolArrayを使用したのですが、これだと値を書き換える度にすべての値を読み込み、書き込みしなければなりません。まぁ当然、PlayerPrefsで行なっていたらものすごい処理になってしまうのでXさんをしようさせていただいているのですが。。。

 ただ結局コーディングしている側からするとやっていることは相変わらず効率悪く感じてしまって。できればまとめて保存したものを、後から部分ごとに変更できたらなぁと思いました。それ最初は負荷かけてPlayerPrefsでちまちま保存して、後で楽すれば、、あれ?じゃあXさんはどうやっているのさ笑



 PlayerPrefsXさんの中身見てきました。

public static bool SetBoolArray (String key, bool[] boolArray)
{
	// Make a byte array that's a multiple of 8 in length, plus 5 bytes to store the number of entries as an int32 (+ identifier)
	// We have to store the number of entries, since the boolArray length might not be a multiple of 8, so there could be some padded zeroes
	var bytes = new byte[(boolArray.Length + 7)/8 + 5];
	bytes[0] = System.Convert.ToByte (ArrayType.Bool);	// Identifier
	var bits = new BitArray(boolArray);
	bits.CopyTo (bytes, 5);
	Initialize();
	ConvertInt32ToBytes (boolArray.Length, bytes); // The number of entries in the boolArray goes in the first 4 bytes
 
	return SaveBytes (key, bytes);	
}

//------------------
enum ArrayType {Float, Int32, Bool, String, Vector2, Vector3, Quaternion, Color}

えっと、英語でも説明してくれてます。。簡単に見ると、
・bool配列をbitにしてbitsに保持、それをbytesにコピー、bytes型に変換してSaveBytes()メソッドに渡してます。
・bytesの先頭にはbool型ということを記憶させています。スクリプトを見るとわかると思いますが、保存したboolを読み込み際に、boolかどうか確認作業がこれを用いて行われています。
・CopyToメソッドは指定先と指定先から見たインデックス番号を渡すと、その場所へ情報をコピーすることが可能なため、32bit分のboolフラグを先頭にしてbool
情報をコピーしていることになります。
・Convertint32ToBytesはごめんなさいわからないです

SaveBytes()メソッドは以下のようになっています。

private static bool SaveBytes (String key, byte[] bytes)
{
	try
	{
		PlayerPrefs.SetString (key, System.Convert.ToBase64String (bytes));
	}
	catch
	{
		return false;
	}
	return true;
}

 チンケな頭を回転させてわかったことは、boolをそのまま配列で保存していたわけではなく、一度byteに変換しそれをstringにさらに変換してPlayerPrefsで保存をしていたということ!
 そりゃ、PlayerPrefsをbool配列文回していたら頭悪いですもんね。素晴らしいスクリプトだと思います。しかし完全に流れを抑えられらわけでもなく、stringでまとめて保存しているため、当初の目的であった一部を変更して保存するという戦略は難しそうですね。保存場所からbit数を計算して、stringをbyteに変換し直し、そこの計算して出した部分だけを書き換え、再びstring型で保存すれば理論上は行けそうですが。。少し僕には厳しい!!

 ただ今回も細かいところを見学させていただいた結果、bit系の操作は結構頻繁に行われているんだなと実感しました。これから周りの環境を自分通りに作って行く場合には必要な知識なんですよね!頑張ります。





P.S.
年末年始は風邪で寝込んでいたのでテレビ及び電子機器はほとんど触れませんでした。辛い。。けどモヤさまは見たよ!