リーダーボードを組み込んでみる・・・「ゲームアプリをソーシャル化するAppSteroid」第4回 | GameBusiness.jp

リーダーボードを組み込んでみる・・・「ゲームアプリをソーシャル化するAppSteroid」第4回

ゲーム開発 ミドルウェア

リーダーボードを組み込んでみる・・・「ゲームアプリをソーシャル化するAppSteroid」第4回
  • リーダーボードを組み込んでみる・・・「ゲームアプリをソーシャル化するAppSteroid」第4回
  • リーダーボードを組み込んでみる・・・「ゲームアプリをソーシャル化するAppSteroid」第4回
  • リーダーボードを組み込んでみる・・・「ゲームアプリをソーシャル化するAppSteroid」第4回
  • リーダーボードを組み込んでみる・・・「ゲームアプリをソーシャル化するAppSteroid」第4回
  • リーダーボードを組み込んでみる・・・「ゲームアプリをソーシャル化するAppSteroid」第4回
  • リーダーボードを組み込んでみる・・・「ゲームアプリをソーシャル化するAppSteroid」第4回
  • リーダーボードを組み込んでみる・・・「ゲームアプリをソーシャル化するAppSteroid」第4回
  • リーダーボードを組み込んでみる・・・「ゲームアプリをソーシャル化するAppSteroid」第4回
前回、さらっと1.0の説明をしましたが、1.0よりリーダーボードがマルチリーダーボード対応となり、一つのゲームで複数のスコアを管理できるようになりました。

ゲームによっては、単純なスコアのほかにレベルやクリアスピード、クリアマップ数、所持アイテム数など複数のリーダーボードを同時に持つことが可能となっています。

今回は、最初のステップとして単純なスコア表示のみに特化したリーダーボード機能を組み込んでみたいと思いますが、その前に、今回使用するサンプルゲーム「足し算Crash!」について簡単にご紹介します。

ルールは簡単で、左上に出る数字(以下の画面では「20」)になるように、下に並んだ数字を2枚選択するという内容で、正解の場合、2枚の数字が消えていきます。



時間内に全て消すことができるとステージクリアです。ステージをクリアしたことで得られる「Stage Bonus」、タイムリミット前の残り時間に応じて得られる「Time Bonus」が表示され、2つを足した「Total」ポイントがステージクリアのたびに加算されていきます。クリアすると以下のような画面となります。



ゲーム終了後、全ステージの累計ポイントが最終的なスコアということになる、ひたすら足し算を積み重ねていくシンプルなパズルゲームです。

今回、このサンプルゲームにリーダーボード機能を追加し、他のプレイヤーとスコアを競うゲームに仕立てます。

サンプルゲーム「足し算Crash!」のプロジェクトデータは以下からダウンロードできますのでご参照下さい。
https://github.com/sinfonia2015/AdditionCrash
(今回の説明までの対応が組み込まれた状態です)

<Webコンソールでリーダーボード作成>

最初に、Webコンソール画面からリーダーボードを作成します。左メニューから「リーダーボード」画面を開き、右上の「新規リーダーボードを作成」をクリックしてください。



「リーダーボードの新規作成」画面が表示されますので順に入力していきます。



・名前・・・日本語でも大丈夫です。
・説明・・・上の例では特に入れていませんが、必要に応じて記述してください。(例:獲得スコア順のリーダーボードです)
・順位付けに使用されるスコア・・・このゲームの場合は、もっとも獲得ポイント数が高い順に表示したいので「ベストスコア」を選択します。
・表示形式・・・(12,345)のように数値を表示する方法と、(12:30)のように時間を表示する方法が選べます。クリア時間の速さを競うようなゲームの場合は後者を選択してください。今回は前者を指定します。
・タイムゾーン・・・メインとなるプレイ地域のタイムゾーンを設定してください。
・週の開始日付・・・今回は日曜日からに設定します。ここは自由に設定が可能です。

最後に下部の「作成」ボタンを押して完了です。

作成したリーダーボードがリストされますので、「ID」をコピーしておいてください。後からソース内に記述します。



<ゲームの流れの整理>

次にソースにリーダーボードについての記述をしていきます。
ゲームの流れとしては以下のようにしたいと思います。

1、スタート画面で自動ログイン(リーダーボードの利用にはログインが必要)
2、「START」ボタンからプレイ画面へ遷移
3、プレイ終了後、自動的に累計ポイント=最終スコアをリーダーボードに送信
4、完了画面の「Leaderboard」ボタンを押すとリーダーボードが表示される

