忘れん坊の備忘録

情報工学科に通う大学生のメモ。あまり詳しくは無いです。備忘録かな

<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
こういうの見ればすぐできます
ざっくり言うと
アカウント登録→パッケージインポート→テキトーにスクリプトとか貼り付ける


さてデータストアですが
f:id:kuhuhu1021:20170923004123p:plain
こんな画面です
ここにワードが追加されていきます


データストアのクラスの作成からです
これは画面の「クラス」と書いてある右の緑色のボタンを押して、新規作成すれば完成です


このデータストアを使ってどうやってアドリブワードを保存するかですが
データストアにkeyとそのkeyのvalueを送信して行います

実際にアドリブワードを保存してみると

f:id:kuhuhu1021:20170923004734p:plain

このような感じになります
自分自身が変更を加える場所としては"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