Unityでフレンドとアイテム交換とかする機能をサーバーレスで作る　その１

# 個人開発でもフレンド機能とかアイテム交換機能をゲームアプリにつけたい

本稿はUnity Advent Calendar 2017 12日分です。
https://qiita.com/advent-calendar/2017/unity

みなさんは「どうぶつの森ポケットキャンプ」やってますか？わたしはビンタくん推しです～だのら。

さて、ポケ森には他のゲームアプリの例にもれず「フレンド機能」が付いています。
本作のフレンドは「バザー」「フレンドのキャンプに訪問」「自分のキャンプにNPC的に登場」「鉱山に入るときのヘルプ」の4つの接点があります。

こうしたソーシャルゲーム的なユーザー間同士のふれあい機能はゲームの魅力を増すものですが、いざ個人開発のゲームアプリに取り入れようとすると、一見サーバー側の知識が必須のように思えます。
何らかのクラウドサービスを月額契約して、コマンドラインでいろいろ操作して...というイメージがあるかもしれませんが、
「BaaS(Backend as a service)」を活用することで、このハードルを越えてアプリにフレンド機能を導入することができます。

今回はUnityとBaaSの一つである「ニフクラ mobile backend」を使って

※なお本稿では「サーバーレス」をサーバーの開発・管理を開発者がやる必要がないサービス、という意味で使っています。

## デモゲーム「人類もりあがってきた」

「人類もりあがってきた」はゆるふわ殺伐サバイバルゲームです。
木を殴ると果物が落ちてくるので、それを収集します。(2017/12/12時点)

https://unityroom.com/games/jinrui

![title.png](https://qiita-image-store.s3.amazonaws.com/0/19010/5b6e4df4-46bd-f482-c04d-25fe9549ecb5.png)

![game.png](https://qiita-image-store.s3.amazonaws.com/0/19010/b4bea10d-4b0a-8333-3bd1-c5692980456e.png)

github 
https://github.com/TakaakiIchijo/Jinrui_Moriagatte_Kita
動作には別途NCMB SDKの導入が必要です。

## NCMBとは
富士通クラウドテクノロジーズ株式会社が提供するモバイルアプリ向けバックエンドサービスです。
無料から利用できます。

会員管理（ログイン）、データストア（データベース）、ファイルストア（ファイルストレージ）、位置情報検索、プッシュ通知など、モバイルアプリの開発でバックエンド側が必要そうな機能があらかじめビルトインされているサービスです。
Unity SDKが提供されており、iOS/Android/PC/Macでも動作します。ちょうど先日WebGLビルドにも対応しました。
上記のデモはそのバージョンを使ってブラウザで動作させています。モバイルとは。

Unityへの導入は以下のチュートリアルをご参照ください。
NCMBのデータベースへ書き込んだり、値を取り出したりする処理が学べます。
http://mb.cloud.nifty.com/doc/current/introduction/quickstart_unity.html

## フレンド機能の要件
今回のデモを開発するにあたって、必要な機能の要件をきめました。

1. ユーザのお金・アイテムを管理する機能
2. フレンドリストの表示
3. アイテムを他のユーザーと売却・購入する機能
4. 配置系オブジェクトの座標を保存しておく機能
5. 他のユーザのマップに訪問する機能

※今回（2017/12/12）は1の処理まで

## ログイン（会員管理機能）の構造

NCMBの会員管理機能を使って、ログインの機構を作ります。
ゲームでログインというとPC用のMMOを思い浮かべますが、ゲーム中の所持アイテムや所持金など、ユーザーだけしか見えないデータの保存・取得だと考えてください。

http://mb.cloud.nifty.com/function.htm#user

デモでは、「拾ったミカンの数」「所持金」と、後述する「公開プロフィール」の参照を保存するために使っています。

![会員管理.png](https://qiita-image-store.s3.amazonaws.com/0/19010/630c3dc0-1cd2-a22a-dfe6-eb89cd3bfd43.png)

この1行が1ユーザーに当たります。

## データベース（データストア）構造

NCMBではデータの保存場所を「データストア」と呼んでいます。
ちょうどオンライン上にExcelのファイル一つが用意されていると考えてください。アプリから数値や文字列などのデータを自由に読み書きできます。
1つのファイルに相当する区切りを「アプリ」、1つのシート相当を「クラス」と呼んでいます。

http://mb.cloud.nifty.com/function.htm#datastore

「クラス」の生成は自由で、ランキング機能として使うならば「点数」「名前」などをカラムに指定して利用できます。

今回のデモではフレンド機能に利用するので、「ニックネーム」「村のオブジェクトの配置座標」「レベル」を保存するために使っています。
クラス名は「Public Profile」、いわば「公開プロフィール」です。

![データストア.png](https://qiita-image-store.s3.amazonaws.com/0/19010/6800ed49-53f3-42ed-7138-89af54c14a7a.png)

これらの情報をデータストア側に置いたのは、フレンド機能としてほかのプレイヤーと情報を共有するためです。
会員管理と異なり、データストアではレコードを識別するobjectIdさえわかればだれでも取得できるので、こちらに保存しています。

## デモ中での流れ

### サインアップ

はじめてのゲームを始めると、「はじめから」のボタンが現れるのでクリックで進みます。
内部では次の処理を行っています、。

1. ID/Passwordを自動生成してNCMBに新規アカウント作成
2. 自動生成したID/Passwordを保存
3. データストアで新規の公開プロフィールレコードを作成
4. 作成したレコードのidを会員管理側に保存

なお、今回はデモとしてID/Passowordはランダムな4文字ずつで、*ローカルにそのまま保存しています* 本番ゲームでは危険すぎるので暗号化などの処理を行ってください。

### ゲーム中

みかんを拾うたびに会員管理のデータを送信し、NCMB側に保存しています。

### 次回以降のログイン

ローカルにIDが保存されている場合は、それを使ってログイン処理をします。

### 別の端末・PCで遊ぶ

「連動コード発行」をクリックすると、さきほど生成したIDとパスワードが表示されます。
スマホゲームでよくある「引継ぎコード」です。

![Unity 2017.1.2f1 (64bit) - Title.unity - Jinrui_Moriagatte_Kita - PC, Mac & Linux Standalone _DX11_ 2017-12-12 17.52.34.png](https://qiita-image-store.s3.amazonaws.com/0/19010/4197f5e3-4e17-5132-d5ed-b3a65b8c3544.png)

この情報をメモっておき、別の端末で「連動コード入力」を行うと、ゲームの進行状況を引き継ぐことができます。

# まとめ（おわび）
Unity Advent Calendar 2017の企画として用意しましたが、想定していたところまでマニア話なったため第一弾として公開します。
続きはまたいずれ。