国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

基于Unity+Vue3通信交互的WebGL項目發(fā)布實踐

這篇具有很好參考價值的文章主要介紹了基于Unity+Vue3通信交互的WebGL項目發(fā)布實踐。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

基于Unity+Vue3通信交互的WebGL項目發(fā)布實踐

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

問題背景

我們最近需要把unity開發(fā)的pc項目遷移到web端,因為unity支持發(fā)布webgl。所以按照以往的開發(fā)流程,都是項目開發(fā)完成就發(fā)布webgl部署到服務(wù)器。

突然有一天,測試人員提出說為什么我們做的網(wǎng)頁跟別人的不太一樣呢?具體看下面兩張圖:

1、unity使用ugui做的界面發(fā)布webgl渲染的出來的樣子

vue unity 通信,??《Unity3D》??,WebGL,Vue前端,unity,交互,webgl,vue,游戲引擎
2、別人前端采用vue開發(fā)的UI界面。
vue unity 通信,??《Unity3D》??,WebGL,Vue前端,unity,交互,webgl,vue,游戲引擎
直觀從這兩個截圖來看還是可以看出unity的ugui在網(wǎng)頁端渲染出來比較糊,不清晰。而且從實際體驗中ugui的輸入框在網(wǎng)頁中極其不好用,還有諸多ui上的問題…唉,比較unity的優(yōu)勢不在web端,而且本來它為了性能考慮,在渲染ui方面肯定是比不上這些原生應(yīng)用的。

所以,我們最終采用vue3開發(fā)前端UI界面的方案代替unity的UGUI界面。下面我們就一起來探討一下Vue和Unity是怎么一起共同配合工作的吧!

準備工作

閱讀下文之前,你除了需要具備Unity發(fā)布WebGL的知識之外,可能還需要具備一些前端方面的知識,比如"三劍客":Html、Css、JavaScript,當(dāng)然如果能熟悉Vue方面的知識就更好了。這樣你就能暢通無堵的閱讀本文了。

解決方案

1、vue項目中安裝unity-webgl插件。

2、vue直接通過SendMessage方法向Unity發(fā)送消息。

3、Unity通過jslib腳本中介向Vue發(fā)送消息。

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

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

項目實踐

小目標

1、搭建Unity測試項目并發(fā)布WebGL部署到Vue項目中。
2、驗證Vue向Unity發(fā)送信息:通過前端UI控制Unity游戲物體的顯隱和修改顏色。
3、驗證Unity向Vue發(fā)送信息:Unity監(jiān)聽鍵盤空格鍵按下觸發(fā)前端提示框的顯示。

搭建Unity測試項目

1、測試場景
vue unity 通信,??《Unity3D》??,WebGL,Vue前端,unity,交互,webgl,vue,游戲引擎
2、創(chuàng)建用于Unity與Vue通信的兩個重要腳本

  • MessageManager.cs
    vue unity 通信,??《Unity3D》??,WebGL,Vue前端,unity,交互,webgl,vue,游戲引擎創(chuàng)建MessageManager游戲物體,掛載MessageManager腳本,腳本提供接口給vue調(diào)用。

腳本內(nèi)容如下:

using UnityEngine;

/// <summary>
/// Unity-Vue消息管理腳本
/// </summary>
public class MessageManager : MonoBehaviour
{
    /// <summary>
    /// 測試cube游戲物體
    /// </summary>
    public GameObject cube;


    /// <summary>
    /// vue設(shè)置物體顯隱
    /// </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設(shè)置顏色
    /// </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語法,否則發(fā)布webgl會報錯。

jslib腳本格式內(nèi)容如下:

mergeInto(LibraryManager.library, {

  ShowDialog: function (str) {
    var tip = UTF8ToString(str);
    // '__UnityLib__' 是插件提供的unity對象,相當(dāng)于綁定了網(wǎng)頁渲染出來的Unity容器
    __UnityLib__.showDialog(tip);
  },

});

那么Unity怎么調(diào)用jslib中的方法呢?

C#為我們提供了這個命名空間System.Runtime.InteropServices下的DllImport方法,允許引入非托管代碼程序集,也就是說我們在Unity里可以通過DllImport方法調(diào)用外部程序集的方法。

這里為了測試方便,我就直接將Unity調(diào)用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項目的搭建,將項目發(fā)布成webgl包,部署到vue項目中測試。
vue unity 通信,??《Unity3D》??,WebGL,Vue前端,unity,交互,webgl,vue,游戲引擎

創(chuàng)建Vue3測試項目

1、創(chuàng)建vue3項目,并安裝unity-webgl插件

創(chuàng)建vue3項目這里就不再贅述了,自行搜索相關(guān)教程,如有必要,后期再考慮出相關(guān)教程。

使用npm安裝unity-webgl插件,執(zhí)行以下命令:

npm install unity-webgl

安裝成功可在vue項目下node_modules看到unity-webgl。
vue unity 通信,??《Unity3D》??,WebGL,Vue前端,unity,交互,webgl,vue,游戲引擎

2、創(chuàng)建vue3組件UnityGame.vue用于渲染unity畫布

vue組件一般我們就放在components文件夾下,vue默認的資源文件夾目錄是public,所以我們在public下新建Unity文件夾用于部署unity發(fā)布出來的webgl包內(nèi)容。

UnityGame.vue內(nèi)容如下:

<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 應(yīng)用程序所需的資源文件。

我們還需要再App.vue注冊并渲染UnityGame.vue組件:

<template>
  <UnityGame />
</template>

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

這樣我們使用vue部署unity項目的基本結(jié)構(gòu)就完成了。

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

執(zhí)行命令:npm run dev打開本地服務(wù)器地址:http://localhost:5173/,即可看到我們用vue部署的unity webgl項目。

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

3、vue中實現(xiàn)與unity通信的基礎(chǔ)

unity-webgl插件為我們提供了兩個關(guān)鍵方法:

  • vue調(diào)用unity方法

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

    ?? 向Unity實例對象發(fā)送消息,調(diào)用一個公共方法。

    • objectName: Unity場景中對象的名稱

    • methodName: Unity腳本中方法的名稱

    • params: 傳遞的參數(shù)

  • unity調(diào)用vue方法

    on(eventName: string, eventListener: Function)

    ?? 注冊一個事件或方法,用于監(jiān)聽觸發(fā)事件或供Unity腳本調(diào)用。

所以,我們需要在UnityGame組件里添加實現(xiàn)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';

//構(gòu)建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))//監(jiān)聽unity調(diào)用的方法


//向Unity發(fā)送信息
function postUnityMessage(methodName, arg) {
    unityContext.send('MessageManager', methodName, arg)
}
//調(diào)用unity的方法
//設(shè)置cube顯隱
function onShowCube(){
    visible.value = !visible.value;
    postUnityMessage('Vue_SetVisible',visible.value ? "1" : "0")
}

//設(shè)置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的三個數(shù)值切割成數(shù)組 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項目構(gòu)建完成。

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游戲物體的顯隱和設(shè)置顏色。
vue unity 通信,??《Unity3D》??,WebGL,Vue前端,unity,交互,webgl,vue,游戲引擎

ok,我們已經(jīng)完成本次實踐目標。

總結(jié)與展望

unity發(fā)布的webgl,使用UGUI在界面顯示和處理用戶輸入方面存在體驗差的問題。這些都可以用vue來解決。其實就是使用vue開發(fā)前端頁面代替unity的UGUI界面,充分發(fā)揮了vue的優(yōu)勢,也保留了Unity渲染3d部分的優(yōu)勢。當(dāng)前這就需要unity開發(fā)人員同時具備vue開發(fā)前端方面的知識了。

當(dāng)我們開發(fā)前端的項目時,如果同時需要2d界面和3d場景交互時,如數(shù)字孿生、虛擬仿真等數(shù)據(jù)可視化項目,采用Unity+Vue3技術(shù)開發(fā)是個不錯的選擇!

本文對基于Unity+Vue3的WebGL項目發(fā)布實踐做了一個測試demo演示unity與vue通過第三方插件unity-webgl通信的流程。需要對你有所幫助哦!創(chuàng)作不易,如果合你胃口,來個三連支持吧!我們一起加油!文章來源地址http://www.zghlxwxcb.cn/news/detail-853868.html

到了這里,關(guān)于基于Unity+Vue3通信交互的WebGL項目發(fā)布實踐的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Unity之webgl端通過vue3接入騰訊云聯(lián)絡(luò)中心SDK

    Unity之webgl端通過vue3接入騰訊云聯(lián)絡(luò)中心SDK

    騰訊云聯(lián)絡(luò)中心SDK:云聯(lián)絡(luò)中心 Web-SDK 開發(fā)指南-文檔中心-騰訊云 (tencent.com) ? ?1.1 對其進行解壓 ? ?1.2根據(jù)文檔操作 查看README.md,根據(jù)說明設(shè)置server下的dev.js里的相關(guān)參數(shù)。 然后打開電腦終端,cd到項目的路徑: ? 安裝依賴 ? ? 運行 ?? 1.3 運行demo 復(fù)制http://127.0.0.1:5173

    2024年02月14日
    瀏覽(23)
  • 將WebGL打包的unity項目部署至Vue中

    將WebGL打包的unity項目部署至Vue中

    創(chuàng)建一個空項目(或者直接使用現(xiàn)成的項目都可以)這里以該空項目為例子 注意: 如果你的unity項目中有文字,不需要使用unity默認的字體,需要更改它的字體,否則在最后生成的頁面中會顯示不出來文字 好在你的windows在C盤自帶了字體,我這里使用的微軟雅黑來進行了替換

    2024年02月02日
    瀏覽(23)
  • 基于Unity開發(fā)WebGL項目加載AB包(三)

    基于Unity開發(fā)WebGL項目加載AB包(三)

