Unity WebGl和前端(Angular)相互调用(含跨域问题)

这篇具有很好参考价值的文章主要介绍了Unity WebGl和前端(Angular)相互调用(含跨域问题)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在Unity官方文档中就已经介绍了Unity和JS相互调用的问题,但是我们实际的应用中往往是使用iframe来展示WebGL。这样不但是webgl和js相互调用的问题,还包含了iframe跨域的问题。

我们的项目中前端使用的是angular框架,就以angular为基础来说一下这个问题,当然vue的前端框架应该都一样的原理。

首先说一下unity和js相互调用的问题

Unity和JS的相互调用

unity调用js:

1.首先在Unity/Assets/Plugins目录下存放你需要调用的js。

2.在Plugins目录下新建文本文档__Internal,后缀改为jslib。

unity webgl 调用js,Unity,unity,前端,webgl

 3.编写脚本内容。

mergeInto(LibraryManager.library, {
  //开启新窗口
  OpenUrlWindow:function(str,counts) 
  {
      OpenUrl_Window(Pointer_stringify(str),Pointer_stringify(counts)); //调用js方法
  },
  //关闭新窗口
  CloseUrlWindow:function()
  {
      CloseUrl_Window();//调用js方法
  },

  FullScreen:function(){
    
  },
    JumpUrl:function(str) 
  {
      Jump_Url(Pointer_stringify(str)); //调用js方法
  }
});

我们以JumpUel为例,我们要在C#中引入动态链接库,  [DllImport("__Internal")],然后C#中调用JumpUrl函数即可。

4.C#调用。这里我们点击场景中的一个物体就触发这个函数。以上是在unity中的处理。

 string str ="unity调用JS";

    [DllImport("__Internal")]
    private static extern void JumpUrl(string str);
    void Start()
    {
        
    }
    private void OnMouseDown()
    {
        JumpUrl(str);
    }

5.打包成webgl。

6.打包成功后使用VSCode打开index文件,是一个html文件代码。我们在script语句块中编写相应的方法,注意:我们在unity中JumpUrl对应的js方法是Jump_Url不要吧函数名字写错。

  function Jump_Url(str){
        console.log(str);
      
      }
    

编写完成后我们打开运行,点击场景中的物体,就会调用js中的方法。

JS调用Unity

js调用unity就相对简单多了。

1.在unity场景中创建一个物体,挂载上要掉用的脚本。

unity webgl 调用js,Unity,unity,前端,webgl

 2.在脚本中随便写个方法。  public void Close(){Debug.log("我是Unity");}

3.打包,因为unity的版本不同打出来的包的index内容也不同,只要找到unityInstance,在他下边调用即可。

unityInstance.SendMessage('场景中挂载脚本的物体名','方法名')
unityInstance.SendMessage('场景中挂载脚本的物体名','方法名','方法对应参数')

unity webgl 调用js,Unity,unity,前端,webgl

 以上完成了js调用unity的的方法。知道以上的方法以后,并不能真正的解决我们开发中遇到的问题,因为我们往往要使用iframe将webgl嵌入到我们的前端页面,我们需要跨域来相互调用。

iframe跨域调用

iframe跨域调用涉及到父子之间的调用,webgl是子,嵌入到的页面就是父。

父调子(JS调用Unity)

1.父的代码

  <!-- html:iframe嵌入 -->
 <iframe allowfullscreen="true" id="unity3d" style="width: 100%;height: 100%;padding:2px 2px 0 2px" frameborder="0" scrolling="no"
                  [src]="Workshop3dAddress | safe">
   </iframe>


//js代码
 change3D(){
    let ifim:any;
    ifim =window.document.getElementById('unity3d');

    ifim.contentWindow.postMessage("ref",'*')
  }

ref会传入到子中,我们可以使用不同的值来区分调用的方法。

2.子的代码

   script.onload = () => {

        var unitysf;
        createUnityInstance(canvas, config, (progress) => {
          progressBarFull.style.width = 100 * progress + "%";
        }).then((unityInstance) => {
          loadingBar.style.display = "none";
          unitysf=unityInstance

        }).catch((message) => {
          alert(message);
        });

        addEventListener("message",e=>{
          console.log("父调用子")
          unitysf.SendMessage("JSToUnity","CameraMove");
          })
        
      };

addEventListener就是我们监听前端调用的方法。 unitysf=unityInstance不用过多解释。在监听的方法中,我们写入js调用unity的方法,就完成了前端跨域调用unity的方法。e就是父中传过来的参数,根据e的不同我们可以判断调用那个函数。

子调父(Unity调用JS)

1.子的代码


var data ="unity"
data=JSON.parse(JSON.stringify(data));
      function Jump_Url(str){
      
        console.log(str);
       window.parent.postMessage({
   data: JSON.stringify(data)
},'*')
      }

这里我们要有两个注意的地方,1是要将data转化一边data=JSON.parse(JSON.stringify(data));

2是  window.parent.postMessage({ data: JSON.stringify(data)},'*')记得在后边加一个*解决跨域的问题。

