基于Unity+Vue3通信交互的WebGL项目发布实践

这篇具有很好参考价值的文章主要介绍了基于Unity+Vue3通信交互的WebGL项目发布实践。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

基于Unity+Vue3通信交互的WebGL项目发布实践

vue unity 通信,🔥《Unity3D》🔥,WebGL,Vue前端,unity,交互,webgl,vue,游戏引擎

问题背景

我们最近需要把unity开发的pc项目迁移到web端,因为unity支持发布webgl。所以按照以往的开发流程,都是项目开发完成就发布webgl部署到服务器。

突然有一天,测试人员提出说为什么我们做的网页跟别人的不太一样呢?具体看下面两张图:

1、unity使用ugui做的界面发布webgl渲染的出来的样子

vue unity 通信,🔥《Unity3D》🔥,WebGL,Vue前端,unity,交互,webgl,vue,游戏引擎
2、别人前端采用vue开发的UI界面。
vue unity 通信,🔥《Unity3D》🔥,WebGL,Vue前端,unity,交互,webgl,vue,游戏引擎
直观从这两个截图来看还是可以看出unity的ugui在网页端渲染出来比较糊,不清晰。而且从实际体验中ugui的输入框在网页中极其不好用,还有诸多ui上的问题…唉,比较unity的优势不在web端,而且本来它为了性能考虑,在渲染ui方面肯定是比不上这些原生应用的。

所以,我们最终采用vue3开发前端UI界面的方案代替unity的UGUI界面。下面我们就一起来探讨一下Vue和Unity是怎么一起共同配合工作的吧!

准备工作

阅读下文之前,你除了需要具备Unity发布WebGL的知识之外,可能还需要具备一些前端方面的知识,比如"三剑客":Html、Css、JavaScript,当然如果能熟悉Vue方面的知识就更好了。这样你就能畅通无堵的阅读本文了。

解决方案

1、vue项目中安装unity-webgl插件。

2、vue直接通过SendMessage方法向Unity发送消息。

3、Unity通过jslib脚本中介向Vue发送消息。

4、unity和vue双向通信流程如下:

vue unity 通信,🔥《Unity3D》🔥,WebGL,Vue前端,unity,交互,webgl,vue,游戏引擎

项目实践

小目标

1、搭建Unity测试项目并发布WebGL部署到Vue项目中。
2、验证Vue向Unity发送信息:通过前端UI控制Unity游戏物体的显隐和修改颜色。
3、验证Unity向Vue发送信息:Unity监听键盘空格键按下触发前端提示框的显示。

搭建Unity测试项目

1、测试场景
vue unity 通信,🔥《Unity3D》🔥,WebGL,Vue前端,unity,交互,webgl,vue,游戏引擎
2、创建用于Unity与Vue通信的两个重要脚本

  • MessageManager.cs
    vue unity 通信,🔥《Unity3D》🔥,WebGL,Vue前端,unity,交互,webgl,vue,游戏引擎创建MessageManager游戏物体,挂载MessageManager脚本,脚本提供接口给vue调用。

脚本内容如下:

using UnityEngine;

/// <summary>
/// Unity-Vue消息管理脚本
/// </summary>
public class MessageManager : MonoBehaviour
{
    /// <summary>
    /// 测试cube游戏物体
    /// </summary>
    public GameObject cube;


    /// <summary>
    /// vue设置物体显隐
    /// </summary>
    /// <param name="visible"></param>
    public void Vue_SetVisible(string visible)
    {
        if (cube != null)
        {
            cube.transform.localScale = visible == "0" ? Vector3.zero : Vector3.one;
        }
    }

    /// <summary>
    /// vue设置颜色
    /// </summary>
    /// <param name="htmlColor"></param>
    public void Vue_SetColor(string htmlColor)
    {
        if (cube != null)
        {
            if (ColorUtility.TryParseHtmlString(htmlColor,out Color color))
            {
                cube.GetComponent<MeshRenderer>().material.color = color;
            }
        }
    }
}
  • webgl.jslib

