tetu式

ゲームと音楽・作曲の自己満足と悩みどころの多いプログラムのブログ。

Unity Google Play Services まとめ

使ってみたらUnity上(というかスクリプト上)での操作は非常に簡単でした。
基本的に呼び出したい場面で呼び出すだけです。


面倒なのはどちらかというとデベロッパー登録の方でしょうね・・・
別の方がやってくれたので自分は大したことはしてなかったのですが。




それではまとめ。

1.Google Play Games plugin for Unity用プラグインをダウンロード。

https://github.com/playgameservices/play-games-plugin-for-unity

ここのサイトに行って右側にあるDownload ZIPをクリックし、ダウンロード。
ちょっと見つけにくい位置にある気がします。

あとたまにサイト見に行くと更新がかかってたりしてます。
2014/02/24 時点での最終更新日は 2014/02/20 でした。

落とし終わったら解凍しておいてくださいね。


2.プロジェクトにインポートする。

Unityを起動します。
Projectタブ内のAssetsフォルダを右クリックし、Import Package→Custom Package...を選択。
さきほど解凍したフォルダの current-build フォルダの中にある GooglePlayGamesPlugin-0.8.01.unitypackage を選択。

0.8.01の部分は更新があるたび数字変わりそうですね。

ちなみに old-builds フォルダには一つ前のバージョンのインポートパッケージが入ってます。

Unity上でImporting packageというダイアログが出るのでImportボタンをクリック。
初期状態で全項目にチェックが入ってると思います。

しばらくするとAssets内に3つほどフォルダが出来あがります。

あとメニューバーの中にGoogle Play Gamesが追加されます。
後で設定することになります。


3.使用前の注意点と準備。

Ⅰ.Unity上の準備

このGoogle Play Games ServicesのプラグインUnityのエディター上では確認ができないという非常にデバッグしにくい内容になっております。
というのもインポートしたフォルダを見てるとAndroidiOSしか対応してないみたいなので・・・

なので確認するために毎回実機やエミュレーターにビルドする必要が出てきます。
手間になりますが仕方ないです。

ビルド自体はいつも通り、UnityのメニューバーにあるFile→Build Settings...からでいいのですが、ビルドに必要な情報がいくらかあります。

今回はAndroidを例にして説明。

Build Settingsを開いたらPlatformからAndroidを選択し、Switch Platformを選択。
データの更新とかが終わったらPlayer Settings...をクリック。

Inspector上にいろいろ出てきます。
まずはPayerSettings内にある Product Name の設定。
ここでつけた名前は後で使うのでちゃんと設定してください。


次にSettings for Android内のOther Settingsを選択。
真ん中あたりにある Bundle Identifer に入力。
後で説明しますがGoogle Play Developer Consoleでアプリにリンクする時に必要な情報になります。
内容例としては com.会社の名前.アプリ名 みたいな感じです。


次にPublishing Settingsを選択。
Googleのマーケット上にアップするためにkeystoreの設定をします。
この辺りはいつの間にやら先輩がやってしまったので手順はよくわかりませんが・・・

http://d.hatena.ne.jp/language_and_engineering/20120310/AndroidMarketReleaseSteps

このサイトの記事が参考になると思います。


Ⅱ.Google Play Developer Console上での設定とかUnityでの追加設定。

続いて通称デベコンの設定。
この辺りも先ほどのブログの記事が参考になります。

ここも初回設定を先輩がしてしまったので微妙な感じですが・・・後設定で出来そうなところでUnity上で設定したものを使う部分があるのでその部分だけ推測。

デベコンにログインしたら画面左にあるゲームのコントローラーをクリック。
2.リンク済みアプリをクリック。
ここにあるアプリの名前とパッケージ名がUnityで設定したProduct NameとBundle Identiferと一致させる必要がありそうです。
ただ、パッケージ名の編集は出来なさそうな感じなので初期設定でやりそうな感じ。
こっちで設定してから同じ名前をUnityのBundle Identiferに入力、が正しい流れかもです。

それとこの画面の下の方にアプリ IDというものがあります。
このIDは先ほど後で使うと言ったUnityメニューバーのGoogle Play Gamesで使います。

今回はAndroid Setup...を選択。
Apprication IDにアプリ IDの内容をそのまま貼り付け。

これで開発しているアプリとGoogle Play Gamesで公開するアプリがリンクされ、プラグインをちゃんと使うことができるようになります。

実績とリーダーボードについては後で説明。

5.テスト をクリック。
テスターを追加 をクリック。
開発環境でテストしたいgmailアカウントを入力し、登録。
これをやっとかないとサインインできないので注意。

4.最低限使いたいもの。

設定が済んだら後はスクリプト上で使いたい機能を使っていきます。


