Unity Web Player のコンテンツを含む HTML ページは、Unity Web Player からブラウザーへ通信することが可能です。またその逆も可能となっています。基本的に 2 つの通信方法があります。
これらの通信についての詳細を以下に説明します。
Unity Web Player は SendMessage() という関数を持っています。これは Web ページから Web Player 内の関数を自由に呼び出すことが可能になります。この関数は Unity スクリプト API にある GameObject.SendMessage 関数の使い方と非常に似ています。Web ページから呼び出す場合は、ゲームオブジェクト名、関数名、1 つの自由な引数を SendMessage() の引数として渡すと指定されたゲームオブジェクトの関数を呼び出すことができます。
まず、Unity Web Player の SendMessage() 関数を呼び出すには Unity Web Player オブジェクトへの参照を取得する必要があります。デフォルトで生成される HTML ファイル内に Javascript の GetUnity() 関数が生成されており、この関数を使用することによって Unity Web Player オブジェクトへの参照を取得することができます。ここは例としてゲームオブジェクト名 MyObject にある関数 MyFunction() に引数として文字列を渡す SendMessage() を実行します。
<script type="text/javascript" language="javascript">
<!--
//initializing the WebPlayer
var u = new UnityObject2();
u.initPlugin(jQuery("#unityPlayer")[0], "Example.unity3d");
function SaySomethingToUnity()
{
u.getUnity().SendMessage("MyObject", "MyFunction", "Hello from a web page!");
}
-->
</script>
Unity Web Player 内に ゲームオブジェクト(GameObject) 名が MyObject で、MyFunction という関数名を持ったスクリプトを実装する必要があります。
function MyFunction(param : String)
{
Debug.Log(param);
}
Note: 関数が引数を持たない場合、空の文字列("")を渡す必要があることに注意してください
SendMessage() を使用する場合、パラメーターの型は単一の string、integer、float にする必要があります。このパラメーターは呼び出し元で必ず必要になります。もしパラメーターが必要ない場合は Unity 側で無視するようにしてください。加えて、ゲームオブジェクト名はパス名の形式で指定することができます。例えば /MyObject/SomeChild は MyObject の子となる SomeChild になります。また、最初に ‘/’ があることによって MyObject はルートにあるという意味を持ちます。
Note: ゲームがまだ完全に読み込まれていない場合、u.getUnity()は null を返すかもしれません。なので、SendMessage()を使用する前に null でないか確認するか、ゲームを完全に読み込んだ後に u.getUnity()を実行することをお勧めします。
Unity Web Player 内から Web ページの関数を呼び出すには Application.ExternalCall() 関数を使用する必要があります。この関数に任意の数のパラメーターを渡して、Web ページに定義された任意の Javascript 関数を呼び出すことができます。ここは例として Application.ExternalCall() 関数を使用して、Web ページの SayHello() 関数に文字列のパラメーターを渡します。
Application.ExternalCall( "SayHello", "The game says hello!" );
Web ページには SayHello() 関数を定義する必要があります。
<script type="text/javascript" language="javascript">
<!--
function SayHello( arg )
{
// show the message
alert( arg );
}
-->
</script>
もし Web ページに関数を定義できない場合、Application.ExternalEval() 関数を使用して javascript を実行することができます。
例として、Web Player が埋め込まれている Web ページのホストが(unity3d.com)でない場合にリダイレクトするコードを実装します。このテクニックは、Web Player にディープリンクを防ぐために使用することができます。
Application.ExternalEval(
"if(document.domain != 'unity3d.com') { document.location='http://unity3d.com'; }"
);