首先是功能需求的描述:我们需要在两个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