データベースといろいろ連携してみよう
この章で学ぶこと
データ活用例の体験として、ユーザー情報としてランキング情報を取得してみます。
Codespace の起動
GitHub にログインした状態で https://github.com/codespaces にアクセスします。
Codespaces のページです。さきほど使っていた Codespace をクリックして起動します。
サーバの起動
- ターミナルで
npx node-red -u week06-chapter02
をサーバ起動 - ポートタブで今回のサーバ起動を公開
- シークレットウィンドウで今回のサーバが公開されているか確認します
✅ポイント
- pointlist というデータベースがあります
- 以前のとおり JSON Server でシンプルなデータベースが使えます
今回の Unity シーンを起動
Project タブから Assets > Scenes を選択します。Week06-Chapter02 をダブルクリックして起動しましょう。
今日は、このプログラムをベースに、送る値や受け取る値を Unity に設定していきます。
✅ポイント
- ClickPart には、すでに Week06_Chapter02_ClickPart が割り当てられてポイントの加算やリセットを担当しています
- RankingMessage は Week06_Chapter02_RankingMessage が割り当てられて、これから書いていきます。出来上がったサンプルは Week06_Chapter02_RankingMessage_OK_Sample がありますが、どうしてもわからないときに確認しましょう。
- SendButton は Week06_Chapter02_SendButton が割り当てられて、これから書いていきます。出来上がったサンプルは Week06_Chapter02_SendButton_OK_Sample がありますが、どうしてもわからないときに確認しましょう。
- 今回、新しく InputField が登場してポイント登録時に自分の名前が設定できるようになっています。
ランキング表示の API の URL を設定する
まず Week06_Chapter02_RankingMessage を進めていきます。
// アクセスする URL
string urlAPI = "";;
今回はランキング表示は GET リクエストをしています。API の URL を設定しましょう。
ランキング表示のデータを読み込めるように ResponseData と ResponseDataList を設定しよう
// 受信した JSON データを Unity で扱うデータにする ResponseData ベースクラス
// 今回は data の中身が配列で、List の中身を定義する ResponseDataList 型を作成。
[Serializable]
public class ResponseData
{
public List<ResponseDataList> data;
}
// name , point のプロパティが入っているので、List の中身を定義する ResponseDataList 型を作成
[Serializable]
public class ResponseDataList
{
}
今回受け取るデータの例です。
{
data: [
{
"id": "33d3",
"name": "seigo",
"point": 5
},
{
"id": "230d",
"name": "seigo",
"point": 254
},
{
"id": "93b3",
"name": "seigo",
"point": 23
}
]
}
今回は data の中身が配列で、List の中身を定義する ResponseDataList 型を作成しています。
List の中身を定義する ResponseDataList 型を作成を、name , point のプロパティが入っている形で設定してみましょう。
ランキングのテキストを表示してみよう
string textRankingList = "[Ranking]\n";
Debug.Log(response.data);
// データを一つずつ反映する
for (int i = 0; i < response.data.Count; i++)
{
ResponseDataList currentLine = response.data[i];
Debug.Log(currentLine);
// 文字列を連結
textRankingList += "";
}
// メッセージに反映
this.transform.GetComponent<TextMesh>().text = textRankingList;
データがうまく読み込めて ResponseData と ResponseDataList でさばけるようになると、この部分が動作します。
textRankingList の文字列を調整してランキング表示テキストに反映しましょう。currentLine には ResponseDataList で各行のデータが入っているので、
// 文字列を連結
textRankingList += "";
の文字列を調整して [1] seigo 5pt
といった表現をしてみましょう。改行は末尾に \n
を使いましょう。
ランキング表示を動かしてみましょう
ここまでできたらランキング表示を動かしてみましょう。
ポイントデータ記録ボタンで自分の名前を反映
Week06_Chapter02_SendButton を動かしていきましょう。
ポイントデータ記録ボタンで自分の名前を反映できるようにしましょう。
// 自分の名前を登録
// 固定値でなく InputField から取得する
pointRequestData.name = "Seigo";
GameObject InputField から .GetComponent<InputField>().text
という形で入力フィールドから取得できるので実装してみましょう。
ポイント登録後にランキングの更新を行う
現在の機能だとポイント登録後にランキングの更新が行われません。ランキングを更新しましょう。
// RankingMessage で最新データを取得
// GetDataCore を動かす
のところで SendButton から Week06_Chapter02_RankingMessage クラスにある GetDataCore を実行してみましょう。
何度か動かしてみましょう
この状態だとデータが更新されるのですが、ランキングにはデータの行順で表示されてしまうので、新しいデータが表示されません。調整していきましょう。
ソート(並び替え)機能でポイント順にしてみる
JSON Server データをいろいろな並び順や見せ方をすることができます。
- JSON Server のソート機能
今回だとポイントを狙ったソートを使います。
その場合は、
/pointlist?_sort=point
- ポイントの低い順
/pointlist?_sort=-point
- ポイントの高い順
で書き換えてみましょう。
このように、サーバで並び順をうまく変更してくれる仕組みがあれば、Unity 側でソートプログラムを書かなくてもうまく表示することができます。
今回の Codespace の終了
今回の Codespace 終了しておきましょう。
振り返り
- データベースと連携するために、データ取得・データ記録・データ操作(ソート)を行いました
- データを集めるとゲームのルールやゲームのデータをして活用していろいろなゲーム企画ができます