vue项目结合unity webgl通信(亲身实践 Unity2022.3版本)

这篇具有很好参考价值的文章主要介绍了vue项目结合unity webgl通信(亲身实践 Unity2022.3版本)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        在参考网上众多资料后,终于将Vue与Unity Webgl双向通信的功能完成。在此过程中遇到了很多问题,故记录下整体流程。

方案实现:

1.unity端实现一个jslib文件预定义函数作为桥接。

2.c#使用DllImport引入和调用预定义的函数。

3.web端使用js定义被调用函数。

unity vue,vue.js,unity,webgl

1.Unity Webgl程序嵌入vue

2.Unity -> vue通信

3.vue -> Unity通信

1.Unity Webgl程序嵌入vue

1)在Unity打包生成webgl项目后,将webgl文件夹内容复制到vue项目目录下的static文件夹中

unity vue,vue.js,unity,webgl

添加Web.Config文件,内容如下:

<?xml version="1.0" encoding="utf-8"?>
<!--
  有关如何配置 ASP.NET 应用程序的详细信息,请访问
  https://go.microsoft.com/fwlink/?LinkId=169433
-->
<configuration>  
  <system.webServer>
    <httpProtocol>
      <!-- 允许跨域配置 -->
      <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Headers" value="X-Requested-With,Content-Type,Authorization" />
        <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE,OPTIONS" />
        <add name="Access-Control-Allow-Credentials" value="true" />
      </customHeaders>
    </httpProtocol>
        <staticContent>
            <remove fileExtension=".mem" />  
            <remove fileExtension=".data" />  
            <remove fileExtension=".unity3d" />  
            <remove fileExtension=".jsbr" />  
            <remove fileExtension=".membr" />  
            <remove fileExtension=".databr" />  
            <remove fileExtension=".unity3dbr" />  
            <remove fileExtension=".jsgz" />  
            <remove fileExtension=".memgz" />  
            <remove fileExtension=".datagz" />  
            <remove fileExtension=".unity3dgz" />  
            <remove fileExtension=".json" />  
            <remove fileExtension=".unityweb" />  
           
            <mimeMap fileExtension=".mem" mimeType="application/octet-stream" />  
            <mimeMap fileExtension=".data" mimeType="application/octet-stream" />  
            <mimeMap fileExtension=".unity3d" mimeType="application/octet-stream" />  
            <mimeMap fileExtension=".jsbr" mimeType="application/octet-stream" />  
            <mimeMap fileExtension=".membr" mimeType="application/octet-stream" />  
            <mimeMap fileExtension=".databr" mimeType="application/octet-stream" />  
            <mimeMap fileExtension=".unity3dbr" mimeType="application/octet-stream" />  
            <mimeMap fileExtension=".jsgz" mimeType="application/x-javascript; charset=UTF-8" />  
            <mimeMap fileExtension=".memgz" mimeType="application/octet-stream" />  
            <mimeMap fileExtension=".datagz" mimeType="application/octet-stream" />  
            <mimeMap fileExtension=".unity3dgz" mimeType="application/octet-stream" />  
            <mimeMap fileExtension=".json" mimeType="application/json; charset=UTF-8" />  
            <mimeMap fileExtension=".unityweb" mimeType="application/octet-stream" />  
        </staticContent>
  </system.webServer>
</configuration>

2)在vue项目中以iframe的方式调用

<iframe src="/static/Unity/index.html"
     ref="unityvue">
 </iframe>

2.Unity -> vue通信

1)在unity创建好项目后,在Assets目录下新建Plugins文件夹,创建一个jslib文件,可以用txt创建文件,文件名加后缀名为“xxx.jslib”,切记后缀名更改为jslib

jslib当作中间者,unity与它通信,前端也与它通信,在此基础上三者之间进行了通信对接

unity vue,vue.js,unity,webgl

2)在刚刚创建的jslib文件里,添加以下代码:

mergeInto(LibraryManager.library,{   
    //Unity内自定义调用方法名 PostScore(string sceneName) 
    PostScore: function (sceneName) { 
     strs = Pointer_stringify(sceneName);   //字符串需用Pointer_stringify转换
     GetScore(strs);                        //前端自定义方法名GetScore(strs)
    },    
});

3)在unity中,新建一个脚本,添加命名空间using System.Runtime.InteropServices; 并添加以下C#代码:

[DllImport("__Internal")]
    private static extern void PostScore(string currentScene);  //当前场景

在unity中调用PostScore()方法,即调用jslib里的PostScore()方法

unity vue,vue.js,unity,webgl

4)打包时在Player Settings->Player->Publishing Settings中将压缩格式禁用,平台选择Webgl

unity vue,vue.js,unity,webgl

5)在unity打包程序后,在index.html中添加GetScore()方法unity vue,vue.js,unity,webgl

以上是unity基础的向前端通信方式。

此时我们在网页嵌入的Unity页面中点击交互按钮时即可触发PostScore(str)方法,将数据从Unity页面传输到前端html中。

unity vue,vue.js,unity,webgl

3.vue -> Unity通信

 官方文档

前端页面向unity页面传值需用到unityInstance.SendMessage()函数,调用格式如下:

SendMessage(unityObject,unityMethodName,value)

unityObject——unity脚本挂载对象名

unityMethodName——unity脚本内调用方法名(需为public方法)

value——前端需要传出的值

1) 在Unity2022.3版本打包生成的webgl中不能直接找到unityInstance对象,需要在index.html页面作如下处理,自定义一个myGameInstance对象用于获取unityInstance

var myGameInstance = null;

createUnityInstance(document.querySelector("#unity-canvas"), {
        ...//省略代码
      }).then((unityInstance) => {
        myGameInstance = unityInstance;
      });

