2019-05-18に投稿

Unityでリアルタイムフレンド申請の実装方法を考えた話 by 大学生ゲーム制作者

フレンド申請に限らず、チームに招待する機能を作りたい。

申請ボタンを押したら即座に相手に通知が行って、承認拒否を選べる機能が欲しい!

 

フレンドのデータベースには、Nifty Cloud Mobile Backend (NCMB)を利用する予定。

なので始めはNCMBを使った実装を考えたけれど、どうにも問題があった。

 

そこで最も良い方法を調べて、考えた。

結論から言うと、最後に書くPhotonChatを使うのが良さそう

(まだ実際に使ったわけではないので、確定ではないのですが)

 

NCMBでデータストアを監視して実装

NCMBに新しく、フレンド申請クラスを追加してそれを監視する。

フレンド申請クラスには、申請先のユーザーID, 申請元のユーザーIDをデータとして入れるようにする。 

新しくデータが追加された時に、自分に対する申請が無いかをチェックする事でフレンド申請の機能にする方法。

問題点

5秒に1度くらいのペースで新規データをチェックしないとリアルタイム性に欠ける。

データが追加された時にUnity側の関数を呼び出す機能があれば良いのだが、どうやらそれは無さそう。

もし、毎日100人がプレイしたとするとNCMBの無料枠1,000,000APIリクエストは

1,000,000(回) / 30 (日) / 100 (人) = 333 (回)

333 (回) × 5 (秒) / 60 (秒) = 27.75 (分)

となり、一人当たり一日28分以上プレイすると無料枠を超える事になる

NCMBの無料枠を超えると、5万円 / 月 かかるのでこんなオーバーの仕方ではもったいなさすぎる。

 

NCMBでプッシュ通知で実装

NCMBの機能を使って、特定の人にフレンド申請のプッシュ通知を送る。

プッシュ通知とはiPhoneとかAndroidでゲームを起動してなくても来る通知の事。

問題点

そもそもプッシュ通知の本来の使い方と違う気がする。

プッシュ通知を利用する場合、NCMBではiPhoneかAndroidで実機ビルドをする必要がある。(エディタ上では使えない)

また、iOSでは確かAppleDeveloperの有料アカウントが必要など非常に面倒事が多い

一番の問題はエディタ上で使えない為、デバッグが大変すぎるという事。

 

Photon Unity Networkingで個人ルームに入室して実装

Photon Unity Networking (PUN) でRPCを利用する方法。

  1. メニュー画面に入った時点で、自分一人のルームを作成する
  2. NCMBで保存されている申請を送りたい人のPhotonUserIDでFindFriend関数を使う
  3. Photonのフレンドリストが更新されるので申請を送りたい人を探し、その個人部屋に入室する
  4. RPCを使って申請のやりとりを行う

問題点

常に個人用のルームに入室している必要があり、無駄

複数人同時に申請を送る場合、ルームがわけわからなくなる。

申請をする為だけに人のルームに勝手にはいる事になり、何か違う。

実装がなかなかに面倒くさい。

 

Photon Unity Networkingでフレンドの招待ルームを監視して入室

上記同様PUNを利用するが、こちらはチーム申請の際の話。

既にフレンドリストが存在していれば、

  1. 招待する側はカスタムプロパティでInviteっていう名前のルームを作る
  2. ルームに入れる人をチーム申請したい人のUserIDのみに制限する
  3. 全てのプレイヤーはFindFriend関数ですべてのオンラインのフレンドを取得している
  4. 全てのプレイヤーはオンラインのフレンドがInviteという名前のルームを作成した場合、そのルームへの参加を試みる
  5. 参加に成功すればそれがチームになる

問題点

常にFindFriend関数を更新する必要がある。

非常に無駄。

実装が大変。

 

NCMBの代わりにPlayFabを使ってみる

最近サービスが充実してきたPlayFabというサービスがあるらしい。

日本ではまだ全然広まっていないが、マイクラなど有名なゲームが採用しているようだ。

機能は、NCMBのようにmBaaSだと思われる。

NCMBとの違いは、よりゲームに特化した機能が多い事だ。

機能が豊富なのでNCMBの問題を解決できるかと期待したが、

『普通そういう使い方はしません。

今後のアップデートでそういう事が出来るようになる可能性が高いけど、今はまだNCMBと同じ方法でしか出来ないよ』

と書かれていて残念。

問題点

今回の件に関してはNCMB同様の問題で解決できそうにない

また、まだ日本語のドキュメントが皆無と言ってい良い。

英語読むの大変。

でもNCMBやめてデータベースとして利用したいと思えるほど便利そうだった。

 

NCMBの代わりにFirebaseを使ってみる

NCMBに似たサービスでもう一つ、Firebaseなるものがあるようだ。

Firebaseでは招待の機能があってそれを使えば実現できる可能性がある。

 

問題点

Firebaseはそれなりにサーバーサイドの知識が要りそう。

Unityとの連携に時間的コストがかかりそうだったから後回しにした。

現状、次のPhoton Chatでの実装の方が楽そうだったのでそれ以上は調べていない。

 

Photon Chatで実装

PlayFabの質問ページで僕と同じ事を考えている人がいた。

その答えは、「無理だから、ExitGamesとか使ってね。」

という事だった。

 

ExitGamesってなんだ?ってなって、調べたらPhotonだった。

「だから無理だって!!」

と思ったが調べるとPhotonChatなるものがあるらしい。

 

Photon Chatを使えば楽にリアルタイムでテキストデータのやり取りが出来るらしい。

確かに、フレンド申請は単純な文字のやり取りにすぎない。

そんなに難しい話じゃないやんけ!

  1. NCMBでプレイヤーデータの中にPhotonChatのユーザーIDを持っておく
  2. フレンド申請したいプレイヤーを検索で見つけ、そのプレイヤーのPhotonChatのユーザーIDでプライベートチャットを開始
  3. チャットで招待メッセージを送信
  4. 招待メッセージを受け取ったらそれに対する回答を送信
  5. 承認された場合、NCMBのフレンドリストにプレイヤーIDを追加

 

チームの場合も同様。

という事でこれから実装していこうと思います。

(絶対一筋縄じゃいかない)

 

 

Originally published at questgames.hatenablog.com
ツイッターでシェア
みんなに共有、忘れないようにメモ

QuestGames

全ては5年前に始まった。 QuestGamesはゲームを作る3人組です。 僕らの物語は現在執筆中です。ブログをご覧ください。

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント