vue使用iframe内嵌unity模型,并且向模型传递信息,接受信息

1 静态模型地址

放在跟src同级的static里边,testHtml就是需要嵌的网页

2 TestHtml文件内容

html 复制代码
<body>
    <div id="unity-container">
        <canvas id="unity-canvas"></canvas>
    </div>

    <script src="Build/KEIPER_12_18.loader.js"></script>
    <script>
        let unityInstance = null;

        createUnityInstance(document.querySelector("#unity-canvas"), {
            dataUrl: "Build/KEIPER_12_18.data",
            frameworkUrl: "Build/KEIPER_12_18.framework.js",
            codeUrl: "Build/KEIPER_12_18.wasm",
            streamingAssetsUrl: "StreamingAssets",
            companyName: "DefaultCompany",
            productName: "KEIPER_2025_1211",
            productVersion: "1.0",
        }).then(instance => {
            unityInstance = instance;
            console.log("Unity loaded");

            window.addEventListener('message', (event) => {
                console.log("模型收到来自父窗口的消息:", event.data)
                if (event.data.type == 'call-callUnity') {
                    callUnity(JSON.stringify(event.data.data));

                }
            })

            
        });


        function callUnity(msg) {
            if (!unityInstance) {
                console.warn("Unity not ready");
                return;
            }

            //进行切片发送
            const jsonStr = typeof msg === "string" ? msg: JSON.stringify(msg);          
            const size = 1024;
            const total = Math.ceil(jsonStr.length/size);

            for(let i=0;i<total;i++){
                const chunk = jsonStr.substr(i * size, size);
                strNew =  i + "/" + total + "|" + chunk;
                unityInstance.SendMessage(
                    "WebGLSendAndReceiver",
                    "OnReceiveMessage",
                    i + "/" + total + "|" + chunk
                );

               //alert(strNew);

            }
        }

        // Unity → HTML(给 Unity 调用)
        function OnReceiveFromUnity(message) {
            /*  alert("Unity 传来的参数是:\n\n" + message); */
            console.log("从Unity接收到的消息:", message);

            const msgObject = {
                type: 'unity-message',
                data: message
            };
            try {
                window.top.postMessage(msgObject, '*');
            } catch (error) {
                console.error("发送消息失败:", error);
            }
        }


    </script>

</body>

主要就是两个方法

1、监听unity发来的消息,然后包装一下,等待发给vue

bash 复制代码
function OnReceiveFromUnity(message) {
    /*  alert("Unity 传来的参数是:\n\n" + message); */
    console.log("从Unity接收到的消息:", message);

    const msgObject = {
        type: 'unity-message',
        data: message
    };
    try {
        window.top.postMessage(msgObject, '*');
    } catch (error) {
        console.error("发送消息失败:", error);
    }
}

2、监听来自vue的消息,切片发送给unity

bash 复制代码
 window.addEventListener('message', (event) => {
		console.log("模型收到来自父窗口的消息:", event.data)
    if (event.data.type == 'call-callUnity') {
        callUnity(JSON.stringify(event.data.data));

    }
})

3 vue文件代码

bash 复制代码
<iframe style="width: 1920px;height:1080px;" id="modelRef" ref="modelRef" src="static/KEIPER_12_18/TestHtml.html" frameborder="0" @load="onModelLoad"></iframe>

load方法是模型加载后会执行,监听来自unity发送的消息

bash 复制代码
 onModelLoad() {
   window.addEventListener('message', function (event) {
        if (event.data.type == 'unity-message') {
            console.log('收到来自unity的消息:', event.data);
            this.testId = event.data.data
            this.getDialogData(this.testId)
        }
    }.bind(this));
},

4 给unity传信息

bash 复制代码
sendMessageToIframe(message) {
  const iframe = this.$refs.modelRef;
    if (!iframe) {
        console.error('无法获取iframe引用');
        return;
    }
   let newMessage = {
       type: 'call-callUnity',
       data:message
   };
    //console.log('向unity发送消息---------------vue:', newMessage);
    iframe.contentWindow.postMessage(newMessage, '*');
},
相关推荐
码艺-Alimjan2 小时前
Vben Admin 新增维吾尔语 Vben-Modal的关键坑之一
前端·javascript·vue.js
可乐鸡翅yeah_3 小时前
hls.js 手动自定义 http 请求 loader,修改请求头实战
开发语言·前端·javascript·网络协议·http·ecmascript·m3u8在线
IT_陈寒3 小时前
Vite静态资源导入这个坑我帮你们踩过了
前端·人工智能·后端
广州华水科技3 小时前
大坝安全监测解决方案:单北斗GNSS形变监测系统应用与维护
前端
星光开发者4 小时前
基于决策树随机森林算法的小说推荐系统的设计与实现-计算机毕设【课程设计】78485
vue.js·算法·微信小程序·django·php·课程设计·express
yivifu4 小时前
中文古籍电子书注释集成
前端·javascript·python·beautifulsoup·epub
vx_Biye_Design4 小时前
springboot高校选课系统82776-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·spring·课程设计·express
niyongsheng5 小时前
后端零改动,给若依换一套现代化前端
vue.js·开源·node.js
默_笙5 小时前
🛴 从散件到整机:DeepAgents 与 Agent 身上预留的那些"插槽"(前置介绍)
前端·javascript
zhangzeyuaaa5 小时前
深入理解 Ruby 运算符:本质、分类、坑点与重载实战
开发语言·前端·ruby