この連休でランキングの機能を実装しました。重複しますが一応、ランキングについて簡単に書いておきましょう。
スマホのゲームではスコアランキングを表示できるものがあります。自分のスコアランキングではなく、そのゲームのやっている人たち全員のランキングです。外部の仕組みを頼らないなら、例えばお互いの間で通信して全てのアプリが全てのスコアを共有できるようにすれば可能です。でも多分そういうことはあまりしないでしょう(カンです)。実際にはmBaaS(mobile backend as a Service)を利用したりするようです。ニフクラの説明では「スマートフォンアプリでよく利用される汎用的な機能をクラウドから提供するサービス」となっています。今回のようにデータの共有などをしたいときに使える仕組みがあるのです。制限はありますが、無料。個人開発のアプリなら十分みたいです。具体的にはアプリのゲームでユーザーが出したスコアを外部のその仕組みへ送り、その大量のデータの中の上位10データを各アプリが受け取れるようになるのです。調べるとニフクラのNCMB、GoogleのFirebaseといったものが見つかります。
最初はニフクラのNCMBを試しましたが、うまくいきませんでした。次の記事の通りです。
www.omoshiro-suugaku.com
「簡単に××でランキングを実装」のような記事を載せている皆さんも結構いらっしゃって、大変参考になったのですが……。あっちに躓きこっちに引っかかり、と苦労しました。トラブっている人がずいぶんいるらしいことはやはりサイトを検索すると分かります。割とスムーズに(それでも半日)スコアを登録して上位20人を取得できるようになったのですが、久しぶりに実機(スマホ)でテストしてみようかな、と思って試してみたらエラーが出るのです。あれこれ手を尽くしましたがダメでした。
次にFirebaseです。こちらはスコアの登録自体で躓いてしまいました。公式サイトを始め、あちこち調べましたがやはりうまくいかず、疲れて諦めました。
こうした仕組みは今はいくつもあるようです。最後に試したのはMicrosoftのPlayfabです。結果、これはうまくいきました。スコアの登録、上位10人のデータの取得、実機での実行も大丈夫でした。もちろん公式サイトもありますし、解説くださっている人もずいぶんいます。助かりました。ありがとうございます!
PlayFab | Microsoft Azure
PlayFabマスターへの道|PlayFabを学習したいあなたへ
Azure PlayFabのとても便利なランキング機能を使ってみた&ついでにランキング報酬も配ってみた - Qiita
【PlayFab】Leaderboardを使ってランキングを実装する【Unity】 | Makihiroのdevlog
【Unity】【PlayFab】環境入れたその次に。実際の利用でのログインとユーザーデータ更新 - Qiita
最後にひとつ。NCMBでは次々にスコアを登録し、その中から上位10データを取得、みたいにやっていました。Playfabでは「このユーザの最高得点は××点、あのユーザの最高得点は○○点、……」というように管理し、それらの中の上位10データを取得、としています。どちらも詳しい設定などはあまり見ていないので、もちろん柔軟にいろいろできるのだろうとは思うんですが……。ちょっと違うけれどどちらにしてもまあハイスコアランキングは手に入ります。しかしそうするとPlayfabではユーザごとのID(ユーザ別に与えられる異なる数値や文字列)が必要です。自前で、つまりぼくがアプリ内でIDを生成しなければなりません。これにはさっきの記事も役立ちます。
【Unity】【PlayFab】環境入れたその次に。実際の利用でのログインとユーザーデータ更新 - Qiita
あるいは別の方法が。ぼくはC#( + Unity)のGUID(Globally Unique Identifier)の生成の機能を使いました。GUIDとは世界で唯一の識別子です。何桁かの数値で、他のユーザとは異なっていることが(一応)保証されています。「一応」と書いたのは、凄まじい偶然で同じ値にならないとも限らないと思うからです。具体的には
string getGuid(){ var guid = System.Guid.NewGuid(); return guid.ToString("N");//ハイフンなし }
で得られます。これを使いました。