Ⅰ.サインイン

まずはサインイン。これやらないと何もできません。
最初にimportしたスクリプトを使う必要があるので using で必要なものを用意します。

using GooglePlayGames;
using UnityEngine.SocialPlatforms;

そしたら任意の場所でサインインのスクリプトを記述。

PlayGamesPlatform.Activate();
Social.localUser.Authenticate( (bool success) =>
{
	Debug.Log("login: " + success);
	if(success)
	{
		//サインイン成功
	}
	else
	{
		//サインイン失敗
	}
});

あまり見慣れない書き方で戸惑ったのですが、悩んでも仕方ないのでこういうものだと思っておきます。

まずPlayGamesPlatform.Activate()でGooglePlayGamesを使用できる状態にし、Social.localUser.Authenticate( (bool success) )でサインイン。

PlayGamesPlatform.Activate()を通さないと他の機能が使えないのでStart()かAwake()内の最初に書いた方がいいです。

ちなみにAuthenticateは「証明」とか「確証」って意味だそうです。

エディター上だと無情にもエラーだけ返されますが、実機やエミュレータ上ではちゃんとGoogle Playのアイコンが表示されます。
テスターに登録したアカウントを選択し、画面上部に「ようこそ ○○」と表示されればサインイン成功です。

オフラインでも遊べるゲームであればそのまま処理を進めてもいいですが、オンライン必須の場合はゲームに入れないような処理を入れておきましょう。

Ⅱ.サインアウト

あまり要らないんじゃないかなー・・・と思いつつ一応入れておいた方がいいサインアウト。
これも使うスクリプトにはサインインと同じusingを入れる必要があります。
usingを入れたら

((PlayGamesPlatform) Social.Active).SignOut();

この1文を入れるのみ。
Application.Quit()の直前あたりにでも入れておけば問題ないかと思います。
成否判定をしないみたいなのでちょっと不安ですが・・・


Ⅲ.リーダーボードの登録

この機能を使いたいがためにプラグインを入れたと言っても過言ではないほど使いたかったもの。
スクリプト上で書く前にデベコンの設定から行きます。

デベコンにログインし、左側にあるゲームのコントローラーのアイコンをクリック。
4.リーダーボード をクリック。
新しいリーダーボードを追加 をクリック。
各項目の設定。英語は必ず設定しないといけないみたいです。

まずは名前。
とりあえずそのまんま名前を入れる場所。適当にScore Rankingとでもしましょう。
ランキングの要素が複数ある場合はその都度新しいリーダーボードを追加すればいいと思います。

続いてスコアの形式。
現状「通貨」、「時刻」、「数字」の3種類が用意されてます。
カスタム単位というのもありますが今回は置いておきます。
とりあえずベターに「数字」を選択。
タイムアタックのランキングだったら時刻を選べばいいと思います。

アイコンは必須ではないのでスルー。
必要になったらドラッグ&ドロップでアップしてくれます。

次に順番づけ。昇順にするか降順にするか。
シューティング系だったらもちろん「スコアが高いほど良い」にします。
ゴルフやタイムアタックなど、手数や時間が短い方が良い場合は「スコアが低いほど良い」にしましょう。

制限については必須ではないですが、考えうる最高値を入れておくと良いかもしれないですね。
ゲームのランキングとか見るとたまにあからさまにデータいじったとしか思えない記録もあったりするので・・・

リスト順についてはリーダーボードが追加されるたびにインクリメントされていくので特に何もしなくてもいいかも。
並び変えが必要になったら設定してください。

設定すると他のリーダーボードも自動で変わってくれるみたいです。
画像編集ソフトのレイヤーを入れ替えるような感じでした。便利。


続けてリーダーボードを追加していくこともできますが、今回は普通の保存。
保存するとリーダーボード一覧画面に戻ります。
すると先ほど作ったリーダーボード名の右にそのリーダーボードのIDが作られます。
このIDの文字列をUnity上で使います。


それではUnityのスクリプトへ。
使うときはusingの追加を忘れずに。

Social.ReportScore(登録したい数値, "登録するリーダーボードのID", (bool success) => {
	if(success)
	{
		//登録成功時の処理
	}
	else
	{
		//登録失敗時の処理
	}
});

使う内容自体は説明不要なほど直感的で非常に使いやすいですね。


Ⅳ.リーダーボードの表示

ランキング情報とかを見るためにリーダーボードを表示する時は

Social.ShowLeaderboardUI();

この1文のみ。
タイトル画面あたりに画像を一つ置いてBox Collider 2Dと

using UnityEngine;
using System.Collections;
using GooglePlayGames;
using UnityEngine.SocialPlatforms;
public class ShowLeaderboardUI : MonoBehaviour {
	void OnMouseDown()
	{
		Debug.Log ("Showing Leaderboard");
		Social.ShowLeaderboardUI();
	}
}

