Unity WebGL、js发布交互

官网参考
Unity3D开发之WebGL平台上 unity和js前端通信交互

在这里插入图片描述
在这里插入图片描述

WebFun.jslib

mergeInto(LibraryManager.library, {JSLog: function (str) { var strs=UTF8ToString(str); Log(str); Log(strs);}, Hello: function () {var strs="Hello, world!"; Log(strs); Log(UTF8ToString(strs)); }, HelloString: function (str) { Log(str); Log(UTF8ToString(strs)); }, PrintFloatArray: function (array, size) { var strs="";for(var i = 0; i < size; i++){var data =   HEAPF32[(array >> 2) + i]; strs+=data;if(i!=size-1){strs+=",";}}  Log(strs); Log(UTF8ToString(strs)); }, AddNumbers: function (x, y) { var data = x + y; Log(data); Log(UTF8ToString(data)); return data;}, StringReturnValueFunction: function () {var returnStr = "bla";var bufferSize = lengthBytesUTF8(returnStr) + 1;var buffer = _malloc(bufferSize);stringToUTF8(returnStr, buffer, bufferSize); Log(buffer);Log(UTF8ToString(buffer)); return buffer;}, BindWebGLTexture: function (texture) { GLctx.bindTexture(GLctx.TEXTURE_2D, GL.textures[texture]);var strs="BindWebGLTexture";Log(strs);Log(UTF8ToString(strs)); 	}, 
});

unitywebdata.js


// 网页端 JavaScriptvar  gameInstance function setgameInstance( gameIn)
{ LogTip("setgameInstance 33 :");gameInstance = gameIn;LogTip("setgameInstance 333 :"+(gameInstance==null||gameInstance==undefined));
}function LogTip(str)
{// console.log(str); window.alert(str);
}function Log(str)
{  SendToUnity(str)
}function SendToUnity(message) {//发送消息给unity //第一个参数:挂在脚本的物体 //第二个参数:unity被调用的函数 //第三个参数:函数传入的参数gameInstance.SendMessage('Demo', 'JSCallUnity', message);
}function SetFunPos(cname, cvalue, exdays) {   //exdays表示天数var d = new Date();d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000));var expires = "expires=" + d.toGMTString(); document.cookie = cname + "=" + cvalue + "; " + expires;LogTip(`SetFunPos\r\ncname=${cname}:${cvalue};${exdays}\r\ncname=${cname}:${cvalue};${expires}` );
}function GetFunPos (cname) {var returnArg;    //传出去的参数var name = cname + "=";var ca = document.cookie.split(';');for (var i = 0; i < ca.length; i++) {var c = ca[i].trim();if (c.indexOf(name) == 0) {returnArg = c.substring(name.length, c.length);LogTip(`GetFunPos\r\ncname=${cname}:${returnArg}` );//gameInstance.SendMessage("Test", "ReciveCookieMsg", returnArg);//发送消息给unity //第一个参数:挂在脚本的物体 //第二个参数:unity被调用的函数 //第三个参数:函数传入的参数gameInstance.SendMessage('Demo', 'JSCallUnityRespone', returnArg);return; // returnArg;}}return "";
}
using UnityEngine;
using System.Runtime.InteropServices;
using UnityEngine.UI;public class UnityWebCtrl : MonoBehaviour
{#region WebFun.jslib//This Log method is the one written by the front end// Several methods can be added here. Remember to separate the methods with commas.// Otherwise, an error will be reported when packaging on the WebGL platform//When packaging, there cannot be any Chinese characters in jslib. Annotations are not acceptable either. Otherwise, this error will be reported.//Building Library\Bee\artifacts\WebGL\build\debug_WebGL_wasm\build.js failed with output:[DllImport("__Internal")]private static extern void Hello();[DllImport("__Internal")]private static extern void HelloString(string str);[DllImport("__Internal")]private static extern void PrintFloatArray(float[] array, int size);[DllImport("__Internal")]private static extern int AddNumbers(int x, int y);[DllImport("__Internal")]private static extern string StringReturnValueFunction();[DllImport("__Internal")]private static extern void BindWebGLTexture(int texture);[DllImport("__Internal")]private static extern void JSLog(string str); //此处传入的类型和调用时候传入的数据类型一定要一致#endregionvoid Start(){AddText( "********************");}private void Update(){if (Input.GetKeyDown(KeyCode.O)){UnityCallJs();}if (Input.GetKeyDown(KeyCode.P)){ UnityCallJs_old(); }if (Input.GetKeyDown(KeyCode.K)){AddText($"***456asd123***");}}void UnityCallJs_old(){ int num = System.DateTime.Now.Second;AddText($"SetFunPos:{num}");Application.ExternalCall("SetFunPos", "PosX", num);AddText($"GetFunPos:{num}");Application.ExternalCall("GetFunPos", "PosX");}void UnityCallJs(){ AddText($"***456艾斯黛拉看123***");string msg = null;AddText($"Reqset  Hello:");Hello();msg = "This is a string.";AddText($"Reqset  HelloString:{msg}");HelloString(msg);float[] myArray = new float[10];AddText($"Reqset  PrintFloatArray:");PrintFloatArray(myArray, myArray.Length);AddText($"Reqset  AddNumbers:5,7");int result = AddNumbers(5, 7);AddText($"Respone  AddNumbers:{result}");AddText($"Reqset  StringReturnValueFunction:");msg = StringReturnValueFunction();AddText($"Respone  StringReturnValueFunction:{msg}");AddText($"Reqset  BindWebGLTexture:");var texture = new Texture2D(0, 0, TextureFormat.ARGB32, false);BindWebGLTexture(texture.GetNativeTextureID());AddText($"Reqset  JSLog:");JSLog("666");}public void JSCallUnity(string msg)//web js 回调{AddText($"JSCallUnity Receive:{msg}");}public  void JSCallUnityRespone(string str) //web js 回调{  AddText($"JSCallUnityRespone Receive:{str}");}[SerializeField] private Text text;private void AddText(string value){if (text == null)return;text.text += $"[{System.DateTime.Now.ToString()}]:{value}\r\n"  ;}
}

