Unity 网络播放器 (Web Player) 和浏览器通信

包含 Unity 网络播放器 (Web Player) 内容的 HTML 页面可与该内容通信,反之亦然。基本上有两种通信方法:

下面对两种通信方法进行了详细阐述。

从网页中调用 Unity 网络播放器 (Web Player) 内容函数

Unity 网络播放器 (Web Player) 对象有一个 SendMessage() 函数,可从网页中调用,以便在 Unity 网络播放器 (Web Player) 内容中调用函数。该函数与 Unity 脚本 API 中的 GameObject.SendMessage 函数非常类似。从网页中调用时传递对象名称、函数名称和单个参数,SendMessage() 会在相应的游戏对象中调用给定函数。

为了调用 Unity 网络播放器 (Web Player) 的 SendMessage() 函数,必须先引用 Unity 网络播放器对象。可以在 Unity 生成的默认 HTML 中使用 GetUnity() 函数,获得对象引用。以下是一个 JavaScript 函数示例,它将在 Unity 网络播放器 (Web Player) 中执行 SendMessage() 函数,反过来 SendMessage() 会在名为 MyObject 的游戏对象中调用 MyFunction() 函数,传递一段字符串数据作为参数。

<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 网络播放器内容中,必须拥有一个脚本附加到 MyObject 游戏对象 (GameObject) 中,该脚本须执行 MyFunction 函数:

function MyFunction(param : String)
{
    Debug.Log(param);
}

注意:请记住,如果函数没有任何参数,那么应传递一个空字符串 ("") 作为参数。

使用 SendMessage() 时须传递一个单字符串、整数或浮点数参数,该参数是调用方所需的。如果不需要该参数,则只传递零或其他默认值,在 Unity 上忽略。此外,名称指定的游戏对象可以路径名称的形式给出。例如,/MyObject/SomeChild 中的 SomeChild` 必须是 MyObject 的子对象,由于其名称前有 '/' 字符,MyObject`` 必须在根目录。

注意:如果游戏未完全加载,u.getUnity() 可能返回空值,所以最好是在使用 SendMessage() 前检查并确认该值不是空值。或等游戏完全加载,再尝试与其通信。

从 Unity 网络播放器内容中调用网页函数

为了从 Unity 网络播放器内容中调用网页函数,必须使用 Application.ExternalCall() 函数。使用该函数可以调用网页中定义的任何 JavaScript 函数,向其传递任意数量的参数。以下是一个 Unity 脚本示例,使用 Application.ExternalCall() 函数调用网页中名为 SayHello() 的函数,传递一段字符串数据作为参数:

Application.ExternalCall( "SayHello", "The game says hello!" );

该网页须定义 SayHello() 函数,例如:

<script type="text/javascript" language="javascript">
<!--
function SayHello( arg )
{
    // show the message
    alert( arg );
}
-->
</script>

从 Unity 网络播放器内容中执行任意浏览器代码

甚至不必在嵌入的网页中定义函数,而是使用 Application.ExternalEval() 函数从网络播放器内容中执行任意浏览器代码。

以下示例检查页面嵌入的网络播放器内容是否从某主机 (unity3d.com) 中提取,如果不是,则重定向至另一网址。该技术可防止深层链接至网络播放器内容:

Application.ExternalEval(
    "if(document.location.host != 'unity3d.com') { document.location='http://unity3d.com'; }"
);

Page last updated: 2013-07-01