注意📢 :Unity官方文档中有说明,请使用 .jslib扩展名将包含 JavaScript 代码的文件放置在 Assets 文件夹中的“Plugins”子文件夹下。所以一般的做法就是在Plugins下新建文本文档,然后改名字改后缀即可。该jslib文件需符合Js语法,否则发布webgl会报错。

jslib脚本格式内容如下:

mergeInto(LibraryManager.library, {

  ShowDialog: function (str) {
    var tip = UTF8ToString(str);
    // '__UnityLib__' 是插件提供的unity对象,相当于绑定了网页渲染出来的Unity容器
    __UnityLib__.showDialog(tip);
  },

});

那么Unity怎么调用jslib中的方法呢?

C#为我们提供了这个命名空间System.Runtime.InteropServices下的DllImport方法,允许引入非托管代码程序集,也就是说我们在Unity里可以通过DllImport方法调用外部程序集的方法。

这里为了测试方便,我就直接将Unity调用jslib的方法写在MessageManager里面了。

using UnityEngine;
using System.Runtime.InteropServices;

/// <summary>
/// Unity-Vue消息管理脚本
/// </summary>
public class MessageManager : MonoBehaviour
{
    [DllImport("__Internal")]
    private static extern void ShowDialog(string msg);//方法名需要jslib书写一致


    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            ShowDialog("来自Unity的消息");
        }
    }
}

至此完成Unity项目的搭建,将项目发布成webgl包,部署到vue项目中测试。
vue unity 通信,🔥《Unity3D》🔥,WebGL,Vue前端,unity,交互,webgl,vue,游戏引擎

创建Vue3测试项目

1、创建vue3项目,并安装unity-webgl插件

创建vue3项目这里就不再赘述了,自行搜索相关教程,如有必要,后期再考虑出相关教程。

使用npm安装unity-webgl插件,执行以下命令:

npm install unity-webgl

安装成功可在vue项目下node_modules看到unity-webgl。
vue unity 通信,🔥《Unity3D》🔥,WebGL,Vue前端,unity,交互,webgl,vue,游戏引擎

2、创建vue3组件UnityGame.vue用于渲染unity画布

vue组件一般我们就放在components文件夹下,vue默认的资源文件夹目录是public,所以我们在public下新建Unity文件夹用于部署unity发布出来的webgl包内容。

UnityGame.vue内容如下:

<template>
    <VueUnity :unity="unityContext" width="800" height="600"></VueUnity>
</template>

<script setup>
import UnityWebgl from 'unity-webgl';
import VueUnity from 'unity-webgl/vue';

const unityContext = new UnityWebgl({
    loaderUrl: '/Unity/UnityVue.loader.js',
    dataUrl: '/Unity/UnityVue.data.gz',
    frameworkUrl: '/Unity/UnityVue.framework.js.gz',
    codeUrl: '/Unity/UnityVue.wasm.gz',
})

unityContext.on('mounted',() => console.log('Unity加载完成...'))

</script>

注意📢 :配置项必须包含最基本的四个属性loaderUrl, dataUrl, frameworkUrl, codeUrl ,这四个属性都是初始化 Unity 应用程序所需的资源文件。

我们还需要再App.vue注册并渲染UnityGame.vue组件:

<template>
  <UnityGame />
</template>

<script setup>
import UnityGame from './components/UnityGame.vue'
</script>

这样我们使用vue部署unity项目的基本结构就完成了。

vue unity 通信,🔥《Unity3D》🔥,WebGL,Vue前端,unity,交互,webgl,vue,游戏引擎

执行命令:npm run dev打开本地服务器地址:http://localhost:5173/,即可看到我们用vue部署的unity webgl项目。

vue unity 通信,🔥《Unity3D》🔥,WebGL,Vue前端,unity,交互,webgl,vue,游戏引擎

3、vue中实现与unity通信的基础

unity-webgl插件为我们提供了两个关键方法:

  • vue调用unity方法

    send(objectName: string, methodName: string, params?: any)

    ⭐️ 向Unity实例对象发送消息,调用一个公共方法。

    • objectName: Unity场景中对象的名称

    • methodName: Unity脚本中方法的名称

    • params: 传递的参数

  • unity调用vue方法

    on(eventName: string, eventListener: Function)

    ⭐️ 注册一个事件或方法,用于监听触发事件或供Unity脚本调用。