    在前兩篇文章中,我們分別了解了WebGL如何通過StreamingAssets加載AB包資源(鏈接:基于Unity開發(fā)WebGL項目加載AB包(一)_梵高先森丶的博客-CSDN博客)和如何通過局域網(wǎng)(本地服務(wù)器)加載AB包資源(鏈接:基于Unity開發(fā)WebGL項目加載AB包(二)_梵高先森丶的博客-CSDN博客),那么本文,

    2024年02月13日
    瀏覽(23)
  • SpringBoot+Vue前后端分離項目在Linux系統(tǒng)中基于Docker打包發(fā)布,并上傳鏡像到阿里鏡像私倉

    SpringBoot+Vue前后端分離項目在Linux系統(tǒng)中基于Docker打包發(fā)布,并上傳鏡像到阿里鏡像私倉

    將打好的jar包放到咱們opt目錄下的自定義文件夾內(nèi) 打包成功后 –rm 代表退出之后,容器移動刪除 可以看到成功啟動了服務(wù) 阿里云免費私倉 創(chuàng)建好自己的鏡像倉庫后會顯示操作指南 身份登錄 將鏡像推送到Registry 可以在鏡像倉庫中進行查看 拉取鏡像 default.conf 1.root:設(shè)置靜態(tài)

    2024年04月17日
    瀏覽(39)
  • Unity項目發(fā)布谷歌AAB+PAD

    Unity項目發(fā)布谷歌AAB+PAD

    一切的根源都在谷歌商店。 谷歌商店一直對上架的應(yīng)用和游戲有嚴格的要求。最早期的時候,谷歌商店要求apk容量限制在50mb內(nèi),后來隨著應(yīng)用的普遍容量增大,谷歌商店把apk的容量限制放寬到100mb。 但對于游戲來說,100mb的容量明顯不夠用。于是谷歌在早期提出了apk+obb(Opa

    2023年04月24日
    瀏覽(25)
  • unity webGL與js 交互(獲取地址欄URL)

    unity webGL與js 交互(獲取地址欄URL)

    1.unity傳值給js unity中: js中: 2.js傳值給unity 參數(shù)一 Cookie:場景中物體的名稱 (最上層父物體名字,否則無法成功傳值) 參數(shù)二 OnCookie_Callback:方法名稱 參數(shù)三 result:值 unity中: 完整: unity場景中物體的名稱 ?untiy代碼: js代碼:

    2024年02月04日
    瀏覽(23)
  • webpack項目和vue項目發(fā)布,瀏覽器存在緩存

    webpack項目和vue項目發(fā)布,瀏覽器存在緩存

    項目打包的js(css也是一致)名稱都采用哈希值 問題:哈希值在有些情況下打包會不變,導(dǎo)致瀏覽器使用自己緩存的資源 解決:每次打包出來增加時間戳每次打包后的js名稱都不一致 1.js處理 每個項目的打包邏輯都不一樣,根據(jù)package.json中的打包指令找到執(zhí)行的文件修改 st

    2024年02月16日
    瀏覽(23)
  • 將vue項目變成可發(fā)布的npm包項目

    將vue項目變成可發(fā)布的npm包項目

    第一步: 在main.ts 文件的平級上新建一個index.ts文件 ,文件中導(dǎo)出你想發(fā)布的組件 第二步: 在package.json文件的平級上新建index.js文件? 第三步: 修改package.json文件,新增命令? ? ?\\\"buildnpm\\\":?\\\"vue-cli-service?build?--target?lib?--name?preview?src/index.ts\\\"

    2024年02月07日
    瀏覽(14)
  • 【Hololens2目標檢測】YoloDetectionHoloLens-Unity項目發(fā)布記錄

    【Hololens2目標檢測】YoloDetectionHoloLens-Unity項目發(fā)布記錄

    win10專業(yè)版 Unity2019.4 VS2017( 一定要用這個版本的VS! ) Hololens2(打開開發(fā)者模式) win10 SDK 10.0.19041.0 項目來源:YoloDetectionHoloLens-Unity 這是一個使用Hololens進行目標檢測的項目。Hololens端負責(zé)采集和顯示,電腦端處理圖像,并標注,將標注框傳回Holo端進行顯示。 具體的項目發(fā)

    2024年02月09日
    瀏覽(37)
  • Jenkins+vue發(fā)布項目

    Jenkins+vue發(fā)布項目

    在Jenkins 中先創(chuàng)建一個任務(wù)名稱 然后進行下一步,放一個項目 填寫一些參數(shù) 參數(shù)1: 參數(shù)2: 參數(shù)3: 參數(shù)4: 點擊保存就行了 配置腳本 在harbor網(wǎng)站里創(chuàng)建一個項目對應(yīng) harbor_project 與腳本相互對應(yīng), 如果不創(chuàng)建,鏡像創(chuàng)建不成功 在下面這個網(wǎng)站里創(chuàng)建一個 k8s_namespace 與上面

    2024年02月07日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包