unity vue,vue.js,unity,webgl

2)之后就能愉快的在vue页面调用该方法了~

const refreshAllItem = ()=>{
      console.log('当前unity对象', unityvue.value)
      unityvue.value.contentWindow.myGameInstance.SendMessage('WeatherControl', 'TransToAfternoon', "")
}

参考文档

在此感谢以下作者的参考资料~

网页传递参数到Unity WebGL ,WebGL传递参数到网页_webgl unityinstance_先生沉默先的博客-CSDN博客

WebGL给Unity传递参数问题1: Cannot read properties of undefined (reading ‘SendMessage‘)_先生沉默先的博客-CSDN博客

Unity(WebGL)与JS通讯2022最新姿势 - 知乎

web通信 - web 调用unity方法_哔哩哔哩_bilibili文章来源地址https://www.toymoban.com/news/detail-651609.html

到了这里,关于vue项目结合unity webgl通信(亲身实践 Unity2022.3版本)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Unity3D WebGL平台使用WebSocket通信的方法和示例

    Unity3D WebGL平台使用WebSocket通信的方法和示例

          之前在WebGL平台和服务端交互的时候使用的是UnityWebRequest,通过WebAPI的方式进行交互,后来发现可以用WebSocket交互后就果断换了WebSocket。 一、Unity3D客户端 我在Unity端使用的是 NativeWebSocket NativeWebSocket下载地址 直接导入Unity即可, 下面是适配的代码,直接挂载在GameObject。

    2024年02月11日
    浏览(14)
  • Unity打包WebGL: 导入Vue

    Unity打包WebGL: 导入Vue

    1.1 任务 记录将 Unity 项目打包成 WebGL ,并集成到 Vue 项目中的过程。 1.2 环境 Unity : 2021.3 Vue : 2 2.1 UI 界面 2.2 添加插件 构建 WebGL 项目需要添加一个 .jslib 文件,用于 Unity 脚本函数与 JavaScript 函数交互 详细内容参考:Unity(WebGL)与JS通讯2022最新姿势 web.jslib 文件内容 2.3 添加脚

    2024年02月11日
    浏览(10)
  • Unity webgl 嵌入Vue实现过程

    Unity webgl 嵌入Vue实现过程

    Unity webgl嵌入到前端网页中,前端通过调用Unity webgl内方法实现需要展示的功能,前端点击Unity webgl内的交互点,Unity webgl返回给前端一些需要的数据。 例如:当我们需要在三维场景中展示库区中一些监控设备的部署位置,通过点击三维场景中的监控按钮打开当前监控设备的实

    2024年02月05日
    浏览(11)
  • vue项目接入unity3D模块并进行数据通信

    vue项目接入unity3D模块并进行数据通信

    unity工程师会提供一个前端可使用的包,将其放在vue项目的 public 下,我这里以 unity 文件夹命名

    2024年02月01日
    浏览(10)
  • 基于Unity开发WebGL项目加载AB包(三)

    基于Unity开发WebGL项目加载AB包(三)

    在前两篇文章中,我们分别了解了WebGL如何通过StreamingAssets加载AB包资源(链接:基于Unity开发WebGL项目加载AB包(一)_梵高先森丶的博客-CSDN博客)和如何通过局域网(本地服务器)加载AB包资源(链接:基于Unity开发WebGL项目加载AB包(二)_梵高先森丶的博客-CSDN博客),那么本文,

    2024年02月13日
    浏览(10)
  • Unity Webgl项目判断当前是手机还是电脑运行

    Unity Webgl项目判断当前是手机还是电脑运行

    首先:注意了! 该方法需要unitywebgl导出后才能看到效果!!!(特别注意,在unity中运行 会显示 大概意思是 找不到HelloFloat 方法) 首先需要写一个JS的脚本,主要是调用mergeInto();方法,第一个参数不用变,第二个参数就是JS的方法集合。写完之后将这个文件的后缀改为.jslib,名称

    2024年03月13日
    浏览(37)
  • 【Unity】3D贪吃蛇游戏制作/WebGL本地测试及项目部署

    【Unity】3D贪吃蛇游戏制作/WebGL本地测试及项目部署

    本文是Unity3D贪吃蛇游戏从制作到部署的相关细节 项目开源代码:https://github.com/zstar1003/3D_Snake 试玩链接:http://xdxsb.top/Snake_Game_3D 效果预览: 试玩链接中的内容会和该效果图略有不同,后面会详细说明。 经典贪吃蛇游戏:蛇身随着吃食物的增加不断变长,通过A/D或方向键←→

    2024年02月07日
    浏览(8)
  • Unity-Linux部署WebGL项目MIME类型添加

    Unity-Linux部署WebGL项目MIME类型添加

    在以往的文章中有提到过使用IIS部署WebGL添加MIME类型使WebGL项目在浏览器中能够正常加载,那么如果咱们做的是商业项目,往往是需要部署在学校或者云服务器上面的,大部分情况下如果项目有接口或者后台管理系统,后台基本都会使用Linux系统,那么对于Unity开发人员来说就

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

    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日
    浏览(61)
  • Unity之webgl端通过vue3接入腾讯云联络中心SDK

    Unity之webgl端通过vue3接入腾讯云联络中心SDK

    腾讯云联络中心SDK:云联络中心 Web-SDK 开发指南-文档中心-腾讯云 (tencent.com) ​  1.1 对其进行解压 ​  1.2根据文档操作 查看README.md,根据说明设置server下的dev.js里的相关参数。 然后打开电脑终端,cd到项目的路径: ​ 安装依赖   ​ 运行 ​  1.3 运行demo 复制http://127.0.0.1:5173

    2024年02月14日
    浏览(9)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包