Photon Unity NetworkingでWebRPCを使う

photon_turnbased_green

Photonには WebRPC と呼ばれる、クライアント側から外部 API を呼び出す機能があります。
こういった機能を活用することで Photon は外部サービスと連携することが可能です。
例えば、外部にあるルーム一覧の取得なども WebRPC を使うことで実現できます。
今回は WebRPC の一番簡単な使い方について解説します。

Photon Turnbased とは Photon Realtimeの機能に加えて、WebHook/WebRPC、クラウドセーブといった機能を加えた、
2014年6月より開始された新しいサービスです。
1ルームあたりのメッセージ数の上限が少ない代わりに、Photon Realtimeに比べお求めやすい値段で提供しています。

詳細については、Photon Turnbased公式サイトをご覧下さい。
https://www-jp.exitgames.com/ja/Turnbased

ダッシュボード側の設定

WebRPC の機能は記事執筆時点では Photon Turnbased のみの提供となっております。
記事執筆時点では Photon Realtime や、Photon Chat ではご利用頂けませんのでご了承下さい。

WebRPCはHTTPベースのサーバサイドアプリケーションを事前に実装しておく必要があります。
ここで作ったサーバサイドのアプリケーションは Photon Turnbased ダッシュボードより設定します。

設定方法は Photon Turnbaed のダッシュボードにログイン後、アプリケーションを作成します。
作成が完了したら、下記のような画面が表示されますので、右の [詳細の確認] をクリックしてください。

webrpc-01

アプリケーションの詳細な情報が表示されます。この中の Webhook をクリックします。
新規に追加する場合は下の方の [Webhook] のボタンをクリックします。

webrpc-04

Photon のクライアントアプリケーションが接続する外部 URL の設定はこの画面から行います。
ConfigurationのBaseUUrlにはWebRPCで使うURLを指定します。
例えばWebRPCで利用するURLが “http://photon-tb.webscript.io/webhook” の場合ですと、
BaseUrlには “http://photon-tb.webscript.io/” と指定します。

受口となるアプリケーションを作る

WebRPC を使って Photon から 実際にでWebアプリケーションを呼び出す前に、
受口となるWeb側のアプリケーションを作りましょう。

今回は簡単に受口を作るために webscript.io というサービスを利用します。
https://www.webscript.io/
webscript.io とは、ブラウザ上でプログラムを記入しすぐに実行可能なWebサービスです。
スクリプトは7日間しか保持されませんが、簡単なテストしたい時に便利です。
ここでは、これ以上の webscript.io の説明は割愛させて頂きます。

リクエストを受け取って返すだけの簡単なスクリプトを作ってみました。
JSONとしてパースし、nameとageのパラメータを返すというだけの簡単なプログラムです。

local jsonRequest = json.parse(request.body)
local _name = jsonRequest.name
local _age = jsonRequest.age

if _name ~= nil and _age ~= nil then
  return {
  ResultCode = 0, 
  Data = {
    name = _name,
    age = _age
  }
}
else
  return { ResultCode = 9 }
end

WebRPCを使ってクライアント側からリクエストを行う

webscript.ioで作ったプログラムをクライアント側から呼びます。
今回クライアントはPUNを使った解説となります。

ダッシュボードで設定したWebhookのURLを呼ぶには “PhotonNetwork.WebRpc()” を使います。
利用方法ですが、PhotonNetwork.WebRpc()の第1引数にダッシュボードで指定したBaseURL以降のURLを指定します。
例えば “http://photon-tb.webscript.io/webhook” の場合はBaseURLに “http://photon-tb.webscript.io/” と設定済みだと思いますので、
第1引数には “webhook” と string 文字列で指定します。
次に、第2引数ではPOST時のリクエストパラメータを設定します。パラメータの型は Dictionary 型 です。
第2引数のDictionaryはJSON形式に変換されPOSTされます。

プログラム例は下記の通りです。

using System.Collections.Generic;

Dictionary<string, object> parameters = new Dictionary<string, object>();
parameters.Add ("name", "Niko Yazawa");
parameters.Add ("age", "17");

PhotonNetwork.WebRpc ("webhook", parameters);

WebRPCを使ってクライアント側でレスポンスを受け取る

WebRPC のレスポンスを受け取るには OnWebRpcResponse メソッドを利用します。
このメソッドを利用するためには Photon.MonoBehaviour を継承したクラスを作る必要があります。
OnWebRpcResponse はRPCのレスポンスが返ってきた際に呼ばれるメソッドです。

それでは実際に使ってみましょう!

using ExitGames.Client.Photon;

void OnWebRpcResponse(OperationResponse operationResponse) {

  if (operationResponse.ReturnCode != 0) {
    Debug.Log("WebRPCに失敗しました. Response: " + operationResponse.ToStringFull());
    return;
  }

  WebRpcResponse webRpcResponse = new WebRpcResponse (operationResponse);
  if (webRpcResponse.ReturnCode != 0)
  {
    Debug.Log("WebRPC '" + webRpcResponse.Name + "' に失敗しました. Error: " + webRpcResponse.ReturnCode + " Message: " + webRpcResponse.DebugMessage);
    return;
  }

  Dictionary<string, object> parameters = webRpcResponse.Parameters;

  foreach (KeyValuePair<string, object> pair in parameters) {
    Debug.Log(string.Format("Key : {0} / Value : {1}", pair.Key, pair.Value));
  }
}

5行目でレスポンスが正しく返ってきているか判定します。
レスポンスが正しく返ってきた場合には OperationResponse の ReturnCode に 0 が返っています。

10行目で受け取ったレスポンスを WebRPC の結果を読み出すための WebRpcResponse のクラスとしてインスタンスを生成します。この型にすることによってレスポンスとして返されたデータを利用することが可能です。
11行目で WebRPC のレスポンスが正しいか判定しています。

WebRpcResponse クラスの Parameters 変数に Dictionary 形式でレスポンスのデータが格納されています。
後はKey-Value形式で取得しstring文字列として利用することが可能です。

webrpc-result

最後に

このようにPhotonには意外と知られていない様々な機能がございます。
今後も引き続き紹介する予定です。お楽しみに!