<ad-live>アドリブワードで遊びたいからアプリ作るよ2
さて前回はアドリブワードを引けるアプリを製作した動機やアドリブワードについて話しました
前回はざっくりこんな感じ
- ad-liveのギミックの一つであるアドリブワードめっちゃ面白いよ!
- データベースに送信したアドリブワード保存して、アドリブワードを引けるようにしたいよね!
- Unityで製作するよ!(いろんな環境で使えるもんね)
今回は細かくどう作ったのかなどを話していきます
製作期間は1日半ぐらいかな
まず、Unityで製作するにあたってどうやってネット上にワードを保存するのかが問題です
そこはさすがUnityという感じで便利機能たくさんあります
Unityではどうやらmbaas(mobile backend as a Service)と呼ばれる機能を提供してくれているとこがあるのでそれを使います
mBaaSとは | ニフティクラウド mobile backend
mbaasの中にデータストアと呼ばれるデータを保存してくれるものがあるのでこちらを使用しました
今回は主にmbaasのデータストアの使い方の備忘録となります(Unityの方の細かいことは書きません)
mbaas使ったのも1日半ぐらいなんでまだまだ初心者です。わからないことだらけですが忘れないように書きますよ
最初の入れ方などは簡単なので省略
イントロダクション (Unity) : クイックスタート | ニフティクラウド mobile backend
こういうの見ればすぐできます
ざっくり言うと
アカウント登録→パッケージインポート→テキトーにスクリプトとか貼り付ける
さてデータストアですが
こんな画面です
ここにワードが追加されていきます
データストアのクラスの作成からです
これは画面の「クラス」と書いてある右の緑色のボタンを押して、新規作成すれば完成です
このデータストアを使ってどうやってアドリブワードを保存するかですが
データストアにkeyとそのkeyのvalueを送信して行います
実際にアドリブワードを保存してみると
このような感じになります
自分自身が変更を加える場所としては"word"と"アドリブワードだよん"という場所になります
"word"がkeyになり"アドリブワードだよん"がvalueです
objectIdなどは勝手に登録されます
objectごとに割り振られますが、そんなの知らなくてもいいので必要ないことは理解しない主義で
Unityで使うためにまずどのデータストアのクラスを使うのかを取得する必要があります
そのコードが
NCMBObject obj = new NCMBObject ("ad_live_word");
これです
"ad_live_word"の部分をクラス名にすれば取得したいクラスを取得できます。
さて次に送信ですが送信する際にはどのkeyでどのvalueを送るかです
keyの名前などは自由に設定できます
今回はwordというkeyにしただけで、他のも可能ですし複数でもできるみたいです(あんまり知らない)
送信するコードですが
obj.Add ("word", "アドリブワードだよん"); obj.SaveAsync ((NCMBException e) => { if (e != null) { //エラー処理 } else { //成功時の処理 } });
だけです
objは先ほど取得したクラスのオブジェクトですね
obj.Add ("key名", String型の文字列);
で、できるのでUnity上から入力されたString型の文字列を取得してその変数を書けば終了です
めっちゃ簡単
エラー処理についてはこのまま書いておけば動くんで大丈夫です
送信は本当これぐらいしかしてません
次はアドリブワード取得の方です
アドリブワード取得の主な機能として
- データストアからランダムでアドリブワードを取得
- アドリブワードは一度引いたら捨てる
- アドリブワードがそもそも一つも存在しないなら「ad-liveワードが存在しません」と出す
てな感じの実装をしてきます
ランダムで取得する方法を必死に考えました
よくわからんけどこんな記事を見つけました
大ヒットゲームアプリ「ひとりぼっち惑星」の裏側 ~前編~ | BACKEND AS A SERVICE mbaas BLOG
ここに今いくつワードがあるのか、取得件数の指定、取得開始位置の指定ができるのを発見
よし!ごり押しでいこう!
となった結果
今いくつワードがあるのか調べる
→取得件数を1つにする
→ワードの数までの中からランダムで一つ数字を選ぶ
→取得開始位置を先ほど選んだランダムな数字に決定
→取得したデータを表示、ワード消去
という見事なゴリ押しっぷり感
1つのみ取得する方法が調べてもわからずこんな感じになりました
誰か綺麗なコードかける人教えてください
まず安定のクラス取得から始まります
今回は
NCMBQuery<NCMBObject> query = new NCMBQuery<NCMBObject> ("ad_live_word");
こんな感じで書いたんですが上のと何が違うのか、いまいちよくわからない
こうやって公式に書いてあったんでこうしました
作れればいいよね!
次にいくつワードがあるか確認します
基本公式そのまんまです
query.CountAsync((int max , NCMBException e )=>{ if(e != null){ //件数取得失敗時の処理 }else{ //件数を出力 if(max>0){ Word_Max=max; }else{ Ad_live.text="アドリブワードが存在しません"; } } });
Word_Maxっていうのはいくつワードあるのか保存しとくためのint型の変数です
文字ワードがなかったら「アドリブワードが存在しません」とテキスト変更します
次にランダムで数字を決定しますこれはC#のランダムで値を決定する関数かUnityの関数でも使ってください
0以上Word_Max未満の範囲で決定します
今回はランダムで決定した値を"r"というint型変数に入れておきます
そこから取得件数と取得開始位置を決定します
query.Limit=1; //取得件数 query.Skip=r; //取得開始位置
これだけですが、取得件数の前に取得開始位置を置いたらうまく動作しませんでした
よくわからない仕様です
教えてください
次にワードを取得し、消去になります
foreach (NCMBObject ncbObject in objectList) { Ad_live.text=ncbObject["word"].ToString(); ncbObject.DeleteAsync((NCMBException e2) => { if (e2 != null) { //エラー処理 Debug.Log("エラー"); } else { //成功時の処理 Debug.Log("消去"); } }); } });
こんな感じです
メインは
Ad_live.text=ncbObject["word"].ToString();
これですね
Ad_liveというのはpublic Textなので変えるテキストになります
取得件数が1と決まっているのでforeachですが一つしかとってきません
この取得したのが開始位置が違うので、ランダムでncbObject["word"]からワードのデータを持ってくるわけです
最終的には消去して終わりという感じです
消去は
ncbObject.DeleteAsync((NCMBException e2)
から
});
までの文章になります
この場合はncbObjectがオブジェクトが入っているのでこれが消えます
keyやvalueを送信したやつ一つ一つがオブジェクトです
てな感じでだいたい実装できます
ただし、問題としてクリックを連続で行った時前の処理が終わっていないのに次に行かれると読み込み中なので取得できないので
今回はコールチンなどを使用しました
主にワードの件数を数え終えてからワードの表示とワードの消去を行うようにしました
(yield return StartCoroutine()とか使ったよ)
mbaasのことについてはだいたいメモできたのでこんなもんでしょう
意外と長くなりましたね
わからないとこや間違いの指摘などして頂くと勉強になるので喜びます
こんなのを参考にして製作しました
データストア (Unity) : 基本的な使い方 | ニフティクラウド mobile backend