WordPressのユーザー情報を利用して、UnityのWebGLでログイン機能をやや強引に実装する方法

English

初めに

UnityでWebGLのゲームを作成すると、(おそらくセキュリティ上の問題で)通常はローカル環境にゲームの進行データなどを保存することができません。必然的に、ゲームのデータはオンライン上に保存することになります。オンラインにユーザーのデータを保存する場合には、これまた必然的に、保存するデータがどのユーザーのものかを判別するために、会員制にする必要があります。すなわち、ゲームのシステムに会員機能、少なくとも会員登録機能とログイン機能、を実装しなければなりません。

しかし、会員登録機能やログイン機能は、ゲームそのものとは別の機能です。趣味で作る小規模ゲームのために、そのような機能を実装するのは、余計な労力に思われます。もちろん、その点も含めて作ることを楽しみたいという方には問題ないですが、ゲームを早く公開したい方にとっては、コアではない部分への労力は省きたいものです。

そこで、本記事では、WordPressとUnityのWebGLを(やや強引に)連携して、会員機能を実装する方法を紹介します。

全体像

会員登録機能はWordPressで実装します。ログイン機能については、WordPressとUnityを仲介するphpプログラムを作成し、WordPressのログイン機能にそのphpプログラムを介してUnity側からアクセスするシステムを作成します。

WordPress側の準備

まず、WordPressに会員登録機能を実装します。WordPressに会員登録機能を実装するには、プラグインを導入するのが簡単です。

会員登録機能を実装するプラグインは複数ありますが、Unityとの連携に影響があるので、WordPressのwp_signon関数の戻り値に影響を与えないプラグインを選択するのが良いでしょう。筆者はWP-Membersを使用しました。

WP-Membersの使用方法は、外部サイトを参照してください。

連携プログラムの準備

WordPressとUnityを連携するphpプログラムを作成します。

プログラムの冒頭で、WordPressの関数を外部phpでも使えるように、WordPressをインストールしたディレクトリにあるwp-load.phpを読み込んでください。そして、HTTP POSTメソッドで渡されたIDとパスワードをwp_signonに渡し、ユーザーを認証します。

具体的なコードは、例えば以下の通りです。

require_once( dirname(dirname( __FILE__ )) . '/wp/wp-load.php' );

$creds = array();
$creds['user_login'] = @$_POST['user_login'];
$creds['user_password'] = @$_POST['user_password'];
$creds['remember'] = false;

$user = wp_signon( $creds, false );

if ( is_wp_error($user) )
{
    echo $user->get_error_message();

    exit('<false>');
}

この場合、認証に失敗した場合には、末尾に「<false>」が付いたメッセージが返ってきます。

Unity側の準備

連携用のphpプログラムと情報を送受信するスクリプトを作成します。

UnityWebRequestを使用して、連携プログラムを呼び出します。WWWFormを使用して、連携プログラムにIDとパスワードを渡します。

具体的なコードは、例えば以下の通りです。

    public void Login(string strID, string strPassword)
    {
        StartCoroutine(CoLogin(strID, strPassword));
    }

    IEnumerator CoLogin(string strID, string strPassword)
    {
        if(string.IsNullOrWhiteSpace(strID))
        {
            yield break;
        }

        if(string.IsNullOrWhiteSpace(strPassword))
        {
            yield break;
        }

        WWWForm form = new WWWForm();
        form.AddField("user_login", strID);
        form.AddField("user_password", strPassword);

        UnityWebRequest www = UnityWebRequest.Post(MBCManager.WEBGL_URL + "login.php", form);
        yield return www.SendWebRequest();

        if (www.isNetworkError || www.isHttpError)
        {
            Debug.LogError(www.error);
            yield break;
        }
        else
        {
            Debug.Log("Login complete! The response is " + www.downloadHandler.text);
        }

        if(www.downloadHandler.text.Contains("<false>"))
        {
            //Failed to log in.
            yield break;
        }
        //Success to log in.
    }

この場合、「<false>」が含まれたメッセージが返ってくれば認証失敗=ログイン失敗、そうでなければ認証成功=ログイン成功と判断しています。

運用方法

以上で紹介したのは、WordPressとUnityを連携させる仕組みの解説のためのコードであり、実際に運用する場合には、実態に合わせて改変していかなければなりません。

例えば、ゲームの進行状況を保存したい場合には、連携プログラムにIDとパスワードの他にゲームデータも送信し、認証に成功したら、続けてID名のディレクトリ下にデータを保存する処理を行います。

例えば、ゲームの進行状況を読み出したい場合には、連携プログラム上で認証に成功したら、続けてID名のディレクトリ下にあるファイルを読み出して、クライアントにメッセージを返します。