tag:crieit.net,2005:https://crieit.net/tags/PlayFab/feed 「PlayFab」の記事 - Crieit Crieitでタグ「PlayFab」に投稿された最近の記事 2021-03-16T01:03:30+09:00 https://crieit.net/tags/PlayFab/feed tag:crieit.net,2005:PublicArticle/16750 2021-03-16T01:03:30+09:00 2021-03-16T01:03:30+09:00 https://crieit.net/posts/playfab-api-call-limitation 📔 PlayFab の API 制限に引っかかった <h1 id="はじめに"><a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</a></h1> <p><a target="_blank" rel="nofollow noopener" href="https://docs.microsoft.com/ja-jp/gaming/playfab/features/automation/cloudscript-af/">PlayFab で CloudFunction</a> を利用しているときに API 制限に引っかかってしまいました。負荷テストをした際に初めて気づいたのですが、公式ページにも言及が無かったため発覚が遅れてしまいました。そのため、PlayFab に依存していた機能を部分的に外す必要が出てきてしまい苦労しました。</p> <p>本記事では、上記のような事態に陥る方を減らすため、API 制限に気づくまでの軌跡を辿りながら、PlayFab の CloudFunction を利用する際の注意点について、記事として残しておきたいと思います。</p> <h1 id="PlayFab の API 制限に引っかかった要因"><a href="#PlayFab+%E3%81%AE+API+%E5%88%B6%E9%99%90%E3%81%AB%E5%BC%95%E3%81%A3%E3%81%8B%E3%81%8B%E3%81%A3%E3%81%9F%E8%A6%81%E5%9B%A0">PlayFab の API 制限に引っかかった要因</a></h1> <p>PlayFab の CloudFunction を利用すると、<strong>PlayFab 経由で独自 Web API を実行することが可能になります。また、CloudFunction 経由で独自 Web API を実行すると、PlayFab ユーザ情報が含まれたパラメタが含まれた状態でリクエストが飛んでくるため、その情報を利用することでサーバーサイドで PlayFab の操作を行うことが出来るようになり大変便利です。</strong></p> <p>そのため、あるプロジェクトでは PlayFab CloudFunction を Azure Function や AWS Lambda のような FaaS を使っている感じで利用しておりました。<em>そして、その利用の仕方は誤りであったことに後々気づきます...</em></p> <h2 id="負荷テストを実装するフェーズで CloudFunction を大量に叩いてみる"><a href="#%E8%B2%A0%E8%8D%B7%E3%83%86%E3%82%B9%E3%83%88%E3%82%92%E5%AE%9F%E8%A3%85%E3%81%99%E3%82%8B%E3%83%95%E3%82%A7%E3%83%BC%E3%82%BA%E3%81%A7+CloudFunction+%E3%82%92%E5%A4%A7%E9%87%8F%E3%81%AB%E5%8F%A9%E3%81%84%E3%81%A6%E3%81%BF%E3%82%8B">負荷テストを実装するフェーズで CloudFunction を大量に叩いてみる</a></h2> <p>PlayFab の CloudFunction を実行するにあたり利用した PlayFab の API は <a target="_blank" rel="nofollow noopener" href="https://docs.microsoft.com/en-us/rest/api/playfab/cloudscript/server-side-cloud-script/executefunction?view=playfab-rest"><code>Server-Side Cloud Script - Execute Function</code></a> というものになります。</p> <p>同接 2000 人想定で負荷テストのシナリオを実装することが求められていたため、その通りシンプルに 2000 件同時に <code>Server-Side Cloud Script - Execute Function</code> を実行するシナリオを Gatling で組んでみました。すると、<strong>何回やっても数十件以上は必ずエラーが発生していることが分かりました。</strong></p> <pre><code class="bash"># Gatling で負荷テストを実行した際に 50件失敗している様子 ================================================================================ ---- Global Information -------------------------------------------------------- > request count 2000 (OK=1950 KO=50 ) > min response time 320 (OK=320 KO=354 ) > max response time 14459 (OK=9723 KO=14459 ) > mean response time 998 (OK=934 KO=3485 ) > std deviation 1510 (OK=1304 KO=4310 ) > response time 50th percentile 545 (OK=543 KO=656 ) > response time 75th percentile 1085 (OK=1077 KO=7209 ) > response time 95th percentile 2243 (OK=2029 KO=10210 ) > response time 99th percentile 7947 (OK=7775 KO=14353 ) > mean requests/sec 100 (OK=97.5 KO=2.5 ) ---- Response Time Distribution ------------------------------------------------ > t < 800 ms 1393 ( 70%) > 800 ms < t < 1200 ms 367 ( 18%) > t > 1200 ms 190 ( 10%) > failed 50 ( 3%) ---- Errors -------------------------------------------------------------------- > status.find.is(200), but actually found 400 50 (100.0%) ================================================================================ </code></pre> <p>正直 2000件程度の API アクセスであれば、何の問題もなく負荷テストが通ると考えていたので、この結果には驚きました。<strong>原因は何なのか調べたところ、Azure Function で PlayFab ユーザ認証を行うために利用していた <a target="_blank" rel="nofollow noopener" href="https://docs.microsoft.com/en-us/rest/api/playfab/authentication/authentication/validateentitytoken?view=playfab-rest"><code>Authentication - Validate Entity Token</code></a> で 503 エラーが発生していることが分かりました。</strong></p> <p>少ない API 実行件数で負荷テストを実行する場合は問題ないのですが、<strong>件数が一定数超えたタイミングで 503 エラーが返却されるようになってしまいます。しかし、たまに同じ件数を実行しているはずなのにスムーズに全件 API 実行に成功することもありました。これは何らかのレートリミット等に引っかかっているのかも知れないということで調査したところ、次の事実が判明しました。</strong></p> <h2 id="CloudFunction は FaaS の用途には適さない"><a href="#CloudFunction+%E3%81%AF+FaaS+%E3%81%AE%E7%94%A8%E9%80%94%E3%81%AB%E3%81%AF%E9%81%A9%E3%81%95%E3%81%AA%E3%81%84">CloudFunction は FaaS の用途には適さない</a></h2> <p>どうやら PlayFab 公式フォーラムの <a target="_blank" rel="nofollow noopener" href="https://community.playfab.com/questions/30828/server-api-limitations.html">ある投稿</a> によると、<strong>PlayFab の Server API を呼び出す際は 10秒間に 1000回という制限があるようでした。</strong> そして、この制限を突破するには商用のための契約をした後にインスタンス割当に関する交渉をすることで可能になるかも知れないとのことでした。</p> <blockquote> <p>Servers are rate limited to 1,000 calls per 10 seconds. What jital is highlighting that the per-player rate should be no more than a few times a minute. A server can call at a higher rate, as it is calling for a lot of users, potentially. If you need a higher limit than 1,000 per 10 seconds, you'll want to talk to our sales team about getting on an Enterprise contract so that we can work with you on custom limits. There's an option on the Contact Us form on the main site to message them, if you want to go that route.</p> </blockquote> <p>つまり、<strong>普通に PlayFab を利用している限りはプランをアップグレードしようと制限に引っかかるということが分かりました。</strong> また、<a target="_blank" rel="nofollow noopener" href="https://community.playfab.com/comments/48674/view.html">今年 1月に投稿された内容</a> を見るに 10秒以内に 5000以上のユーザーがログイン/登録できたとあり、もう API の 10秒間に 1000回呼び出し制限は撤廃されたのかを聞いているユーザがいたのですが、まだ撤廃されていないと返信されていたので偶然だったようでした。</p> <p>ちなみに私も上記が気になったので、<strong>セッションごとにレートリミットのかかり方が変わるのか検証するために異なるユーザ情報を用いてリクエスト 2000件を並列に実行してみましたが、503 エラーは変わらず返却され続けていたので、少なくとも私の手元の環境では効果はなさそうでした。</strong></p> <blockquote> <p>No, the rate limits on the Client and Server API calls has not changed. However, the rate limits are currently enforced on a per-server basis. And since the service runs a great many servers for load balancing, it is possible to exceed those limits from time to time.</p> </blockquote> <p>原因の調査中 PlayFab は EC2 の us-west-2 リージョンでリクエストを受けていそうなことが分かったのですが、そのアクセス先のインスタンスがロードバランサによって分散されているため、レートリミットの制限がインスタンス先により、時と場合によって制限されるかどうかが決まってくるのかもしれないとのことでした。</p> <p>以上のことから、<strong>PlayFab の CloudFunction については Azure Function や AWS Lambda のような FaaS のような用途には使わず、あくまでもアプリケーションで補助的に利用するための独自スクリプトを動かす程度に留めて利用するのが正解なように感じました。</strong></p> <p><strong>PlayFab のユーザ認証情報である SessionTicket や EntityToken を利用することで、認証周りの実装部分を省くことが出来るかも知れないと思い期待していたのですが、それは別の BaaS を使うか IaaS で自前で作るのが良さそうでした。</strong></p> <h1 id="おわりに"><a href="#%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB">おわりに</a></h1> <p>API の 10秒間に 1000回呼び出し制限については明示的にドキュメントに記載があるわけでもなかったため、気づくことが出来ずプロジェクト終盤で気づくという事故が起きてしまったのですが、私と似たような境遇に陥る人が少しでも減るようにと記事を書いてみました。</p> <p>とはいえ、少し調べれば出てくるような制限だったので純粋に調査不足だったなあと反省しました。。CloudFunction はとても便利ですが、利用する際は API の呼び出し制限等用法には十分お気をつけてご利用くださいませ。</p> <p>PlayFab が便利な BaaS であることに疑いの余地は無いので今後も利用すると思いますが、知見を貯めつつ効果的に使えるよう勉強していきたいと考えております。また何か知見を得たら随時ブログ記事に書き溜めていきたいと思います。</p> <h1 id="参考リンク"><a href="#%E5%8F%82%E8%80%83%E3%83%AA%E3%83%B3%E3%82%AF">参考リンク</a></h1> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://docs.microsoft.com/ja-jp/gaming/playfab/features/automation/cloudscript-af/">Azure 関数を使用した PlayFab CloudScript - PlayFab | Microsoft Docs</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://docs.microsoft.com/en-us/rest/api/playfab/cloudscript/server-side-cloud-script/executefunction?view=playfab-rest">Server-Side Cloud Script - Execute Function (PlayFab CloudScript) | Microsoft Docs</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://docs.microsoft.com/en-us/rest/api/playfab/authentication/authentication/validateentitytoken?view=playfab-rest">Authentication - Validate Entity Token (PlayFab Authentication) | Microsoft Docs</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://community.playfab.com/questions/30828/server-api-limitations.html">Server API limitations - Playfab Community</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://community.playfab.com/questions/30828/server-api-limitations.html?childToView=48674#comment-48674">Server API limitations - Playfab Community</a></li> </ul> nikaera tag:crieit.net,2005:PublicArticle/15035 2019-05-28T19:37:44+09:00 2019-05-28T19:37:44+09:00 https://crieit.net/posts/PlayFab-Unity-PlayFab 【PlayFab入門】UnityでPlayFabサーバーとデータの送受信 <p>2019/4/28</p> <p>おはようございます。</p> <p>「1日3食、夜は寝る」は誰が決めたんだろうと思っている、大学生ゲーム制作者の村人Uです。</p> <p> </p> <p>今回は、<strong>Azure</strong>が運営する<strong>PlayFab</strong>というサービスを利用して、<strong>サーバーでデータ管理</strong>をする方法について書きます。</p> <p>説明は<strong>Unity</strong>を使用したものになりますが、使い方はUnity以外でもあまり変わりません。</p> <p> </p> <p><strong>PlayFab</strong>については、別の記事に書きましたので今回は実際の使い方について触れていきます。</p> <p> </p> <p><a target="_blank" rel="nofollow noopener" href="https://questgames.hatenablog.com/entry/2019/04/07/122135" target="_blank" rel="noopener">無料で使えるmBaaSのPlayFabをプレイヤーデータ管理に使ってみた by 大学生ゲーム制作者 - QUEST LAB</a></p> <p> </p> <p> </p> <h1 id="サーバーにログインする"><a href="#%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AB%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%99%E3%82%8B">サーバーにログインする</a></h1> <p> <br /> <strong>PlayFab</strong>では、ユーザーがサーバーに必ず<strong>ログイン</strong>する必要があります。</p> <p>といっても、ユーザーにIDとパスワードを決めてもらう必要はなく、<strong>こちらで勝手に決めたIDでログイン</strong>ができます。</p> <pre><code class="cs">//using PlayFab.ClientModels;をスクリプトの最初に記述して下さい public static void LoginPlayFab(Action resultCallback = null) { var request = new LoginWithCustomIDRequest { CustomId = SystemInfo.deviceUniqueIdentifier, CreateAccount = true}; PlayFabClientAPI.LoginWithCustomID(request, result => OnLoginSuccess(result, resultCallback), OnLoginFailure); } </code></pre> <p>上記の例で、<strong>LoginPlayFab</strong>関数を使う事でPlayFabにログインする事ができます。</p> <p>なかなかヘンテコな書き方があって、見慣れないかもしれませんがPlayFabを使う場合は今後もこんな感じで書いていきます。</p> <pre><code class="cs"> var request = new LoginWithCustomIDRequest { CustomId = SystemInfo.deviceUniqueIdentifier, CreateAccount = true}; </code></pre> <p>この部分では、ログインするための<strong>リクエスト文</strong>を作成しています。</p> <p>この中の<strong>CustomId</strong>がユーザーを識別するIDで、<strong>ユーザー毎にユニークな(唯一の)ID</strong>を指定する必要があります。</p> <p>今回の場合は、<strong>SystemInfo.deviceUniqueIdentifier という端末ごとに違うID</strong>を取得して利用しています。</p> <p>このように、<strong>CustomId</strong>や<strong>CreateAccount</strong>のようなPlayFabさんが事前に決めた変数名に値を代入する事でPlayFabのサーバーにどんな指示を送るか決める事が出来ます。</p> <p>注)これらは、<strong>using PlayFab.ClientModels;</strong> がスクリプトの最初に記述されている必要があります。</p> <h1 id="サーバーにデータを送信する"><a href="#%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AB%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E9%80%81%E4%BF%A1%E3%81%99%E3%82%8B">サーバーにデータを送信する</a></h1> <p>サーバーへのログインに成功したら、<strong>データを送信</strong>する事が出来るようになります。</p> <pre><code class="cs">public static void SendUserData(){ PlayFabClientAPI.UpdateUserData( new UpdateUserDataRequest(){ Data = new Dictionary<string, string>() { {"Coin", "10"} <span>}</span><span>}</span>, result => Debug.Log("Successfully updated user data"), error => { Debug.Log("Got error setting user data"); Debug.Log(error.GenerateErrorReport()); }); } </code></pre> <p>これまたヘンテコなのですが、↑では<strong>PlayFabClientAPI.UpdateUserData</strong>という一つの関数しか使っていません。</p> <p>このように関数を使う事によって、今回の場合サーバーに、「<strong>キーが"Coin"、値が"10"</strong>」のデータを送信する事が出来ます。</p> <p>ちなみに、この関数は↓のような引数を取っています。</p> <pre><code class="cs">PlayFabClientAPI.UpdateUserData(UpdateUserDataRequest request , Action<UpdateUserDataResult> resultCallback, Action<PlayFabError> errorCallback); </code></pre> <p>今回の場合、この中の<strong>request</strong>の部分が</p> <pre><code class="cs">new UpdateUserDataRequest(){ Data = new Dictionary<string, string>() { {"Coin", "10"} <span>}</span><span>}</span> </code></pre> <p>に当たり、<strong>resultCallback</strong>が</p> <pre><code class="cs"> result => Debug.Log("Successfully updated user data") </code></pre> <p>に当たり、<strong>errorCallback</strong>が</p> <pre><code class="cs">error => { Debug.Log("Got error setting user data"); Debug.Log(error.GenerateErrorReport()); } </code></pre> <p>に当たります。</p> <h1 id="サーバーからデータを受け取る"><a href="#%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%8B%E3%82%89%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E5%8F%97%E3%81%91%E5%8F%96%E3%82%8B">サーバーからデータを受け取る</a></h1> <p>サーバーへの送信とほぼ同じ感覚で出来ます。 </p> <pre><code class="cs">public static void GetUserData(){ PlayFabClientAPI.GetUserData( new GetUserDataRequest() { PlayFabId = PlayerData.Instance.MyPlayFabID, Keys = null }, OnGetUserData }, (error) => { Debug.Log("Got error retrieving user data:"); Debug.Log(error.GenerateErrorReport()); }); } public static void OnGetUserData(GetUserDataResult result){ if (result.Data == null || !result.Data.ContainsKey("Coin")) Debug.Log("No Coin"); else result => Debug.Log(result.Data["Coin"].Value); } </code></pre> <p>↑の例では、PlayFabサーバーから<strong>ユーザーデータ</strong>を取得し<strong>「Coin」というキーを持つデータの値</strong>を取り出しています。</p> <p>ここでもサーバーにデータを送信する時と似た感じで、次のような関数を使っています。</p> <pre><code class="cs">PlayFabClientAPI.GetUserData(GetUserDataRequest request , Action<GetUserDataResult> resultCallback, Action<PlayFabError> errorCallback </code></pre> <p>送信時と大きく違うのは、この関数の引数の内<strong>resultCallback</strong>に当たる部分が<strong>OnGetUserData</strong>になっているという事です。</p> <p>見てもらえれば分かるように、<strong>resultCallback</strong>の型は <strong>Action</strong> になっています。</p> <p>この <strong>Action</strong> という型は、「<strong>GetUserDataResult</strong>を引数にとる関数」を表します。</p> <p>なので、今回の場合<strong>OnGetUserData</strong>という<strong>GetUserDataResultを引数に持つ関数</strong>を指定する事が出来ます。</p> <p>そしてこの<strong>resultCallback</strong>という引数ですが、これは<strong>PlayFabからデータの取得が成功した時に呼び出される関数</strong>になります。</p> <p>つまり、今回の場合<strong>データの取得が完了したらOnGetUserDataという関数が呼び出される</strong>ことになります。</p> <p>またその時に引数に渡される<strong>GetUserDataResult</strong>に様々な情報が格納されています。</p> <p>実際には、上記のように<strong>result.Data</strong>にデータが<strong>Dictionary</strong>の形で格納されているのでそれを利用する事が多いと思います。</p> <h1 id="もっと知りたい"><a href="#%E3%82%82%E3%81%A3%E3%81%A8%E7%9F%A5%E3%82%8A%E3%81%9F%E3%81%84">もっと知りたい</a></h1> <p>今回書いたのは、正確には<strong>PlayFabの中のごく一部</strong>の機能である<strong>PlayerData</strong>についてです。</p> <p>PlayFabには<strong>データの管理</strong>の方法だけでも</p> <ul> <li>Player Data</li> <li>Read Only Data</li> <li>Internal Data</li> <li>Group Data</li> <li>Shared Group Data</li> </ul> <p>など、様々なデータの扱い方があります。</p> <p>複雑に感じるかもしれませんが、逆に言うとそれだけ<strong>機能が充実</strong>しているという事でもあると思います。</p> <p>詳しい説明は↓の<strong>PlayFabのドキュメント</strong>に載っています。</p> <p>現時点(2019/4/28)で全て<strong>英語</strong>ですが、<strong>グーグル翻訳</strong>を使えば割と読めちゃいます。</p> <p>最近のグーグル翻訳は凄いですね。</p> <p><a target="_blank" rel="nofollow noopener" href="https://docs.microsoft.com/ja-jp/gaming/playfab/?#pivot=documentation&panel=playfab" target="_blank" rel="noopener">Azure PlayFab のドキュメント - PlayFab | Microsoft Learn</a></p> QuestGames tag:crieit.net,2005:PublicArticle/15002 2019-05-20T17:56:38+09:00 2019-05-20T17:56:38+09:00 https://crieit.net/posts/mBaaS-PlayFab-by 無料で使えるmBaaSのPlayFabをプレイヤーデータ管理に使ってみた by 大学生ゲーム制作者 <p>ご存知の方は少ないかもしれませんが、サーバーの知識いらずで<strong>サーバーでデータ管理</strong>できるサービスがあります。</p> <p> </p> <p>そのサービスは<strong>mBaaS</strong>などと呼ばれています。</p> <p>特に<strong>Unity</strong>を使う個人開発者は、<strong>Nifty Cloud Mobile Backend (NCMB)</strong> を使う人が多いイメージです。</p> <p> </p> <p>しかしどうやら、同様の機能をもつ<strong>PlayFab</strong>というサービスもあるようです。</p> <p>さらに最近、どんどん便利になってきているらしい。</p> <p>2018年1月に<strong>Microsoftに買収された</strong>とか。</p> <p> </p> <p>今回は、そんなPlayFabを実際に使ってみた<strong>感想</strong>と<strong>まとめ</strong>を書いてみようと思います。<br />  </p> <h1 id="PlayFabで出来る事"><a href="#PlayFab%E3%81%A7%E5%87%BA%E6%9D%A5%E3%82%8B%E4%BA%8B">PlayFabで出来る事</a></h1> <p>そもそもPlayFabで何が出来るかというと、</p> <ol> <li>サーバーで<strong>データ管理</strong></li> <li>ログインなど<strong>プレイヤー管理</strong></li> <li><strong>フレンド</strong>機能</li> <li><strong>SNS</strong>連携</li> <li><strong>グループ、ギルド</strong>機能</li> <li><strong>アイテム</strong>管理</li> <li><strong>課金</strong>機能</li> <li><strong>サーバーサイドのスクリプト</strong>も実装可能</li> <li><strong>統計</strong>をカスタマイズして見れる</li> </ol> <p>こんな感じの事が出来ます。<br /> これらの機能を<strong>いい感じに</strong>管理してくれているのが、<strong>PlayFab</strong>の特徴です。</p> <p>今回僕が使ったのは、1 ~ 3の機能だけですが十分便利でした。</p> <p>また、<strong>現在はプレ版</strong>ですが今後のアップデートで<strong>リアルタイム通信</strong>関係の機能も追加されるようです。</p> <p> </p> <h1 id="PlayFabの利用例"><a href="#PlayFab%E3%81%AE%E5%88%A9%E7%94%A8%E4%BE%8B">PlayFabの利用例</a></h1> <p><a target="_blank" rel="nofollow noopener" href="https://playfab.com/games/">https://playfab.com/games/</a>のページに載っていますが、</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://www.minecraft.net/ja-jp/">MineCraft</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://ubisoft.co.jp/r6s/">Rainbow Six Siege</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://www.angrybirds.com/games/angry-birds-seasons/">Angry Birds Seasons</a></li> </ul> <p>など、<strong>有名なゲーム</strong>の利用例があるようです。</p> <p>世界的に有名なゲームの名前があるので、<strong>信用できるサービス</strong>と言えます。</p> <p>また、PlayFabを調べていると2015年の記事も見つかるので<strong>海外では割と長い事使われていそう</strong>です。</p> <p> </p> <h1 id="PlayFabの利用価格"><a href="#PlayFab%E3%81%AE%E5%88%A9%E7%94%A8%E4%BE%A1%E6%A0%BC">PlayFabの利用価格</a></h1> <p><a target="_blank" rel="nofollow noopener" href="https://playfab.com/pricing/">https://playfab.com/pricing/</a>のページに載っています。</p> <p>無料枠では、</p> <ul> <li><strong>一部の機能</strong>が利用できない</li> <li><strong>MAU</strong>(月のアクセスユーザー数)の<strong>制限なし</strong></li> <li><strong>データ容量、APIリクエスト回数制限</strong>に関する<strong>記述はなさそう</strong></li> </ul> <p> </p> <p>一部の機能が利用できない事についてですが、<strong>有料枠の機能は僕が見ても何に使う機能か分からない</strong>レベルの物が多かったです。</p> <p>この記事で書いてきた機能については<strong>おそらく全て無料で利用可能</strong>です。</p> <p>正直、<strong>無料枠で十分</strong>だと思っています。</p> <p>(まだ実際に運用している訳ではないので、断言はできません)</p> <p> </p> <h1 id="その他サービスとの比較"><a href="#%E3%81%9D%E3%81%AE%E4%BB%96%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%A8%E3%81%AE%E6%AF%94%E8%BC%83">その他サービスとの比較</a></h1> <p><strong>その他サービス</strong>と言っても、僕は<strong>NCMB</strong>しか使ったことないのですが...</p> <p><strong>PlayFab</strong>を使う<strong>メリット</strong>は、</p> <ul> <li>ユーザー管理が<strong>楽</strong>かつ<strong>セキュア</strong>(既に必要な機能が揃っている)</li> <li><strong>ゲームに特化</strong>している</li> <li>有名な利用例もあり、<strong>信用できる</strong></li> </ul> <p><strong>デメリット</strong>は、</p> <ul> <li>ドキュメントが<strong>英語しかない</strong></li> <li>使い方が<strong>やや複雑</strong>(導入コストが高い)</li> <li>ゲーム特化な分、<strong>自由度が低い</strong></li> </ul> <p> </p> <p><strong>NCMB</strong>などの場合、ログイン機能やフレンド機能だけでも<strong>結構大変</strong>です。</p> <p>まして、<strong>アイテム交換</strong>などの機能を作ろうと思うと<strong>骨が折れます</strong>。</p> <p><strong>PlayFab</strong>ではその辺の事は既に用意されているので、<strong>メソッドを使うだけ</strong>で便利です。</p> <p> </p> <p>にも関わらず<strong>日本でPlayFabはあまり浸透していません</strong>。</p> <p>おそらく一番の原因は、<strong>日本語のドキュメントがない</strong>事です。</p> <p>僕も調べていて、導入部分だけの記事くらいしか見つかりませんでした。</p> <p> </p> <p>しかし、<strong>Microsoft</strong>がつい最近<strong>新しいドキュメント</strong>を公開していて、それを見ると<strong>日本語に対応してくれそうな雰囲気</strong>を出しています。(言語で日本語が選択できる)</p> <p>今後、期待できるかもしれません。</p> <p><a target="_blank" rel="nofollow noopener" href="https://docs.microsoft.com/ja-jp/gaming/playfab/#pivot=documentation&panel=playfab">PlayFabの新しいドキュメントはこちら</a></p> <p> </p> <p>また<strong>PlayFab</strong>は仕組みを<strong>理解するまで少し時間がかかります</strong>。</p> <p>機能が設計されている為、<strong>NCMB</strong>ほどユーザーの<strong>自由なデータ管理も出来ません</strong>。</p> <p>融通が利かなくて困るケースも出てくるかと思います。</p> <p> </p> <h1 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h1> <p>現状をまとめると、<strong>英語がよめるなら機能が豊富なPlayFabはおすすめ</strong>。</p> <p>厳しければ、<strong>シンプルイズベストのNCMB</strong>や<strong>応用性の高いFirebase</strong>などを使った方が良いと思います。</p> <p> </p> <p>また、まだ機能が完全に完成していない部分もあって<strong>今後の進展</strong>に期待といった感じです。</p> <p><strong>日本語ドキュメントが公開された辺りから、使い始めてみる</strong>と良いのではないでしょうか。</p> <p>もしかしたら僕がPlayFabの記事を書くかもしれませんが。</p> <p>その時はよしなに。ではでは。</p> <p> </p> <p> </p> QuestGames