UnityではじめてのFacebookアプリ作成

UnityでFacebookアプリを作ってみました。

FacebookのMemory
http://apps.facebook.com/kirishikimemory/
(遊ぶにはブラウザにUnity Pluginが必要)

シンプルな神経衰弱ゲームです。
2分の制限時間内にできるだけ早くクリアするとスコアが高くなります。
スコアは記録することができ、簡単ですがランキング機能もあります。

以前にこれとほとんど同じゲームをngCoreを使って作ったことがあったので、Unityでやったらどうかと思ってこの題材を選んでいます。Unityなのに3Dは一切使用せず、GUI部品だけで作っています。

FacebookのAPIを使って、ユーザーIDや名前などの公開されている基本情報の取得だけやってみています。

メインはUnityのコンテンツ(webplayer.unity3d)ですが、PHPでFacebookから情報を取ってきています。

<?php
        $app_id = "xxxxxxxxxxxxxxx";
        $redirect_uri = "http://apps.facebook.com/kirishikimemory/";
        $auth_url ="http://www.facebook.com/dialog/oauth?client_id="
                        .$app_id
                        ."&redirect_uri=".urlencode($redirect_uri);
        $signed_request = $_REQUEST["signed_request"];
 
        list($encoded_sig, $payload) = explode('.', $signed_request, 2);
 
        $data = json_decode(base64_decode(strtr($payload, '-_', '+/')), true);
 
        if (!isset($data["user_id"])) {
                echo("<script> top.location.href='" . $auth_url . "'</script>");
        } else {
                $url="http://graph.facebook.com/".$data["user_id"];
                $profile = json_decode(file_get_contents($url),true);
                echo ("Welcome User: " . $profile["name"]);
        }

ユーザー認証前であれば認証ダイアログにリダイレクトされ、その後、アプリ本体に戻ってきてゲームがプレイできます。
使ってみたのはGRAPH APIだけですが、それ以外にもいろいろなAPIがあります。

Unityとウェブページの連携

これは基本的にFlashと同じようなイメージで実現できます。
Unity→ウェブ、ウェブ→Unityのどちらの通信もできるのですが、今回は両方を使ってみました。

やりたいことはUnityの内部でウェブページで取得したFacebookのユーザー名を使うことです。
スコアをサーバーに送信する際にUnity上からスコアをSubmitするようにしたので、ウェブページで取得したFacebookのユーザー名をUnityのほうで取得する必要があります。

Unityは”シーン”というパーツに分かれているので、「スコアを送信する」シーンのときに名前を取得しにいくようにしました。
下記はUnity内のスクリプトです。JavaScriptっぽいですが静的型付けで書きます。
# SubmitScoreScript.js

var score:int;
var stringPlayerName:String;
var requestDone:boolean = false;
 
function Awake()
{
    score = GameObject.Find("DataStore").GetComponent("DataStoreScript").data;
    Application.ExternalCall("SendPlayerNameToUnity");
}
 
function GetPlayerNameFromFacebook(name:String)
{
    stringPlayerName = name;    
}

Awake()という関数がシーンがロードされたときに1回だけ呼ばれる関数です。そこでApplication.ExternalCall()でウェブページにあるJavaScriptの関数を呼び出
すことができます。そのSendPlayerNameToUnityが下記です。こっちはウェブページのほうにある普通のJavaScriptです。

function SendPlayerNameToUnity()
{
    var unity = unityObject.getObjectById("unityPlayer");
    unity.SendMessage("SubmitWindow", "GetPlayerNameFromFacebook", 
                                      "<?php echo $profile["name"];?>");
}

ここで再びUnity内にあるGetPlayerNameFronFacebookという関数を呼び出し、引数としてユーザー名を渡しています。これでUnityのほうにウェブページで取得したFacebookのユーザー名が渡せます。

これはあくまでも1つのやり方で、例えばウェブページのほうでUnityコンテンツのロードが終わった瞬間にコールバック関数でUnityと通信するやり方もあると思います。そっちのほうが普通でしょうが、不要なAPI呼び出しをゲーム起動時にするのは非効率なため、ここで紹介したように必要になったタイミングで取得しにいくのが良いと思います(それならPHP使ってサーバーサイドであらかじめ取得するなよって話ですが・・・)

今回PHPを使っていますが、全部JavaScriptでやることも可能だと思います。


About this entry