<自動ログインのための修正>

スタート画面「Assets > Scenes > start.unity」ですが、第二回解説の内容から少し変更します。
第二回解説ではテスト目的だったこともあり、「Community」ボタンを押すことでログインからフォーラム表示までを一括して行っていましたが、リーダーボードの利用にはログインが前提になりますので、「Community」ボタンを押さなくてもログインまでは自動的に行わせたいということになります。ということで、「Assets > Scripts」内の「Login.cs」を開き、以下のように修正します。

using UnityEngine;
using System.Collections;
using Fresvii.AppSteroid;
using Fresvii.AppSteroid.Models;
using System.Collections.Generic;

public class Login : MonoBehaviour {

public void StartCommunity() {
FASGui.ShowGUI(FASGui.Mode.All,"start");
}

IEnumerator Start() {
while (!FAS.Initialized) // 初期化処理完了まで待機
{
yield return 1;
}
// Get signed up users list
List users = FASUser.LoadSignedUpUsers();

// If signed up user already exists
if (users.Count > 0)
{
User user = users[users.Count - 1]; // In this case, we use latest signed up user account.
FASUser.LogIn(user.Id, user.Token, delegate(Error error)
{
if (error == null)
{
Debug.Log("ログイン成功");
}
else
{
Debug.LogError(error.ToString());
}
});
return;
}
// If signed up user does not exist
else
{
FASUser.SignUp(delegate(User user, Error error)
{
if (error == null)
{
FASUser.LogIn(user.Id, user.Token, delegate(Error error2)
{
if (error2 == null)
{
Debug.Log("ログイン成功");
}
else
{
Debug.LogError(error2.ToString()); // Log in error
}
});
}
else
{
Debug.LogError(error.ToString()); // Sign up error
}
});
}
}
}


「StartCommunity()」が「Community」ボタンを押した時に呼ばれる関数ですが、この中のログイン部分の記述をIEnumerator Start()内に移しました。(初期化処理完了まで待機するために、「yield return 1;」の繰り返しを使っているので「IEnumerator Start()」となっています)

「StartCommunity()」内の

FASGui.ShowGUI(FASGui.Mode.All,"start");


の一文ですが、
・すべての機能のメニューを盛り込んだ状態でAppSteroidのGUIを表示する
・GUI画面左上のアイコンをクリックした際はstart画面へ移動、
という指定をしています。

前回の説明時には、

FASGui.ShowGUI(FASGui.Mode.Forum | FASGui.Mode.MyProfile); 


と記述しました。

これは、フォーラムとユーザープロフィールだけをGUI表示させる指定だったのですが、AppSteroid1.0.2からは仕様が変わり、(1)すべてを表示 (2)リーダーボードは非表示、の2パターンからの選択となります。

(1)すべてを表示した場合。(「FASGui.Mode.All」と指定)


(2)リーダーボード非表示の場合
(「FASGui.Mode.Forum | FASGui.Mode.MyProfile | FASGui.Mode.GroupMessage」と指定)



※1.0.2では「FASGui.Mode.All」以外の記述をした場合は自動的にこの表示となります。この指定方法については今後のバージョンアップにより整理していく予定です。

前回はGUI画面左上のアイコン(以下の赤枠部分)をクリックした際の移動先は指定していませんでしたので直前の画面に戻ることとなっていました。今回は「"start”」と指定し、スタート画面に戻るようにしました。



IEnumerator Start()内はログインまでの記述だけにし、GUI表示の指示は記述しません。

これで、スタート画面で自動ログインさせるところまで完了です。


<プレイ画面への組み込み>

次にプレイ画面「Assets > Scenes > play.unity」への組み込みです。

このシーンにもstartシーンと同様に、「FresviiAppSteroid」を置きます。また、念のためにここにもLogin.csをアタッチしたゲームオブジェクト「AS」をプレハブ化して置いておきます。(ゲームを途中から再開した人のためのログイン措置のため)

このプレイ画面の主要なスクリプトは、GameControlerにアタッチされた「GameControler.cs」です。

