08
2016

Unity WebGLでWebページの情報を取る方法

CATEGORYUnity
ここ一月ほどNode.jsの研修でちょいとWebアプリ作ってて、でその際UnityWebGLでゲーム作って組み込んだので、そこでハマったネタなどを。

WebGLのアプリを作ること自体は、単にUnityのインストール時にカスタムでWebGL用のあれこれ入れて、ビルド時に対象をWebGLにすればOKだった。
が、WebGLで動かすということは、それだけじゃなくて当然Webアプリなりと連動したくなる。
なのだが、UnityのメインはWebGLじゃないので、普通のWebアプリ用のリクエストやらを見るようなメソッドは用意されてないっぽい。
で、いろいろ調べた結果、JavaScriptを実行する方法が用意されており、それ経由で取得できたので、その手法をば。


まず最初に、今回見つけたプロパティやらメソッドやらを紹介。

名称用途
Application.platformゲームが実行されている環境の判別。WebGLの場合
RuntimePlatform.WebGLPlayer
Application.ExternalCall(string, object[])JavaScriptの関数を実行。
Application.ExternalEval(string)任意のJavaScript文を実行。
SendMessage(string, string, string)JavaScriptからWebGLゲーム内のメソッドを実行。

その他プラグインを用いてJavaScriptを呼び出す手法もあるらしいが、今回は試みず。
いずれにせよJavaScriptでうまいことやれということらしいので、これを駆使してパラメータを取得してみた。


自分は単にWebページの各種情報(URLやCookie、LocalStorageなど)が欲しいだけだったので、最終的に取った手法は以下。
  1. Unity側のスクリプトに、SendMessage() に対応した欲しいパラメータを受け取るメソッドを定義。
  2. 同じくUnity側で、必要なパラメータを取得して SendMessage() に渡すJavaScriptを動的に生成。
  3. Application.ExternalEval() で生成したJavaScriptを実行して、パラメータを1のメソッドに転送させる。

具体的にはこんな感じのコード。
using UnityEngine;

public class WebPage : MonoBehaviour
{
/// <summary>
/// WebGLアプリが動いているURL。
/// </summary>
public string Url;

/// <summary>
/// WebGLアプリが動いているURLを取得する。
/// </summary>
public void GetUrl()
{
if (Application.platform == RuntimePlatform.WebGLPlayer)
{
Debug.Log("GetUrl() called.");
Application.ExternalEval("SendMessage('" + this.transform.root.name + "', 'GetUrlEnd', window.location.href)");
}
}

/// <summary>
/// WebGLアプリが動いているURLを受け取る。
/// </summary>
/// <param name="url">アプリのURL。</param>
public void GetUrlEnd(string url)
{
Debug.Log("GetUrlEnd('" + url + "') received.");
this.Url = url;
}
}
最初は普通にWebページのJavaScriptにUnityから呼ばれる処理とかを入れようとしてたけど、ページのロードとか、スクリプトの組み込みとか管理とか手間がかかったので、この手法が一番便利という結論に達した。
(2016/8/12追記 WebGLテンプレート使えばよかったかも…?まあこれはこれで良い手だと思うので。)
ただ、引数が文字列しか受け取れないので、実際に使ってるコードでは引数をJSONで構築したりもしてて、動的なJavaScriptがちょいと複雑になりがち。
その他、タイムアウトチェックとか、応答でイベント的に処理起動させたりとかも入れて使ってる。

でも仕組的にはこれでOKなんだけど、デバッグがいちいちWebGLのビルドを作らないと出来ないのでちょっと面倒くさい…一度動いてしまえばそうそう触る必要ないとことはいえ、こればっかりは手間。致し方ないのかな?


なお、Webページの情報のうち、Cookieについてはわざわざ読み込まなくても WWW で通信する分には勝手に使ってくれる。
というか、最終的に実行されるコードは、ブラウザから見たらゲーム部分も含めて全部ただのJavaScriptなんだから、同じホストに繋ぐ分には使うよね…。
なので、セッションとか引き継げるなら、こういう方法を使わずに、サーバー側のセッション情報として持たせるという手も楽かもしれない。
スポンサーサイト

Tag: Unity JavaScript

0 Comments

Leave a comment