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

news2024/12/23 19:42:25

在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。

 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场景中创建一个物体,挂载上要掉用的脚本。

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

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

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

 以上完成了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的方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/584334.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于谷歌云计算进行Python yolov5的使用操作(简略版)

关于谷歌云计算的使用操作&#xff08;简略版&#xff09; 谷歌云盘&#xff1a;https://drive.google.com/ 翻墙订阅&#xff1a;链接 谷歌云盘创建操作&#xff1a; 1 2 3.添加Colaboratory关联 设置免费的GPU 它是很容易更换默认的硬件&#xff08;None,GPU,TPU&#xff…

群智能算法-粒子群1

一.基本理念 粒子群算法(PSO),最早由两位外国科学家在1995年提出&#xff0c;该算法源自对鸟类捕食问题的研究。 我们将鸟类补食性原则分为一下三个基数&#xff0c;每组基数对应一个粒子&#xff0c;而每组粒子我们将其称之为种群。所以我们将其在细分具体&#xff0c;基数一&…

C++核心编程—类和对象,类的三大特性——封装、继承、多态

纵有疾风起&#xff0c;人生不言弃。本文篇幅较长&#xff0c;如有错误请不吝赐教&#xff0c;感谢支持。 &#x1f4ac;文章目录 一.类和对象的概念①什么是对象&#xff1f;②抽象和类1.类的基本概念2.类的声明与定义&#xff1a;3.对象的创建与使用 二.类的封装①为什么有封…

阿里云国际站代理商:阿里云支持哪些大数据方案和应用?如何使用和操作?

阿里云国际站代理商&#xff1a;阿里云支持哪些大数据方案和应用&#xff1f;如何使用和操作&#xff1f; [本文由阿里云代理商聚搜云撰写] 大数据时代已经来临&#xff0c;如何处理并分析这些海量的数据成了企业迫切需要解决的问题。作为一家国内领先的云计算提供商&#xff0…

传地址给组件并让该组件用到地址在背景图片中的方法

问题 这是我在开发中遇到的问题。在网站的分页面中&#xff0c;背景图片的格式几乎一模一样。只是上面的文字和图片不一样而已。 所以我希望写一个组件&#xff0c;然后页面只需要传入背景图片地址和标题就可以显示出相关内容。 于是我动手写了&#xff0c;大致思路是一个盒…

Win11的两个实用技巧系列之读取硬盘很卡的解决办法、添加防火墙信任项方法

win11读取机械硬盘速度慢? win11读取硬盘很卡的解决办法 win11读取机械硬盘速度慢&#xff1f;win11系统硬盘读取速度太慢了&#xff0c;该怎么解决呢&#xff1f;下面我们就来看看win11读取硬盘很卡的解决办法 不少win11用户都遇到了读取硬盘很卡的情况&#xff0c;导致等待…

2023年铜川宜宾半程马拉松赛-人生首次半马比赛

1、赛事背景 2023年5月21日&#xff0c;我参加了2023年铜川宜宾半程马拉松赛&#xff0c;也是人生首次半马比赛。。很久之前的天气预报就是说要下雨&#xff0c;有的时候更是预报中大雨&#xff0c;所以很担心半马会不会延期举办&#xff0c;还好如期举行了。 2023宜君“药谷飘…

盐城北大青鸟东台基地IT精英挑战赛作品展示

北大青鸟IT精英挑战赛作品展示 ——《波比》 这是我们21级老生们的作品&#xff0c;主要的创作灵感来自于&#xff0c;可爱的小青蛙和王子小时候结合而成的IP形象&#xff0c;同时也是漫展的追随者。 设计团队21级计算机2班&#xff1a;王丽娜 陈美玲 陆梅莹

深度学习实战——模型推理优化(模型压缩与加速)

忆如完整项目/代码详见github&#xff1a;https://github.com/yiru1225&#xff08;转载标明出处 勿白嫖 star for projects thanks&#xff09; 目录 系列文章目录 一、实验思路综述 1.实验工具及内容 2.实验数据 3.实验目标 4.实验步骤 二、模型压缩与加速综述 1.模…

C++中的高阶函数:以std::function优雅地实现回调