変数宣言をおこなっている上部のあたりでリーダーボードのIDを変数化しておきます。先ほどWebコンソールでメモしたIDです。(現時点のC#ソースで53行目あたり)

// AppSteroidのリーダーボードID
string leaderboardId = "d935734f4c894c25a61b8aa8d54d32c8";


次に、時間切れとなってゲームが終了した後、累計ポイントを送信します。

以下の部分です。(現時点のソースで272行目)

if(timeBar.GetComponent().fillAmount == 0.0f) {
Debug.Log("時間終了");
StartCoroutine("FaceChange", Faces[4]);
endCancas.GetComponent<Canvas>().enabled = true;
endStageText.GetComponent().text = "Stage Clear " + (stageNumber - 1) ;
endScoreText.GetComponent().text = "累計ポイント " + totalScore;
//リーダーボードにスコアを送信後、リーダーボードIDをセット
FASLeaderboard.ReportScore(leaderboardId, totalScore, delegate(Score score, Error error)
{
if (error == null)
{
Debug.Log("Report score success : " + score.User.Name + " : " + score.Value);
FASGui.SetLeaderboardId(leaderboardId);
}
else
{
Debug.LogError("Report score error : " + error.ToString());
}
});
state = GameState.END;
}


FASLeaderboard.ReportScore()というのがスコア送信のメソッドです。一番目の引数にはリーダーボードID、二番目の引数に送信するスコア(このゲームの場合はtotalScore変数)が入ります。

三番目はスコア送信処理完了時に、Score モデル、エラー情報を引数に呼び出されるデリゲートになっています。{ }内で送信成功時、エラー時の指定ができます。

この指定の中で、送信成功時にGUIで表示するリーダーボードのIDをセットしています。

FASGui.SetLeaderboardId(leaderboardId);


リーダーボードは、本ゲームの成績順位だけでなく、別なゲームのものを表示することも可能ですから、リーダーボード表示の際には改めてリーダーボードIDを指定します。

最後は、ゲーム完了画面から「Leaderboard」ボタンを押してリーダーボードを表示する部分です。



リーダーボードを表示するための関数を作成します。
(現時点のソースで234行目あたり)

// リーダーボードを表示
public void ShowLeaderBoard() {
FASGui.ShowGUI(FASGui.Mode.All, "start", FASGui.Mode.Leaderboards);
}


こちらでもまたFASGui.ShowGUIが出てきました。

引数の一番目ですべてのGUIメニューを表示するように指定、二番目の引数ではアイコンクリックでstart画面に行くよう指定しています。

そして、今回は三番目の引数でFASGui.Mode.Leaderboardsを指定しています。これは、複数のGUIメニューを盛り込む際、立ち上げ時に表示する画面を指定するための引数です。

「Leaderboard」ボタンを押して最初にリーダーボードを出したい場合、このように指定します。(SDKバージョン1.0.1ではすべて「アプリ」メニューが開く仕様になっていましたが、1.0.2よりこの引数で指定できるようアップデートしました)

FASGui.ShowGUIについては、以下のようになります。

public static void ShowGUI(FASGui.Mode modeFlgs)
public static void ShowGUI(string returnSceneName)
public static void ShowGUI(FASGui.Mode modeFlgs, string returnSceneName)
public static void ShowGUI(FASGui.Mode guiMode, FASGui.Mode selectedMode)
public static void ShowGUI(FASGui.Mode guiMode, string returnSceneName, FASGui.Mode selectedMode)

Parameters
Name Type 内容
modeFlgs FASGui.Mode 「All」、もしくは「FASGui.Mode.Forum | FASGui.Mode.MyProfile | FASGui.Mode.GroupMessage」から選択。(改修予定)
returnSceneName string GUI終了時(アプリアイコン押下時)に復帰するシーン名称。復帰するシーンが未設定の場合は、呼び出し元のシーンに戻ります。
selectedMode FASGui.Mode 複数GUIモード表示選択時に最初に表示するタブを設定します。


Example
FASGui.ShowGUI(FASGui.Mode.Forum | FASGui.Mode.MyProfile, "startScene");


話を戻します。リーダーボードを表示する関数(ShowLeaderBoard)を記述したのち、次はこの関数を「Leaderboard」ボタンに割り当てます。(InspectorでOn Clickに追加)



ここまで実装したところでAndroid用にビルドし、試してみます。

ゲーム終了後、「Leaderboard」ボタンをクリックすると、以下のようにリーダーボードが表示されました。成功です。



この成績は正式に公開する際にはクリアにしておきたいので、後ほど削除します。


Webコンソールの「リーダーボード/イベント」メニューで「スコア」を開くと、スコアの一覧が表示されます。右側の「削除」ボタンを押すことで該当のスコアを削除することができます。

リーダーボードの実装について、さらっと一通り説明してきましたが、いかがでしょうか。

次回は、アプリをソーシャル化するコミュニティ機能について説明予定です。
《Fresvii》

関連ニュース

特集

人気ニュースランキングや特集をお届け…メルマガ会員はこちら