所以,我们需要在UnityGame组件里添加实现unity与vue通信交互的测试代码。

我们将通信的方法写在UnityGame.vue组件里。示例:

<template>
    <VueUnity :unity="unityContext" width="800" height="600"></VueUnity>
    <div style="width: 50%; margin-left: auto; margin-right: auto;">
    <button @click="onShowCube" class="defaultButton">{{visible ? '隐藏':'显示'}}</button>
    <button @click="onSetColor" class="redButton"></button>
    <button @click="onSetColor" class="blueButton"></button>
    <button @click="onSetColor" class="yellowButton"></button>
    </div>
</template>

<script setup>
import UnityWebgl from 'unity-webgl';
import VueUnity from 'unity-webgl/vue';
import {ref} from 'vue';

//构建unity实例对象
const unityContext = new UnityWebgl({
    loaderUrl: '/Unity/UnityVue.loader.js',
    dataUrl: '/Unity/UnityVue.data.gz',
    frameworkUrl: '/Unity/UnityVue.framework.js.gz',
    codeUrl: '/Unity/UnityVue.wasm.gz',
})

const visible = ref(true)

unityContext.on('mounted',() => console.log('Unity加载完成...'))
.on('showDialog',(tip)=> alert(tip))//监听unity调用的方法


//向Unity发送信息
function postUnityMessage(methodName, arg) {
    unityContext.send('MessageManager', methodName, arg)
}
//调用unity的方法
//设置cube显隐
function onShowCube(){
    visible.value = !visible.value;
    postUnityMessage('Vue_SetVisible',visible.value ? "1" : "0")
}

//设置cube颜色
function onSetColor(event){
    const button = event.target;
    const style = window.getComputedStyle(button);
    const htmlcolor = rgbtohex(style.backgroundColor.toString());
    postUnityMessage('Vue_SetColor',htmlcolor);
}

function rgbtohex(rgb){
	// rgby颜色值的正则
	var reg = /^(rgb|RGB)/;
	// 判断是否为rgb格式 
	if(reg.test(rgb)){
		// 将rgb的三个数值切割成数组 rgb(255,0,0) ——> ["255","0","0"]
		var colorArr = rgb.replace(/(?:rgb|RGB|\(|\))*/g,"").split(',');
		var hex = "#" + ((1 << 24) + (parseInt(colorArr[0]) << 16) + (parseInt(colorArr[1]) << 8) + parseInt(colorArr[2])).toString(16).slice(1);
     	return hex;
	}else{
		return rgb
	}
}

</script>

<style>
.defaultButton{
  width: 50px;
  height: 50px;
}
.redButton{
  background-color: red;
  width: 50px;
  height: 50px;
}

.yellowButton{
  background-color: yellow;
  width: 50px;
  height: 50px;
}

.blueButton{
  background-color: blue;
  width: 50px;
  height: 50px;
}

</style>

至此,vue测试通信unity项目构建完成。

vue unity 通信,🔥《Unity3D》🔥,WebGL,Vue前端,unity,交互,webgl,vue,游戏引擎

运行项目验证unity和vue通信功能

1、unity打开vue的前端提示框。

vue unity 通信,🔥《Unity3D》🔥,WebGL,Vue前端,unity,交互,webgl,vue,游戏引擎

2、vue前端UI按钮点击事件控制unity游戏物体的显隐和设置颜色。
vue unity 通信,🔥《Unity3D》🔥,WebGL,Vue前端,unity,交互,webgl,vue,游戏引擎

ok,我们已经完成本次实践目标。

总结与展望

unity发布的webgl,使用UGUI在界面显示和处理用户输入方面存在体验差的问题。这些都可以用vue来解决。其实就是使用vue开发前端页面代替unity的UGUI界面,充分发挥了vue的优势,也保留了Unity渲染3d部分的优势。当前这就需要unity开发人员同时具备vue开发前端方面的知识了。

当我们开发前端的项目时,如果同时需要2d界面和3d场景交互时,如数字孪生、虚拟仿真等数据可视化项目,采用Unity+Vue3技术开发是个不错的选择!