index.html 补充

<script>var buildUrl = "Build";var loaderUrl = buildUrl + "/demoTests.loader.js";var config = {dataUrl: buildUrl + "/demoTests.data",frameworkUrl: buildUrl + "/demoTests.framework.js",codeUrl: buildUrl + "/demoTests.wasm",streamingAssetsUrl: "StreamingAssets",companyName: "DefaultCompanyTest",productName: "EnhanceScrollView",productVersion: "1.1",showBanner: unityShowBanner,};var canvas = document.querySelector("#unity-canvas")function loadScript(url, callback) { var script = document.createElement("script"); script.type = "text/javascript";  script.src = url; script.onload = callbackdocument.head.appendChild(script); }; createUnityInstance(canvas, config, (progress) => {}).then((unityInstance) => { // window.alert("setgameInstance 00");loadScript("unitywebdata.js", (script2)=> {// window.alert("setgameInstance 11"); // script2.setgameInstance(unityInstance);//Errorvar fun = setgameInstance; //引用abc函数fun(unityInstance); }); }); </script>

IIS web.config

<?xml version="1.0" encoding="UTF-8"?>
<configuration><system.webServer><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" /><mimeMap fileExtension=".ab" mimeType="application/octet-stream" /><mimeMap fileExtension=".br" mimeType="application/octet-stream" />  <!-- <mimeMap fileExtension=".wmv" mimeType="application/octet-stream" /> --></staticContent><directoryBrowse enabled="true" /><httpProtocol><customHeaders><add name="Access-Control-Allow-Credentials: " value="true" /><add name="Access-Control-Allow-Headers" value="Accept, X-Access-Token, X-Application-Name, X-Request-Sent-Time" /><add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS" /><add name="Access-Control-Allow-Origin" value="*" /></customHeaders></httpProtocol></system.webServer>
</configuration>

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

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

相关文章

Spark 之 YarnCoarseGrainedExecutorBackend

YarnCoarseGrainedExecutorBackend executor ID , 在日志里也有体现。 25/05/06 12:41:58 INFO YarnCoarseGrainedExecutorBackend: Successfully registered with driver 25/05

[HOT 100] 2646. 最小化旅行的价格总和

文章目录 1. 题目链接2. 题目描述3. 题目示例4. 解题思路5. 题解代码6. 复杂度分析 1. 题目链接 2646. 最小化旅行的价格总和 - 力扣&#xff08;LeetCode&#xff09; 2. 题目描述 现有一棵无向、无根的树&#xff0c;树中有 n 个节点&#xff0c;按从 0 到 n - 1 编号。给你一…

分析 Docker 磁盘占用

以下是分析 Docker 磁盘占用的详细步骤和工具指南&#xff0c;帮助开发者快速定位和清理冗余数据&#xff1a; 1. 查看 Docker 磁盘使用概览 docker system df 输出说明&#xff1a; TYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 15 …

聊一聊接口测试中的参数化测试

目录 一、核心概念 二、适用场景 三、参数化测试的核心目的 四、实现参数化测试的关键步骤 4.1 定义测试数据 4.2 使用测试框架参数化功能 4.3 执行测试与结果分析 五、最佳实践与注意事项 六、工具推荐 那参数化测试的目的是什么&#xff1f;应该是为了提高测试覆盖率…

Go语言——string、数组、切片以及map

一、string、数组、切片代码 package mainimport "fmt"// 定义结构体 type student struct {id intname stringage intscore float32 }func main() {// 使用var声明切片var slice1 []intslice1 append(slice1, 1)slice1 append(slice1, 2)slice1 append(sl…

Android 开发中JDK 的使用和配置详解

前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下"通俗易懂,风趣幽默",感觉非常有意思,忍不住分享一下给大家。 👉点击跳转到教程 在安卓开发中, 我们会使用到Java的JDK, JDK全程为(Java Development Kit)意思是:Java开发工具包。那么JDK 与我们的…

MPay码支付系统第四方聚合收款码多款支付插件个人免签支付源码TP8框架全开源

一、源码描述 这是一套码支付源码&#xff08;MPay&#xff09;&#xff0c;基于TP8框架&#xff0c;前端layui2.9后端PearAdmin&#xff0c;专注于个人免签收款&#xff0c;通过个人的普通收款码&#xff0c;即可实现收款通知自动回调&#xff0c;支持绝大多数商城系统&#…

国产数据库铸就数字基建新基石,助力农业产业转型升级

中国科技企业以自主创新突破技术壁垒&#xff0c;为全球产业链重构注入新动能。广东辰宜信息科技有限公司&#xff08;以下简称“辰宜科技”&#xff09;凭借自主研发的“博流分布式多模数据库”等核心技术&#xff0c;作为支持数据流通的关键技术支撑&#xff0c;实现中国基础…

《人工智能:如何重塑教育模式与学习图景》

《人工智能&#xff1a;如何重塑教育模式与学习图景》 引言 人工智能&#xff0c;特别是大型语言模型&#xff08;如GPT-4/ChatGPT&#xff09;&#xff0c;正以前所未有的速度影响教育领域。从基础教育到高等教育&#xff0c;再到职业教育&#xff0c;传统教学模式正在被重新审…

硬件工程师面试常见问题(14)

第六十六问&#xff1a;运放--输入偏置电流和输入失调电流 输入偏置电流lb&#xff1a;是由于运放两个输入极都有漏电流的存在。实际的运放,会有电流流入运放的输入端的。那么输入偏置电流就定义这两个电流的平均值。 输入失调电流 Ios&#xff1a;定义为两个差分输入端偏置电…

Docker+Kubernetes落地指南:从单机到集群的平滑迁移

一、为何必须升级到Kubernetes&#xff1f; 1.1 单机Docker的瓶颈 单机环境痛点&#xff1a; ├─ 资源利用率不均衡&#xff08;CPU飙高 vs 内存闲置&#xff09; ├─ 服务扩容需手动操作 ├─ 零宕机更新难以实现 └─ 网络配置复杂&#xff08;跨主机通信困难&am…

HttpPrinter 是一款功能强大的跨平台 Web 打印解决方案

HttpPrinter 是一款功能强大的跨平台 Web 打印解决方案&#xff0c;支持多种编程语言和打印场景&#xff0c;适用于企业级报表打印、静默打印、远程打印等需求。以下是其核心功能、技术特点及使用方法的综合分析&#xff1a; 一、核心功能与特点 跨平台与多语言支持 支持 Java…

Selenium Web自动化测试学习笔记(一)

自动化测试 技术手段模拟人工&#xff0c;执行重复性任务&#xff0c;准确率100%&#xff0c;高于人工 selenium 可通过浏览器驱动控制浏览器&#xff0c;通过元素定位模拟人工&#xff0c;实现web自动化&#xff0c;没有焦点&#xff08;把浏览器放在最小化依然可以&#x…

TikTok 矩阵运营新手实操保姆级教程 2.0 版本

在当下这个全球化的数字浪潮中&#xff0c;TikTok 这片充满机遇的流量蓝海&#xff0c;正吸引着无数创业者和品牌方争相角逐。而要想在这激烈的竞争中脱颖而出&#xff0c;TikTok 矩阵运营无疑是至关重要的制胜法宝。今天&#xff0c;就给大家送上这份超实用的新手实操教程&…

使用DeepSeek协助恢复历史数据

最近&#xff0c;工作中遇到比较老的数据库备份文件数据恢复的问题。过程中使用DeepSeek分析&#xff0c;很快的解决了从除备份文件本身其他信息一概不知的条件下&#xff0c;数据库选型问题和环境搭建问题。下面把实施过程分享出来&#xff0c;给其他遇到相同问题的小伙伴提供…

【特殊场景应对6】频繁跳槽:行业特性与稳定性危机的解释边界

写在最前 作为一个中古程序猿,我有很多自己想做的事情,比如埋头苦干手搓一个低代码数据库设计平台(目前只针对写java的朋友),比如很喜欢帮身边的朋友看看简历,讲讲面试技巧,毕竟工作这么多年,也做到过高管,有很多面人经历,意见还算有用,大家基本都能拿到想要的offe…

企业智能化第一步:用「Deepseek+自动化」打造企业资源管理的智能中枢

随着Deepseek乃至AI人工智能技术在企业中得到了广泛的关注和使用&#xff0c;多数企业开始了AI探索之旅&#xff0c;迅易科技也不例外&#xff0c;且在不断地实践中强化了AI智能应用创新的强大能力。 为解决企业知识管理碎片化、提高内部工作效率等问题&#xff0c;迅易将目光放…

大连理工大学选修课——图形学:第三四章 基本图形生成算法

第三四章 基本图形生成算法 图形生成 概念&#xff1a;如何在指定的输出设备上&#xff0c;根据坐标描述&#xff0c;构造基本二维几何图形 基本二维几何图形&#xff1a;点、直线、圆、多边形域、字符串及相关属性等。 图形生成的概念 是在指定的输出设备上&#xff0c;根…

怎样避免住宅IP被平台识别

要有效避免住宅IP被平台识别&#xff0c;需从IP质量选择、环境参数伪装、行为模式模拟、技术细节处理等多维度构建防御体系。以下是基于行业实践的综合性解决方案&#xff1a; 一、确保住宅IP的高纯净度 选择真实家庭网络IP 验证IP是否归属真实家庭宽带&#xff08;非机房IP伪装…

WPF 触发器 Trigger

触发器 Trigger 触发器&#xff08;Trigger&#xff09;是 WPF 中的一种机制&#xff1a; 当某个条件满足时&#xff0c;自动改变控件的某些属性&#xff0c;比如颜色、大小、透明度等。 换句话说&#xff0c;就是"如果……那么就……" 的一种规则。 常见触发器类…