ニフクラmBaaSお役立ちブログ

スマホアプリ開発にニフクラmBaaS。アプリ開発に役立つ情報をおとどけ!

Unityゲームに全世界スコアランキングを速攻で実装する

こんにちは。ニフティクラウドmobile backend エヴァンジェリストの一條です。 今月20日から、全世界同時の一大ゲーム開発イベント、「Global Game Jam 2017」が開催されます!

globalgamejam.org

ニフティクラウド mobile backend(以下NCMB)では、今年も日本会場への「ツール&ライセンス協力」として参戦しています。ニフティクラウドのアカウントを取得してもらえれば、すぐにもGGJのゲームに適用可能です。

Global Game Jam JAPAN http://ggj.igda.jp/

せっかくライセンス協力をしているので、NCMB for Unity SDKを使ってGGJ向けの導入スクリプトを作りました。なるべく手間をかけずに面白い機能が導入できることを目標にした、

全世界成績ランキングを速攻で実装する

スクリプトです!

github.com

Unityでのアプリ開発経験がある方なら、NCMBが初めてであっても30分かからないと思います。

今回はNCMBでよく紹介している「ログイン」「ログアウト」などを 省略しまして、「データストア」のみで実装します。 ゲームを遊ぶ人にログインをしてもらう必要はありません。

注意

NCMB SDK for UnityはiOS/Android/Windows/MacOSで動作します。

とくにWeb GLはGGJで試しそうな人が多いのですが、残念ながら動作しません。今回のスクリプトでは、Build SettingをWebGLにした場合、ワーニングを出しつつ空のデータを返すようにしています。ワーニングは出ますがゲームは止まらないので、WebGL版は「ランキング無し」として公開できるようにしています。

手順

まずはクイックスタートを参考に、SDKの導入まで行ってください(2~30分程度)

イントロダクション (Unity) : クイックスタート | ニフティクラウド mobile backend

上記の「APIキーの設定とSDKの初期化」までやっていただき、「サンプルコードの実行」は任意にて。

準備ができたら、下記から最新リリースをダウンロードしていただき、「QuickRanking.unityasset」を開いてUnityプロジェクトに導入します。

github.com

続いて、あなたのゲームで最初に読み込むシーンに空のGameObjectを作成し、QuickRanking.csを貼り付けてください。 GameObjectの名前も、判別しやすいように「QuickRanking」としてください。

最初に読み込むシーンの中に、チュートリアルで説明している「NCMBManager」「NCMBSettings」、そして「QuickRaning」がいる状態になれば準備完了です。

「QuickRaning」を選択すると、インスペクターには2つのオプションが設定できます。 "Ranking Class Name"はNCMBのデータストア内に保存する際、何のクラス名(テーブル)で保存するかを指定します。 "Count"は成績順にいくつまでデータを取得するか指定します。

10位までのランキングであれば、これで準備完了です。

使い方

まず、ゲーム中の任意のタイミングでプレイヤーのスコアをNCMBの「データストア」というデータベースへ保存します。保存用の関数は以下です。

QuickRanking.SaveRanking(string name, int score, UnityAction callback)

callbackは保存し終わった後に実行するメソッドを登録しておくデリゲートです。 ネットワークに接続するので、ある程度待ち時間があります。保存が完了したタイミングで何かをしたい場合は、callbackに実行したい関数を指定して下さい。

なお、QuickRanking.csはシングルトンに作られているので、スクリプトへの参照を取得しなくても

QuickRanking.SaveRanking("hoge", 224);

と書けば実行できます。

次に、スコア表示画面などで現在のスコアを取得します。

QuickRanking.FetchRanking(UnityAction callback)

この関数には戻り値がありません。ランキングデータをNCMBから取得してきて、QuickRankingのクラス内部に保存します。 保存が完了するとIsRankingDataValidのフラグがtrueになります。この処理もネットワークに接続するため、値の取得には多少のタイムラグがあります。 SaveRankingの処理のように、callbackへデータを取得する関数を登録してもよいでしょう。

QuickRanking.GetRankingDataByText()

ランキングを簡易に取得する関数です。戻り値がstringです。ランキング形式に成形されたstringデータが取得できるため、このままuGUIのText.textに流し込んでやればランキング画面が完成します。 ただ、こちらで取得できるランキングはフォントによってタブ区切りがガタガタになってしまいます....。 ある程度作りこんだuGUIへ綺麗に配置したい場合は、GetRanking()を使ってください。順位、名前、成績をバラで保存してあるクラスRankingDataのリストが返ってきますので、適宜利用して下さい。

サンプル

QuickRankingのパッケージには、どのようにランキング用のデータを保存・取得するかが分かりやすいサンプルゲームがあります。 SampleGame.sceneを開いてみてください。

こちらが「タップした回数を全世界で競う」という

神ゲー

です。「Tap!!」ボタンをひたすらタップして、タップして、タップしたやつが強者です。

Nameに名前を入れて、「Tap!!」ボタンをタップします。私のタップ力は21回でした。

「Save Player Score」ボタンを押すと、その名の通りプレイヤーの成績がNCMBへアップロードされます。 しばらくして通信に成功すると、「Show Ranking」ボタンが押せるようになります。

「Show Ranking」を押すとこちらの画面になります。 自分のスコアは、赤く着色されます。いまのところ私が全世界で一位のようです。みんなかかってこい。

「Total Player Count」は、これまで何人がこのランキングに登録したかをカウントしたものです。 せっかくGGJで作ったゲーム、世界でいったい何人の人が遊んでくれたか知りたいですよね?自分のゲームを起動すればすぐ確認できます。 (今回の実装では点数ゼロの人もカウントされるため、ランキングの数と食い違ってます、すみません)

ゲーム提出時の諸注意

さて、グローバルゲームジャムは「作ったゲームをGGJ公式サイトにアップロードする」「一緒にソースコードをCCライセンスでアップロードする」という掟があります。 ソースにunityのシーンファイルが含まれる場合は、

APIキー(App KeyとClient Key)をNCMBSettingsゲームオブジェクト

から必ず取り除いてください!

APIキーが流出すると、そのゲームのデータを誰でも操作できるようになってしまいます。

また、NCMB for Unity SDKはライセンスをApache License 2.0としているため、GGJが求めるCCライセンスと合致しません。 そのため、Unityプロジェクトファイルの以下フォルダとファイルを削除してください。

・Assets/NCMB 全て ・Assets/Plugins/ に含まれる下記のファイル

まとめ

このスクリプトを使えば、あなたの作ったゲームに速攻で全世界ランキング機能を実装できます。 GGJ用に本記事を執筆しましたが、もちろんGGJに関係なく、今あなたが作っているゲームアプリに適用していただいてもかまいません。

ただしサンプルゲームは私の考えた神ゲーなので、このままアプリストアにアップするのは勘弁してくださいね。

本記事では詳細は省きますが、データは管理画面から閲覧することができます。(クリックで拡大)

もちろん、GGJにはランキング機能だけ使ってくれということはありません。

ひとりぼっち惑星」のようなメッセージング機能を作ってもいいですし、プレイヤーがステージを作る系統のゲームを開発して、 そのデータの交換のためにNCMBを使うのもありです。時間の許す限り、いろいろ触ってみてくださいね。

それではグローバルゲームジャム、みなさん頑張ってください!