本文所用到的插件,是修改自一个日本人keijiro的代码。他的源码地址为:https://github.com/keijiro/unity-webview-integration
为更易于使用,本插件是将其源码由javascript改为C#代码,并做了一些修改和优化,并打包成unitypackage包,可直接导入项目中使用,方便快捷!
本插件支持Unity与网页javascript进行双向交互
插件下载地址http://download.csdn.net/detail/home_498/9577122
下面是该插件的使用方法:
1.导入插件包
右键你的工程,选择Import Package-Custom Package...,选择unity-webview.unitypackage
此时会显示你要导入的文件,如果不需要看我写的测试用例,则可以不勾选下面的WebViewExample,然后点击Import可导入
2.场景中引入
2D场景用的时候,只需在Canvas新建一个Empty(Create Empty),并绑定WebMediator.cs,调整这个Empty的位置和大小,就可以改变网页的显示位置和大小。
3D场景使用的时候,不需要调整位置和大小,在代码中调用SetMargin进行定位
3.代码调用
声明一个类变量,并将上面创建的empty对象绑定至该变量
public WebMediator WebView;
在使用的地方直接调用即可,千万别忘记加前面的http://
WebView.Show("http://blog.csdn.net/home_498/article/details/51918041");
3D场景使用的时候,再调用下面这句进行定位即可,传入的参数是网页到屏幕边框的距离
WebView.SetMargin(10, 10, 10, 10);
4.Unity调用javascript方法
如下可直接从Unity调用javascript方法,第一个参数为javascript方法名,第二个参数为传入javascript方法的参数,为字符串类型
WebMediator.CallJavascript("javascriptMethod", "这里可以传入一个字符串参数");
5.javascript发消息到Unity
网页要发送消息到Unity,网页需要引入unity.js(在文章开头的下载地址打包下载),调用unity.callback即可发送消息到Unity,第一个参数为消息名,第二个参数为消息内容(传入一个json,到C#端直接以Hashtable形式取出)
网页代码
<html>
<head>
<meta http-equiv=Content-Type content="text/html;charset=utf-8">
<script type="text/javascript" src="unity.js"></script>
<script type="text/javascript">
function pushMsg(method){
var val = document.getElementById("testInput").value;
unity.callback(method, {'msg':val});
}
function javascriptMethod(args){
alert(args);
}
</script>
</head>
<body>
<input id="testInput" />
<input type="button" value="提交A" οnclick="pushMsg('A')" />
<input type="button" value="提交B" οnclick="pushMsg('B')"/>
</body>
</html>
Unity中取消息需要主动调用PollMessage方法,可写在Update中每帧刷新执行,即可实现实时处理,效果上等同于javascript直接调用了Unity。
C#代码
private void ProcessMessages() {
while (true) {
// Poll a message or break.
var message = WebMediator.PollMessage();
if (message == null) break;
Debug.Log(message.path);
switch (message.path)
{
case "A":
A.text = message.args ["msg"].ToString();
break;
case "B":
B.text = message.args ["msg"].ToString();
break;
default:
break;
}
}
}
void Update() {
if (WebMediator.IsVisible()) {
ProcessMessages();
}
}