C中的高阶函数&#xff1a;以std::function优雅地实现回调 1. 简介1.1 C高阶函数的概念1.2 C的std::function的功能及其重要性 2. std::function的使用2.1 std::function的定义和基本使用2.1.1 std::function的定义2.1.2 std::function的基本使用 2.2 std::function接受普通函数…

安吉尔航天净水新品发布,净水行业已进入新赛点?

作为具有较强线下依赖性的家电细分市场&#xff0c;净水器行业受到外部因素的扰动较大&#xff0c;2020年&#xff0c;经济下行趋势明显&#xff0c;这一年也成为国内净水器市场的拐点&#xff0c;不少业内人士认为多年的行业扩张期已在此结束。 但进入2023年&#xff0c;随着…

【收藏】麻省理工:如何选择和设计论文的Figure?

论文中的图表以独有的方式组织信息&#xff0c;更好地传递作者思想。那么&#xff0c;如何选择和设计合适的Figure&#xff1f; MIT Communication Lab&#xff08;麻省理工学院通信实验室&#xff09;为作者提供了有效的建议&#xff0c;我们来学习一下 ~ 01 数据图 在制作数…

使用 LSSVM 的 Matlab 演示求解反常微分方程问题(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Qt Quick系列(3)—组件component

&#x1f680;作者&#xff1a;CAccept &#x1f382;专栏&#xff1a;Qt Quick 文章目录 概念相关知识点代码示例总结 概念 在Qt Quick中&#xff0c;组件&#xff08;Component&#xff09;是一种可重用的元素&#xff0c;可以包含其他子组件或属性。它们可以用来创建自定…

PIC adc模块的配置

PIC adc模块的配置有如下要点&#xff1a; 1. adc模块本身&#xff1a; 注意&#xff0c;Auto-conversion Trigger和ADC的clock是两个概念。 auto-conversion Trigger的频率不得超过ADC采样一次的总时长。而真正的采样率是auto-conversion Trigger的頻率。 采样的过程中&…

2023音视频开发程序员未来10年路线选择

2023音视频开发程序员未来10年路线选择&#xff1a; 音视频领域&#xff0c;其实你可以分三个部分来看&#xff0c; 第一是音视频本身&#xff0c;第二是网络通讯&#xff0c;第三是图像处理。 音视频本身涉及到音视频视频编解码啊&#xff0c;各种视频容器啊等等协议规范。 网…

【Java SE】| Java 序列化详解

目录 &#x1f981; 什么是序列化和反序列化?&#x1f981; 序列化和反序列化常见应用场景&#x1f981; 序列化协议对应于 TCP/IP 4 层模型的哪一层&#xff1f;&#x1f981; 常见序列化协议有哪些&#xff1f;1. Java自带的序列化方式2. Kryo3.Hessian &#x1f981; 什么是…

Dockerfile(6) - EXPOSE 指令详解

EXPOSE 通知 Docker 容器在运行时监听指定的网络端口 EXPOSE 端口号 EXPOSE 端口号/协议 默认协议是 TCP 同时在 TCP、UDP 上暴露端口 EXPOSE 80/tcp EXPOSE 80/udp EXPOSE 原理 个人理解&#xff1a;EXPOSE 暴露的端口更像是指明了该容器提供的服务需要用到的端口EXPOSE …

独角数卡 搭建-邮件配置-Epusdt配置-收U详细配置

配置独角数卡 https://github.com/assimon/dujiaoka/wiki/2.x_bt_install ⚠️正式上线后一定要将.env配置里面的APP_DEBUG设置为false⚠️ ⚠️正式上线后一定要将.env配置里面的APP_DEBUG设置为false⚠️ ⚠️正式上线后一定要将.env配置里面的APP_DEBUG设置为false⚠️ 安…

FMC子卡设计原理图:141-四路 250Msps 16bits AD FMC子卡 模拟信号、无线电、光电的采集场景

FMC141-四路 250Msps 16bits AD FMC子卡 一、产品概述&#xff1a; 本板卡基于 FMC 标准板卡&#xff0c;实现 4 路 16-bit/250Msps ADC 功能。遵循 VITA 57 标准&#xff0c;板卡可以直接与xilinx公司或者本公司 FPGA 载板连接使用。板卡 ADC 器件采用 ADI 公司 AD9467…