<unity> mBaaSを使ってログイン機能をプレハブ化してみた

<mBaaSとは?>

mBaaSは「mobile backend as a Service」の略称。モバイルアプリのバックエンド機能(サーバー側の機能)をSDKの形で利用できるもの。最近多くのmBaaSサービスがunitySDKを出しているのでそれらをプレハブ化できないかやってみた


<今回のやること>

・mBaaSは「ニフティクラウド mobile backend」(http://mb.cloud.nifty.com/)を利用する
・上記のunityチュートリアル(http://mb.cloud.nifty.com/doc/tutorial/tutorial.html)を参考にする
・上記のものからログイン・サインアップ機能をプレハブ化する。

<やりかた>

まず「完成したプロジェクトをダウンロード」をクリックしてダウンロードします。
ダウンロード後、解凍し、「Unity_shooting>ShootingGame_Unity>Assets>Scenes」にあるLogInのシーンをクリックします。すると以下のような画面が出るはず…
f:id:xhatenen:20140831013239p:plain
この画面の中の赤い枠内が今回プレハブ化する部分です。
「GUITextSignUp」「GUITextLogIn」はユーザー登録やログインに必要な情報を入力するGameObjectの設定を行っているものです。
「LogiInManager」はLogin画面、Signup画面の描画や登録情報の取得を行い、ログインロジックやサインアップロジックを動かすものです。
「UserAuth」はログイン・サインアップなどの実際のロジックが書かれているものになります。
「NCMBSetting」はニフティクラウドmobile backendに接続するためのアプリケーションキー、クライアントキーを設定するものです。

「LogInKit」というあらたな空のGameObjectを作りその中に、上記の5つを格納します。すると下の図のようになります。

f:id:xhatenen:20140831120523p:plain

その「LoginKit」をprefabsフォルダにドラック&ドロップしプレハブ化する。

f:id:xhatenen:20140831121726p:plain

このプレハブを空のシーンにドラック&ドロップすれば簡単にログイン画面を作成することができます。

f:id:xhatenen:20140831122603p:plain


さてこれでログイン・サインアップ機能をプレハブ化することができました。
しかしこれには2点問題があります。
1.GUI上から任意の遷移シーンが設定できない
2.ログイン情報がシーンをまたいで受け渡されない

<1.の解決>
LogInManagerに新たに変数を加えることで解決しました。
LogInManagerのスクリプトに遷移シーンの設定が68行目~70行目に書いてあります。

// ログインが完了したら
if( FindObjectOfType<UserAuth>().currentPlayer() != null )
    Application.LoadLevel("Stage");

”Stage”の部分を変数にします。23行目に変数を定義します。

public string nextStage;

と書いておきそれに伴い、68行目~70行目を以下のように変更します。

// ログインが完了したら
if( FindObjectOfType<UserAuth>().currentPlayer() != null )
    Application.LoadLevel(nextStage);

そうするとGUI上で「LogInManager」を選ぶと以下のように新たらしくNext Stageという空欄ができるのでそこで任意のシーン名を入力することで、任意のシーンに遷移することができます。

f:id:xhatenen:20140831124300p:plain

<2.の解決>

GameObjectの階層構造が変化したせいか、UserAuthのシングルトンが別のスクリプトから呼び出されなくなりログイン画面(LogInシーン)からゲーム画面(Stageシーン)に飛んだ際にログイン情報が渡されずスコア機能が動かなくなりました。

f:id:xhatenen:20140831125604p:plain

この解決のため、PlayerPrefsを利用しました。

UserAuthのスクリプトの39行目~47行目の45行目に1行追加して

// mobile backendに接続してログイン ------------------------
public void logIn( string id, string pw ) {
    NCMBUser.LogInAsync (id, pw, (NCMBException e) => {
        // 接続成功したら
        if( e == null ){
            currentPlayerName = id;
            PlayerPrefs.SetString ("player",currentPlayerName);
        }
    });
}

PlayerPrefsにユーザー名を設定します。

また、スコア機能をつかさどる、Scoreスクリプトでユーザー名を引き出すように設定します。24行目~32行目を一部コメントアウトして30行目にPlayerPrefsから値を引き出す一文を加えます。

void Start (){
    Initialize ();
    // ハイスコアを取得する。保存されてなければ0点。
    //string name = FindObjectOfType<UserAuth>().currentPlayer();
    string name = PlayerPrefs.GetString ("player"); 
    highScore = new NCMB.HighScore( 0, name );
    highScore.fetch();
}

Prefabから値を引き出す方法がPlayerPrefsでいいのか、はなはだ疑問ですがとりあえずログイン機能のプレハブ化が行えました。

結構値の引き渡しが鬼門だ…