在Unity中调用js

记录工作中第一个Uinty项目用到的知识点,在Unity中调用js

由于项目是在WebGL平台,就不得不跟浏览器还有JS打交道。上篇笔记有提到,有个功能是生成实验报告,由于是网页端,暂时想到以网页的形式展示报告。 于是思考出了一个貌似可行的解决方案

方案选取

① 用户点击实验报告按钮,生成html格式的实验报告数据(实时)

② 将数据保存在数据库中,与存档关联,并返回报告ID

③ 调用JS函数(window.open) 打开html,并传递报告ID

④ html即报告界面,在OnLoad函数中请求服务器报告数据,显示报告

其实这个解决方案是不太合理的,因为我把html中的模板+数据都放在了数据库中,一个报告大概有100k大小,需要mediumText类型。真正合理的方案应该 是把模块写好,数据空出来,然后数据库中只要存放关键数据。不过由于报告内容有些庞杂,拆分起来有些困难,就先用了这样一个偷懒的方案。

代码实现

接下来就是实施了。首先是如何调用JS函数:

① 首先要在 Assets/Plugins(必须是这个目录)中创建一个.jslib文件,命名无要求。

② 在jslib中写好函数内容

mergeInto(LibraryManager.library, {

  //接受参数,并在新的页面打开html页面
  linkApp: function (url) {
 var urlStr = Pointer_stringify(url)
 console.log(urlStr);
 console.log(window.location.pathname);
 window.open(urlStr,"blank");
  },

  //弹窗提示当前未登录 并跳转到登录页面
  turnLogin: function (url) {
 var urlStr = Pointer_stringify(url)
 alert("当前未登录");
 self.location = urlStr;
  },

  //弹窗提示"网络错误"
  showMsg: function (url) {
 var urlStr = Pointer_stringify(url)
 alert(urlStr);
  },
});

③ 在unity中执行该js函数

using System.Runtime.InteropServices;
//引入要执行的JS函数名和参数
private static extern void linkApp(string str);
//通过函数名调用
linkApp(a.url);

④ 在html文件中读取报告信息

window.onload = function(){
    var afterUrl =  window.location.search.substring(1);    //截取参数
    var httpRequest = new XMLHttpRequest();    //创建需要的对象
    httpRequest.open('GET', 'http://127.0.0.1:8000/requestData?id='+afterUrl, true);    //打开连接
    httpRequest.setRequestHeader("Content-type","application/x-www-form-urlencoded");    //设置请求头 注:post方式必须设置请求头(在建立连接后设置请求头)
    httpRequest.send('name=teswe&ee=ef');//发送请求 将情头体写在send中
    /**
     * 获取数据后的处理程序
     */
    httpRequest.onreadystatechange = function () {    //请求后的回调接口,可将请求成功后要执行的程序写在其中
    if (httpRequest.readyState == 4 && httpRequest.status == 200) {    //验证请求是否发送成功
        var data = httpRequest.responseText;     //获取到服务端返回的数据
  document.body.innerHTML = data;     //将接收的数据添加到html中
    }
    };
}

简单总结

其实unity也有能打开链接的API:即Application.OpenURL(string url) 但在网页端的情况下,会在原网页打开,而不是在新的页面打开,于是才选择了通过JS打开。虽然现在已经制作完毕, 但总觉得这个解决方案不太好,后续还是需要加以优化和调整。

Licensed under CC BY-NC-SA 4.0
加载中...
感谢Jimmy 隐私政策