Unity + NCMBで
ユーザ管理してみた
2016/07/23
@toRisouP
自己紹介
• 名前 とりすーぷ(@toRisouP)
• 本業はWeb系エンジニア
– 最近は主にScalaを書いてます
• 趣味でC#/Unity開発をやってます
今回話す内容
• NCMBでユーザ管理した話
– Unity要素薄いけどごめんね
– まだ開発中で実運用に入ってないので、
紹介するやり方で問題が起きないとは言えません!
この方式を信用しないで!
開発中のゲーム
• 「ハクレイフリーマーケット」
– 東方二次創作ゲーム(PC向け同人ゲーム)
– ネットワーク対戦専用3Dアクション
使ってるもの
• ゲーム本体
– Unity
• 通信対戦部分
– Photon Cloud
• ユーザ管理
– Nifty Cloud Mobile Backend(NCMB)
– 自前のライセンス認証サーバ
やらなくてはいけないこと
• プレイヤーの登録・管理
– メールアドレスを使った登録
– パスワードログイン、パスワード再発行
• シリアルコードによるアクティベーション
– 未購入者は体験版モードで動作
– 購入者のみフル機能で遊べるようにしたい
どうやってやる?
• ユーザ情報自体の管理はNCMBで
– ユーザ情報を自前のサーバで持ちたくない
– ユーザ管理周りの機能はNCMBが完全にサポート
• アクティベーション機能は自作ライセンスサーバ
– 認証サーバを自作したほうが安いし汎用的
– NCMBのカスタムスクリプト機能でできたらよかったんだけど…
• 無料プランだと100回/月しか実行できないからきびしい
アクティベーションサーバ
• フレームワーク:Ruby on Rails
– ncmb-ruby-client をforkして改修して利用
– PostgreSQL + Redis
• ConoHa VPS(1Gプラン)にて稼働
– 単一サーバ構成
– ライセンスサーバが落ちててもゲーム自体は動くから…
• 少なくともアクティベーション済みユーザには影響なし
アクティベーションサーバ
• DBにシリアルコードをハッシュ化して保持
• クライアントからシリアルコードとobject idを受信する
– DBを参照して正しいコードか確認
– 送られてきたobject idのユーザが実在するか確認
– 問題なければNCMBのデータストアに購入フラグを保存
購入フラグ
• 購入フラグはNCMBのデータストアで管理
– ライセンスサーバが落ちててもゲームが動くようにしたいから
– ゲームログイン時にデータストアを検索して購入状態を確認する
図解
ゲームクライアント
アクティベーション
サーバ
シリアルコードと
ユーザID送信して認証
データストア更新
購入フラグを確認
絶対にやらないといけない設定
• 購入フラグはAdminのみ書き込み許可にする
– NCMBのACL(パーミッション設定)機能を利用
– ライセンス認証サーバからの操作のみ書き込み許可
– ユーザから勝手にフラグを書き換えられないようにする
図解
ゲームクライアント
アクティベーション
サーバ
☓
クライアントからは更新できない
(ACL設定で制御)
図解
ゲームクライアント
アクティベーション
サーバ
アクティベーションサーバは
Adminロールのユーザとしてログイン
ログインAPI
Session Token
SessionTokenはRedisにexpire付きで保存
揮発したら再度ログインAPIを叩く
図解
ゲームクライアント
アクティベーション
サーバ
シリアルコードと
ユーザID送信
課金フラグをセット
AdminのSession Tokenを利用して
データストア更新APIを実行
ACL設定周りの罠
ACLのリファレンス
• ACLの書き換え方(REST API)
「なるほど、許可したいところに
trueを設定するのか」
「ということは、不許可にするときは
falseにすればいいんだな!」
{
"acl": {
"role:Admin": {
"read": true,
"write": false
}
}
}
400 Bad Request
なんで?
• ACLの書き換え方(REST API)
– 不許可にするときは要素を定義しないが正解
– APIに対称性がないので感覚で使うと死ぬパターン
– リファレンスにわかりにくいけどちゃんと書いてある
ちなみに
• UnityからACLを書き換える時も注意が必要
– 下記のコードは何も起きない
– 何故か?
理由
• 「Userオブジェクト自体に更新が無いと通信処理を
行わない実装になっているから」
– 内部実装を読まないと気づかないよコレ…
解決策
• 明示的に代入をする
– Userオブジェクトに更新があったことを自覚させる必要がある
NCMBを使う上でのポイント
• わからなくなったらREST APIリファレンスから辿る
– リファレンスのUnityの項目は中途半端にしか書いてない
– APIパスでファイル内検索して実装を見つけてそこから辿ったほうが早い
• Unityプラグインの実装も読む
– 逆にREST APIの使い方がわからない場合、実装を読むとわかることがある
– NCMBObjectクラスの実装を理解すればとりあえずなんとかなる
• わからないことがあったら@Takaaki_Ichijoさんに聞く
– 無料プランだと技術サポートに問い合わせできない
– ユーザコミュニティは人がいなくてあんまり盛り上がってない
– 一條さんに問い合わせた方が早いかも
所感
• NCMBのユーザ管理はとても優秀
– メールアドレス認証やパスワード再発行も簡単にできる
– 無料でこれだけの機能が使えるのは良い
• ライセンスサーバ自分で作るの面倒くさかった
– 保守するものが増えるのはだるい…
– スクリプト機能が無料でもちゃんと使えたらよかったな…
• ACL周りの設定が罠っぽい
– REST API側もUnity Plugin側も両方罠っぽい
– リファレンスをわかりやすく書いてくれると嬉しいな…
未だにわからないこと
• 「ユーザが所属しているロールの取得方法」
– ロールに所属する会員一覧は取れるのだが…
• 逆引き方法はREST APIみてもよくわからなかった
– 結局ロールを使わない実装にして回避した
• その結果がデータストアで購入フラグを管理するというやり方
以上

UnityとNCMBでユーザ管理を実装してみた話