冷奴の開発メモ

UnityとかC#とかプログラミングのことをメモしていく場所

ニフティクラウドmobile backendを使ってみた

アプリで作成したデータ(Serializableなクラス)をユーザ間で共有する仕組みを探していたところ、ニフティクラウドmobile backend(NCMB)が想像以上に簡単だったためメモ。

公式ドキュメント。導入方法やサンプルなどが非常に充実している。
ドキュメント : 開発者向けドキュメント | ニフティクラウド mobile backend

無料版と有料版の違いは月当たりのリクエスト制限やファイルサイズ制限くらい。
大規模でなければ無料版で十分そう。

データストアの他にプッシュ通知や会員管理もできるらしい。
今回はデータストアの使用のみ。

導入

クイックスタートを読みながら進めれば問題ないはず。
イントロダクション (Unity) : クイックスタート | ニフティクラウド mobile backend

ざっくり以下のとおり。
1.(NCMB)アプリの作成してAPIキーを発行する
2.(Unity)SDKをインポート
3.(Unity)NCMBSettingというコンポーネントをつけたオブジェクトをシーンに配置する
4.(Unity)NCMBSettingにAPIキーを設定する
5.(NCMB)適当な名前をつけたクラスを作成する
  クラスはMySQLなどでいうテーブルに当たるが、Key-Valueストアのようにフィールド(カラム)を設定・取得できるのでデータ構造を定義する必要はない

レコードの追加

クラスStagesのフィールドdataに文字列strを登録するコードが以下。
SaveAsync()は非同期でサーバにレコードを送る。コールバックも設定可能。

var saveServerObject = new NCMBObject("Stages");
saveServerObject["data"] = str;
saveServerObject.SaveAsync();
レコードの取得

クラスStagesの一番古いレコード一件を取得し、フィールドdataをデバッグに表示するコード。
追加に比べると複雑に見えるがエラー処理などが書いてあるだけ。
Whereなど普通のDBでできることは大体できそう。

var query = new NCMBQuery("Stages");
query.Limit = 1;
query.OrderByAscending("createDate");
query.FindAsync((List objList, NCMBException e) => {
		if (e == null && objList.Count > 0)
		{
			// 成功時の処理
			Debug.LogError(objList[0]["data"]);
			return;
		}

		// 失敗時の処理
	});
(おまけ)Serializableクラスの文字列化

今回は保存したいデータ(Serializable属性を付けたクラス)をBase64シリアライズしてNCMBで保存、取得とデシリアライズをして読み込みをした。
たぶんScriptableObjectなどでもいけるはず。
変換に使ったメソッドのコードは以下。

public static string Serialize(T obj)
{
	var bf = new BinaryFormatter();
	var ms = new MemoryStream();
	bf.Serialize(ms, obj);
	return Convert.ToBase64String(ms.GetBuffer());
}

public static T Deserialize(string str)
{
	var bf = new BinaryFormatter();
	var ms = new MemoryStream(Convert.FromBase64String(str));
	return (T)bf.Deserialize(ms);
}