こんな感じのスクリプトを入れておけばOKです。

これだけだとリーダーボードがすべて表示され、そこから一つのリーダーボードを選んでランキング閲覧という流れになりますが、最初から特定のリーダーボードを表示することもできます。
その場合は

((PlayGamesPlatform) Social.Active).ShowLeaderboardUI("表示したいリーダーボードのID");


Ⅴ.実績の作成

これも魅力的な機能の一つですな。
ゲーム作りが一通り終わってから実績作成するのは結構楽しいです。
ただ、実績を作るなら最低5つ作らないといけないそうです。
あと実績につける画像も用意しないといけないみたいです。
こちらもまずはデベコンの設定から。


デベコンにログインし、ゲームコントローラーアイコン をクリック。
3.実績 をクリック。
新しい実績を追加 をクリック。

作り方は大体リーダーボードの時と一緒です。こちらも英語版は必須。


名前。
案外表示できるスペースは小さいので半角100文字以内とはありますが、極力短めに。


説明。
実績の説明や、取得手段を記入。
母国語は良いですが、外国語の説明は知ってる人じゃないとなかなか難しいところ・・・
一部のゲームに見られるふざけた文章を入れるのもありかもしれません。


アイコン。
なにやら登録必須らしいところ。
実際表示してるアイコン自体は小さく見えるのですが用意する画像は512*512。結構でかいです。
画像をjpgかpngで保存してドラッグ&ドロップでアップされます。


増分実績。
段階を踏むタイプの実績に使います。
チェックを入れて設定した数値以上になったら実績解除、という流れになりそうです。
チェックなしでも実績解除は出来ますが使用することが推奨されてる模様。


初期状態。
オープントロフィーかシークレットトロフィーか。
この辺りはご自由に。


ポイント数。
最低5ポイント。最高200ポイント。
1アプリ内での合計上限は1000ポイント。満たして無くてもいいみたいです。
なので1アプリで200個まで実績を登録できますね。
そんなに思いつくほど濃いゲームができるかどうか謎ですが・・・
取りやすい実績は低めに、難しい実績は高めに、が定石ですかね。


リスト順。
並び変え可能です。
スクリプトで Social. と入力するとLoadArchivementsという配列を返すメソッドがあったりするので実績の進捗状況を見る事が出来るんじゃないかと予想。
その配列の添え字部分にリストIDが使われそうな予感。
使ってはいないので推測ですが・・・


入力項目を入れ終えて保存すると、リーダーボードと同じように実績のIDが作られます。

ここまでデベコンの設定。
続いてUnityのスクリプト
リーダーボードにスコア登録する時とほぼ同じです。

Social.ReportProgress("実績のID",達成,(bool success) => {
	if(success)
	{
		//成功時の処理
	}
	else
	{
		//失敗時の処理
	}
});

達成については100.0fを入れることで実績解除になります。
0.0fでやると非表示に設定した実績が見れるようになる、的なことがドキュメントに書かれてました。

・・・が、どうもこっちのReportProgressについては使ってほしくないみたいな文章もありました。
SocialというのがUnity上でのクラスになるので代わりにプラグイン専用のクラスで実績解除メソッドを使ってほしいみたいです。

 ((PlayGamesPlatform) Social.Active).IncrementAchievement(
			"実績ID", 増分数値, (bool success) => {
	{
		//成功時の処理
	}
	else
	{
		//失敗時の処理
	}
});

先ほどの増分実績に数値を指定して、数値を追加していく形のこっちの方を使ってください、的な感じでした。
今までReportProgressの方だけ使っていたのでこっちの方は調査してみます。


調査結果:予想通り、増分数値の値分だけ数字が増えていく感じでした。
で、デベコンで設定した数値に達したら実績解除。
解除途中で実績のUIを見ると%で表示されます。
どんどん達成率が上がるタイプの実績はもちろん、一気に設定した値をインクリメントすることでReportProgressと同じように使えますね。

ただし、上限は10000と決まっているようですし、スクリプト上でも送る値の型はint型となっているので10001以上のカウントについては別に考える必要がありそうです。


Ⅵ.実績の表示

リーダーボードの表示とほぼ同じです。
画像にBox Collider 2Dとスクリプトを入れて、スクリプトの内容を

using UnityEngine;
using System.Collections;
using GooglePlayGames;
using UnityEngine.SocialPlatforms;

public class ShowArchivement : MonoBehaviour {
	void OnMouseDown()
	{
		Social.ShowAchievementsUI();
	}
}

にすればOK。


とりあえず最低限使いたい機能はこんな感じ。
他にも気付いたこととかあったら何か書いていきます。