2.父的代码

  var self = this;
    window.addEventListener('message', function(event) {
      console.log('Received message from iframe:', event.data);

      self.navi(self.groups[0]);//js代码
      self.updateView();//js代码
    }, false);

这里注意:因为addEventListener后是一个函数说以要加一个 var self = this;才能调用JS中的方法,(前端的基础知识)。

以上我们完成了Unity跨域调用JS的方法。文章来源地址https://www.toymoban.com/news/detail-618146.html

到了这里,关于Unity WebGl和前端(Angular)相互调用(含跨域问题)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【前端】在Vue页面中引入其它vue页面 数据传输 相互调用方法等

    1.this.$emit ,子传父 2.this.$children属性 this.$children返回的是数组 例子: 3.通过this.$refs获取组件 4.this.$parent获取父组件数据 this.$parent返回的是对象,this.$children返回的数组 例子: 需求         在 home.vue 中引用 headView.Vue 方案: home.vue 代码: 只需要在home.vue 想要的地方添加 

    2024年02月07日
    浏览(31)
  • Unity实战问题-WebGL问题集锦第一发

    没接触过好吗;立项设计的时候赶紧恶补了下unity,开发过程中可劲儿的查资料;总算是按计划完成了;记录下遇到的问题,如果你是Unity大神,请选择性忽略 背景环境:Unity 5.4.0f3 (64bit)–激活版 浏览器:Google Chrome 版本:70.0.3538.67         Firefox  版本 63.0.1.6877 在这提

    2024年04月11日
    浏览(27)
  • Unity在网页上运行WebGL问题

    项目要开发B/S模式,需要使用WebGL,目前还是前期阶段,遇到了几个问题,在此记录一下。 Unity版本:2019.4 浏览器:谷歌浏览器 目前按照Unity默认设置打包。 如果是BuildAndRun可以直接运行,但是如果是Build显示下面错误: It seems your browser does not support running Unity WebGL content from

    2023年04月08日
    浏览(73)
  • Unity实战问题-WebGL问题集锦第二发

    Q3:给UGUI精灵或按钮 添加自定义事件响应区域  参考地址https://blog.csdn.net/qq_38190993/article/details/69257990 所有UI都有Image组件,其中有RaycastTarget属性,勾选该属性为true则表示运行时UI精灵会响应相应交互事件,这套UGUI(包括NGUI)是通过射线检测实现的交互响应,那么我们可以

    2024年04月27日
    浏览(20)
  • unity webgl导包问题 感谢大佬们

    问题1:Internal build system error. Backend exited with code 2. STDOUT: Finished compiling graph: 397 nodes, 1525 flattened edges (1521 ToBuild, 2 ToUse), maximum node priority 304 问题2:BuildFailedException: Incremental Player build failed! 问题3:Build completed with a result of \\\'Failed\\\' in 95 seconds (95449 ms) 问题4:UnityEditor.BuildPlayerW

    2024年02月12日
    浏览(26)
  • 解决 Axios 跨域问题,轻松实现接口调用

    跨域是指访问另外一个域的资源,由于浏览器的同源策略,默认情况下使用 XMLHttpRequest 和 Fetch 请求时是不允许跨域的。跨域的根本原因是浏览器的同源策略,这是由浏览器对 JavaScript 施加的安全限制。 跨域请求被阻止 (Cross-Origin Request Blocked) : 这是由浏览器实施的同源策略

    2024年02月05日
    浏览(32)
  • unity webgl网页运行后屏幕模糊,UI无响应问题解决

    【记一个莫名其妙的问题】 工具:Unity 2019.4.40f1c1 先前Unity打包apk,设置了最大帧率15 在Project Settings -Quality中设置了Other-VSync Count:Don’t Sync 运行后,帧率稳定在100上下,呵呵 后来在代码中加了一行: 问题解决 今天,准备再打一个webgl包 打包运行后,打开网页,画面停留在

    2024年02月06日
    浏览(29)
  • Unity WebGL项目打包后本地打开报错问题解决方法

    在Unity打包WebGL项目后,本地打开html页面出现错误提示。 Failed to download file Build/Unity Web.data.gz. Loading web pages via a file:// URL without a web server is not supported by this browser.   在网上试了好几种方法,综合起来终于跑起来了。以下是解决步骤: 1. 打开Web服务 ,打开控制面板--程序--启

    2024年02月14日
    浏览(43)
  • 前端面试:【跨域与安全】跨域问题及解决方案

    嗨,亲爱的Web开发者!在构建现代Web应用时,跨域问题和安全性一直是不可忽视的挑战之一。本文将深入探讨跨域问题的背景以及解决方案,以确保你的应用既安全又能与其他域名的资源进行互操作。 1. 什么是跨域问题? 跨域问题指的是在Web开发中,浏览器的同源策略(S

    2024年02月11日
    浏览(43)
  • 前端跨域问题解决方法

    跨域是 WEB浏览器专有 的同源限制访问策略。(后台接口调用和postman等工具会出现) 跨源资源共享(CORS,或通俗地译为跨域资源共享)是一种基于 HTTP 头的机制,该机制通过允许服务器标示除了它自己以外的其他源(域、协议或端口),使得浏览器允许这些源访问加载自己的资

    2024年02月13日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包