Unity WebPlayer之间调用JS Post方法传参

首先是功能需求的描述:我们需要在两个WebPlayer之间互相传递参数,其方法是在WebA中的Unity调用一个JS方法将参数进行一个post提交并跳转到WebB中,并在WebB的Unity中获取这个post的内容。
以上方案涉及到几个内容:
i 在Unity中调用Html中的JS方法并传参
ii Js的Post方法
iii Unity获取当前页面中的post内容
下面将逐一讲解:

①在Unity中调用Html中的JS方法并传参
代码如下
Unity中:

1
2
3
void Start () {
                Application.ExternalCall( "testFunction", "testMessage");
}

这里的testFunction是JS中的函数名,testMessage是我们传递的字符串内容,JS代码这样设计

1
2
3
4
5
function testFunction( arg )
{
    // show the message
    alert( arg );
}

此时将Unity打包成WebPlayer,命名为WebA.html,运行效果如下:


以上即初步完成了Unity对JS的调用及传参,接下来我们用JS进行一个post提交,将post内容传递到下一个页面。

②JS模拟表单提交
这里的Post方法其实是用JS模拟一个textarea表单并提交,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function testPost(URL, DATA) {        
    var temp = document.createElement("form");        
    temp.action = URL;        
    temp.method = "post";        
    temp.style.display = "none";        
         
        var opt = document.createElement("textarea");        
        opt.name = 'test';        
        opt.value = DATA;              
        temp.appendChild(opt);        
         
    document.body.appendChild(temp);        
    temp.submit();        
    return temp;        
}

这段代码写在WebA.html中。
此时在Unity中使用①中的Application.ExternalCall()方法

1
2
3
void Start () {
                Application.ExternalCall( "testPost", "WebB.html","testMessage");
}

新建一个WebB.html用于接收post消息。
测试结果如图:

这里可以看到data已经从Unity中通过WebA.html的JS传递到了WebB.html中。接下来我们将完成最后一部,将WebB.html中的Post消息传递到另一个Unity WebPlayer中。

③Unity获取当前页面中的post内容
这里的方案有三种,时间有限就不一一试验了,简单说下:
a.使用JS对Unity函数的调用sendMessage()方法:

1
2
3
4
5
6
7
8
9
10
<!--
//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!");
}
-->

详细见官方文档:http://docs.unity3d.com/Documentation/Manual/UnityWebPlayerandbrowsercommunication.html
但是通常在非IE浏览器下会出现无法使用SendMessage的问题。

b.使用.net的HttpWebRequest方法获取Http的headers信息

1
2
3
4
HttpWebRequest HttpWReq = (HttpWebRequest)WebRequest.Create("http://coder.beitown.com/WebB.html");
        // Turn off connection keep-alives.
                HttpWReq.KeepAlive = false;
        string data = HttpWReq.Headers.ToString ();

问题是在打包成WebPlayer后无法使用,只能在PC版本中使用。WebPlayer中使用许多非Unity原生的.net包会经常性的报异常,这也是未来WebPlayer有待解决的一些问题。

c.其他语言中转并用WWW方法获取网页内容。
这里选用的是PHP:

1
2
3
4
 $data= $_POST["test"];
         if($data!=""){
                  echo $data;
         }

之后在Unity中使用WWW方法获取网页数据:

1
2
3
4
5
6
IEnumerator start(){
WWW www = new WWW ("http://coder.beitown.com/WebB.html");
        yield return www;
        Debug.Log (www.text);
                //使用正则表达式对text内容进行分解获取所需参数
}

说一下yield方法,其意义为每帧调用一次,当getData 执行完成,返回结果,相当于是异步请求数据。

以上即为简单的WebPlayer之间的一个参数传递方法,当然还有其他方案,但大体如上。相信随着Unity版本的升级,其在WebPlayer上的兼容方案将会大大得到完善。
本篇到此,感谢大家的学习交流,谢谢关注。

BeiTown
2014-05-24

本文链接:Unity WebPlayer之间调用JS Post方法传参

转载声明:BeiTown原创,转载请注明来源:BeiTown's Coder 编码之源,谢谢


Tags: , , ,