本文对基于Unity+Vue3的WebGL项目发布实践做了一个测试demo演示unity与vue通过第三方插件unity-webgl通信的流程。需要对你有所帮助哦!创作不易,如果合你胃口,来个三连支持吧!我们一起加油!文章来源地址https://www.toymoban.com/news/detail-853868.html

到了这里,关于基于Unity+Vue3通信交互的WebGL项目发布实践的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 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日
    浏览(22)
  • 将WebGL打包的unity项目部署至Vue中

    创建一个空项目(或者直接使用现成的项目都可以)这里以该空项目为例子 注意: 如果你的unity项目中有文字,不需要使用unity默认的字体,需要更改它的字体,否则在最后生成的页面中会显示不出来文字 好在你的windows在C盘自带了字体,我这里使用的微软雅黑来进行了替换

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

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

    2024年02月13日
    浏览(25)
  • SpringBoot+Vue前后端分离项目在Linux系统中基于Docker打包发布,并上传镜像到阿里镜像私仓

    将打好的jar包放到咱们opt目录下的自定义文件夹内 打包成功后 –rm 代表退出之后,容器移动删除 可以看到成功启动了服务 阿里云免费私仓 创建好自己的镜像仓库后会显示操作指南 身份登录 将镜像推送到Registry 可以在镜像仓库中进行查看 拉取镜像 default.conf 1.root:设置静态

    2024年04月17日
    浏览(68)
  • Unity项目发布谷歌AAB+PAD

    一切的根源都在谷歌商店。 谷歌商店一直对上架的应用和游戏有严格的要求。最早期的时候,谷歌商店要求apk容量限制在50mb内,后来随着应用的普遍容量增大,谷歌商店把apk的容量限制放宽到100mb。 但对于游戏来说,100mb的容量明显不够用。于是谷歌在早期提出了apk+obb(Opa

    2023年04月24日
    浏览(39)
  • unity webGL与js 交互(获取地址栏URL)

    1.unity传值给js unity中: js中: 2.js传值给unity 参数一 Cookie:场景中物体的名称 (最上层父物体名字,否则无法成功传值) 参数二 OnCookie_Callback:方法名称 参数三 result:值 unity中: 完整: unity场景中物体的名称  untiy代码: js代码:

    2024年02月04日
    浏览(42)
  • webpack项目和vue项目发布,浏览器存在缓存

    项目打包的js(css也是一致)名称都采用哈希值 问题:哈希值在有些情况下打包会不变,导致浏览器使用自己缓存的资源 解决:每次打包出来增加时间戳每次打包后的js名称都不一致 1.js处理 每个项目的打包逻辑都不一样,根据package.json中的打包指令找到执行的文件修改 st

    2024年02月16日
    浏览(28)
  • 将vue项目变成可发布的npm包项目

    第一步: 在main.ts 文件的平级上新建一个index.ts文件 ,文件中导出你想发布的组件 第二步: 在package.json文件的平级上新建index.js文件  第三步: 修改package.json文件,新增命令     \\\"buildnpm\\\": \\\"vue-cli-service build --target lib --name preview src/index.ts\\\"

    2024年02月07日
    浏览(25)
  • 【Hololens2目标检测】YoloDetectionHoloLens-Unity项目发布记录

    win10专业版 Unity2019.4 VS2017( 一定要用这个版本的VS! ) Hololens2(打开开发者模式) win10 SDK 10.0.19041.0 项目来源:YoloDetectionHoloLens-Unity 这是一个使用Hololens进行目标检测的项目。Hololens端负责采集和显示,电脑端处理图像,并标注,将标注框传回Holo端进行显示。 具体的项目发

    2024年02月09日
    浏览(35)
  • Jenkins+vue发布项目

    在Jenkins 中先创建一个任务名称 然后进行下一步,放一个项目 填写一些参数 参数1: 参数2: 参数3: 参数4: 点击保存就行了 配置脚本 在harbor网站里创建一个项目对应 harbor_project 与脚本相互对应, 如果不创建,镜像创建不成功 在下面这个网站里创建一个 k8s_namespace 与上面

    2024年02月07日
    浏览(30)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包