得意のPerlとWebGLを連携しようと思って詰まった点があったので報告。
Perlからはログイン処理を行い、そのセッション内容をクッキーに保存する。
Unityはクッキーのデータを取り出し、データをPerlに送信する。
UnityからはWWWでリクエストをPerlに送信し、
その結果に応じてPerlは文字列を返し、それをUnityで受け取る。
まず、最終的にどのような流れになったのか整理しよう。
1.Perlスクリプトからログイン処理
2.その際、PerlはCookieにセッションIDを保存する。
3.Perlで出力したhtml内にiframeを使ってUnityを内部に呼び出す。
4.呼び出されたUnityはクッキーからセッションIDを取り出す。
5.UnityはPerlへセッションIDを含んだWWWリクエストを送信する。
6.Unityから呼び出されたPerlは処理を行い結果をUnityに渡す。
正直けっこう入り組んでいて最初はよくわからなかった。
まず、1と2は完全にPerlの領域でUnityとは関係ない。
3はiframeを使ってUnityを埋め込めばいいだけ。
4が問題だ。どうやってUnityでCookieを取得するのか?
最初はUnityから呼び出されたPerlからCookieを読み取れだろう。
と、思って色々やってみたがうまくいかない。
(もし誰か方法を知ってたら教えてください)
それで色々調べた結果。
UnityでブラウザのCookieを取得するにはJavaScriptを使うらしい。
またUnity側からはApplication.ExternalCallを利用する。
Application.ExternalCall(“Cookie獲得JavaScript関数名”);
これをUnityで書いてやることにより、JavaScriptをUnityから呼び出せる。
呼び出されるJavaScriptはどこに用意すればいいのか?
埋め込む場所はWebGLでビルドした際出力されるindex.htmlの内部。
<script src=”~~~”></script>
こういうのが書いてある所らへんに埋め込む。
JavaScriptの外部ファイルを作ってそれを参照しても良い。
埋め込む内容はCookieを取得して値を取り出す処理。
ここらへんは各自で調べて欲しい。
で、重要なのが最後にSendMessageを使って返り値をUnityに渡すこと。
Application.ExternalCallは返り値を受け取る方法がないらしいのだ。
SendMessageをCookieを取得するJavaScriptコードの関数内に記述する。
SendMessage (‘返り値を渡すオブジェクトパス’, ‘返り値を受け取る関数名’, 返り値の変数など);
これを書いてやることでUnityは値を受け取ることができる。
例えば・・・
public void 返り値を受け取る関数名 (string 返り値の文字列変数名)
というような関数を、返り値を受け取るオブジェクトのスクリプトに用意しておけば、
その引数に返り値が格納される。
あとは関数内から処理をしてUnityに連動させれば良い。
次にWWWリクエストをUnityから送信し、Perlでそれを受け取る処理をする。
IEnumerator Start ()
{
var www = new WWW(url);
yield return www;
Data = www.text;
}
最低限に書くとこんな感じ。
urlには予め送信先のリクエストURLを格納しておく。
URLにGETパラメータを入れとけば引数も渡せる。
面倒なのでPOSTで送りたい人は各自で調べるべし。
またIEnumeratorを使ってコルーチンで呼び出す。
yield return www; を記述することで、
リクエストが完了するまで処理を進めないらしい。
www.textにはPerlから返ってきた文字列が格納されている。
ではPerl側はどうやって文字列を出力し、Unityに渡すのか。
print “Content-type: text/plain;\n”;
print “Access-Control-Allow-Origin: *\n”;
print “\n”;
print “文字列”;
これを出力することでUnityが認識し文字列をwww.textに格納する。
print “Access-Control-Allow-Origin: *\n”;
このヘッダーを入れないと動かないので必ず入れることを注意。
実際にPerlのスクリプトを運用する時は、
ユーザーが不正にそのスクリプトを利用できないように、
外部からのアクセス制限などをかけておく必要があるだろう。