今年の6月に発売されて話題を呼んだ、ニフティクラウドmobile backend/UNETの解説書、通称ピンク本を遅まきながら購入して読んでみました。
まず整理すると、ニフティクラウドmobile backend(以下NCMB)と、UNETは全く違うサービスです。
NCMBはmBaaSと呼ばれるもので、FireBaseやAmazonの各種サービス(Dynamo DBやAmazon SMS)などのように、自分でサーバを立てることなくアプリのバックエンドの仕組みを代行してくれるサービスです。「ニフティクラウド」単体だと、Amazon EC2のようなサーバインスタンスを建てるサービスになり、NCMBとはまた違いますのでご注意ください。
今回、ピンク本の前半で解説されている、NCMBを使ってみました。まだアプリ自体は完成していないので、現状でメモ書きとなり追記予定です。
NCMBをUnityで使うには、SDKを使うのが便利です。SDKはGitHubで公開されています。
ニフクラ mobile backend Unity SDK. Contribute to NIFCLOUD-mbaas/ncmb_unity development by creating an account on GitHub.
NCMBのデータの考え方は、まずは「会員管理」があります。アプリのユーザーを会員登録することで一意に識別し、その後の処理を行いやすくします。
ピンク本では、フォームによる手動登録と、スマホアプリで主流になっている自動会員登録の両方が解説されていて、非常に実践的です。
また、サンプルのプロジェクトが良くできていて、それを調査するとかなり勉強になります。
サンプルプロジェクトを参考にした、「ニックネーム」も会員情報に一緒に登録する会員自動登録メソッドが下記になります。
public IEnumerator SignUpCoroutine( string nickName, UnityAction<ncmbexception> errorCallback) { string generatedPassword = Utility.GenerateRandomAlphanumeric (8, true); NCMBUser user = new NCMBUser (); user.Password = generatedPassword; user.Add ("NickName", nickName); bool isSuccess = false; while (!isSuccess) { string generatedUserName = Utility.GenerateRandomAlphanumeric (8, true); user.UserName = generatedUserName; bool isConnecting = true; user.SignUpAsync ((NCMBException e) => { if (e != null) { if (e.ErrorCode != NCMBException.DUPPLICATION_ERROR) { errorCallback (e); } } else { SaveLocalUserNameAndPassword (generatedUserName, generatedPassword); isSuccess = true; } isConnecting = false; }); while (isConnecting) { yield return null; } } }
また、本には、一度ログインするとNCMBUser.CurrentUserはキャッシュされるのでその後も使用可能、と書いてあったのですが、たしかにそのような作りで、シーンを変更しても問題なく取得できました。
また、会員情報以外の任意のデータを保存できるデータストア機能でちょっとハマったのが、objectIdの使い方。
データストアに作成した「MatchList」というテーブルからデータを取り出すメソッドの例
public IEnumerator FetchMatchData(string userName,MatchStatus status,UnityAction<ncmbexception> errorCallback) { NCMBQuery<ncmbobject> query = new NCMBQuery<ncmbobject> ("MatchList"); query.WhereEqualTo ("UserName", userName); query.WhereEqualTo ("Status", (int)status); bool isConnecting = true; query.FindAsync ((List<ncmbobject> objList, NCMBException e) => { if(e != null) { errorCallback(e); } findList = objList; isConnecting = false; } ); while (isConnecting) { yield return null; } }
上記のようにして取り出したNCMBObjectの値の取得は
obj["カラム名"] as string
みたいに書きますが、
IDとなるobjectIdを取り出すのに
obj["objectId"] as string
と書くとエラーになるので
obj.objectId
で取り出すべきでした。
(追記中)