unity-与js交互

news2024/12/25 12:43:52

title: unity-与js交互
categories: Unity3d
tags: [unity, js, web, h5]
date: 2023-03-05 00:09:52
comments: false
mathjax: true
toc: true

unity-与js交互


前篇

  • 官方
    • WebGL:与浏览器脚本交互 - https://docs.unity3d.com/cn/2021.1/Manual/webgl-interactingwithbrowserscripting.html
  • Unity-WebGL与html页面相互调用 - https://blog.csdn.net/weixin_38484443/article/details/116018393

流程

  1. 定义 js 函数

    Assets/Plugins/WebGL 目录下创建一个 .jslib 结尾的文件, 如: mylib.jslib

    image-20230305001458754

    内容

    mergeInto(LibraryManager.library, {
    
      // 无返回值
      Func001: function(jsonBts, funcBts) {
        var jsonMsg = UTF8ToString(jsonBts) // 解码, 形参传过来的需要用 UTF8ToString 将字节数组转成 js 中的字符串
        var funcKey = UTF8ToString(funcBts) // 官方文档 Pointer_stringify 已弃用, 改成 UTF8ToString
    
        window.alert(funcKey)
    
        console.log("--- funcKey:", funcKey)
        console.log("--- jsonMsg:", jsonMsg)
      },
    
      // string 返回值
      Func002: function(jsonBts, funcBts) {
        var jsonMsg = UTF8ToString(jsonBts)
        var funcKey = UTF8ToString(funcBts)
    
        console.log("--- funcKey:", funcKey)
        console.log("--- jsonMsg:", jsonMsg)
    
        var returnStr = jsonMsg + ", From js!" // 编码, 字符串返回值, 需要将 js 中的字符串转成字节数组
        var bufferSize = lengthBytesUTF8(returnStr) + 1;
        var buffer = _malloc(bufferSize);
        stringToUTF8(returnStr, buffer, bufferSize);
        return buffer;
      },
    
      // 调用 unity 函数
      Func003: function(jsonBts, funcBts) {
        var jsonMsg = UTF8ToString(jsonBts) // 解码
        var funcKey = UTF8ToString(funcBts)
    
        console.log("--- funcKey:", funcKey)
        console.log("--- jsonMsg:", jsonMsg)
    
        var returnStr = jsonMsg + ", From js!"
        window.unityInstance.SendMessage("GameMgr", "OnNativeCall", returnStr) // go 名字, go 身上挂着的组件的 方法名, 后面就是方法参数
      },
    
    });
    
    • Func003 中用 window.unityInstance 而不是官方文档中的 unityInstance, 因为这个实例对象是不存在的, 会报错: ReferenceError: unityInstance is not defined, 所以解决办法是在 unity 初始化完后挂载 window 这个全局变量上

      在模板 index.html 文件中, 找到 createUnityInstance 方法创建完实例后挂到 window 上 (参考: https://home.gamer.com.tw/artwork.php?sn=5283743)

      createUnityInstance(canvas, config, (progress) => {
        progressBarFull.style.width = 100 * progress + "%";
      }).then((unityInstance) => {
        window.unityInstance = unityInstance; // 加上这行代码, 挂到 window 上
        loadingBar.style.display = "none";
      ...
      
  2. 定义 csharp 调用 js 方法的函数

    public class PlatformWebGL : MonoBehaviour {
    #if !UNITY_EDITOR && UNITY_WEBGL
        [DllImport("__Internal")]
        public static extern void Func001(string jsonMsg, string funcKey);
        [DllImport("__Internal")]
        public static extern string Func002(string jsonMsg, string funcKey);
        [DllImport("__Internal")]
        public static extern void Func003(string jsonMsg, string funcKey);
    #endif
    }
    
  3. 定义 js 调用 csharp 的行数

    public class Test : MonoBehaviour {
    	public void OnNativeCall(string data) {
    		LogUtil.D("--- OnNativeCall, msg: {0}", data);
    	}
    }
    
    • 这个组件挂在 go 名为 GameMgr 的对象上, 因为 js 调用函数是指定了这个 go 名和方法
  4. done. 测试代码

    #if !UNITY_EDITOR && UNITY_WEBGL
            PlatformWebGL.Func001(funcKey, jsonMsg);
    
            string retMsg = PlatformWebGL.Func002(funcKey, jsonMsg);
            LogUtil.D("--- retMsg: {0}", retMsg);
    
            PlatformWebGL.Func003(funcKey, jsonMsg);
    #endif
    
    • 结果:

      image-20230305003426026


踩坑

找不到方法

  • 报错: error: undefined symbol: Func001 (referenced by top-level compiled C/C++ code)

  • 原因: csharp 有定义 Func001 方法, js (也就是 .jslib 文件中) 没定义对应的方法, 导致链接失败


方法不匹配

  • 报错: null function or function signature mismatch
  • 原因: csharp 和 js 中的方法定义不匹配, 形参不一致 or 返回值不一致

未知错误

  • 如果遇到一些位置错误, 就打开调用栈 (虽然打包的时间长点, 但看错误很有效)

    image-20230305004133482


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

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

相关文章

JavaWeb--JSP

JSP1 JSP 概述2 JSP 快速入门2.1 搭建环境2.2 导入 JSP 依赖2.3 创建 jsp 页面2.4 编写代码2.5 测试3 JSP 原理4 JSP 脚本4.1 JSP 脚本分类4.2 案例4.2.1 需求4.2.2 实现4.2.3 成品代码4.2.4 测试4.3 JSP 缺点5 EL 表达式5.1 概述5.2 代码演示5.3 域对象6 JSTL标签6.1 概述6.2 …

Android应用启动优化笔记整理

应用启动相关流程与优化 应用启动主要涉及SystemServer进程 和 app进程。 SystemServer进程负责app进程创建和管理、窗口的创建和管理(StartingWindow 和 AppWindow)、应用的启动流程调度等。 App进程被创建后,进行一系列进程初始化、组件初…

【LinkedList】| 深度剥析Java SE 源码合集Ⅰ

目录一. 🦁 LinkedList介绍二. 🦁 结构以及对应方法分析2.1 结构组成2.1.1 节点类2.1.2 成员变量2.2 方法实现2.2.1 添加add(E e)方法2.2.2 头尾添加元素Ⅰ addFirst(E e)Ⅱ addLast(E e)2.2.3 查找get(int index)方法2.2.4 删除remove()方法三. &#x…

【云原生】整合K8s + SpringCloudK8s + gRpc + RocketMQ + Istio + Envoy

背景本文把前面的代码整理一遍,不仅仅是demo层面,而是考虑到放进生产中使用,且尽可能用高版本,关于这块技术,网上的文章真是一言难尽,要么就是个概念,要么就是把官网的demo拿过来跑一遍&#xf…

图神经网络 pytorch GCN torch_geometric KarateClub 数据集

图神经网络 安装Pyg 首先安装torch_geometric需要安装pytorch然后查看一下自己电脑Pytorch的版本 import torch print(torch.__version__) #1.12.0cu113然后进入官网文档网站 链接: https://pytorch-geometric.readthedocs.io/en/latest/install/installation.html 安装自己…

【小破站下载工具】Python tkinter 实现网站下载工具,所有数据一键获取

目录前言开发环境本次项目案例步骤先展示下完成品的效果界面导入模块先创建个窗口功能按键主要功能代码编写功能一功能二功能三前言 最近很多同学想问我,怎么把几个代码的功能集合到一起? 很简单,写一个界面就行了,想要哪个代码…

黑马程序员7

算数运算符重载 运算符重载概念:对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型 加号运算符 通过自己写函数,实现两个对象相加属性后返回新的对象 两种方式重载 成员函数方式重载 全局函数重载 上来 perso…

Go 内存分布

Go内存分布方式在C中,每个值在内存中只占据一个内存块(一段连续内存);但是,一些Go类型的值可能占据多个内存块。以后,我们称一个Go值分布在不同内存块上的部分为此值的各个值部(value part&…

网络安全平台测试赛 easyphp(phar脏数据处理)

昨天的比赛,14.00-17.00.时间有点紧张,比赛期间没拿下来这道 😭非常痛苦,很顺畅的思路 一步步想下来,卡在最后一步末尾脏数据处理了,最后时间到了 没打通,还需多练 这里本地复现一下&#xff1…

linux 进程及调度基础知识

引用Linux进程管理专题Linux进程管理与调度-之-目录导航Linux下0号进程的前世(init_task进程)今生(idle进程)----Linux进程的管理与调度(五)蜗窝科技-进程管理郭健: Linux进程调度技术的前世今生之“前世”郭健: Linux进程调度技术…

1.7 古典概型问题类型一——随机取数问题

(1)我的答案:一、信息首先7个数字全不相同二、分析七个数字全不相同意味着每次取出来的数都不一样,然后每次取出后选择少一种,为简单排列不含10和1这意味从8个数里面选且可以重复为重复排列3.10恰好出现两次隐含着两个问题,第一&a…

备考考研2数学

进度说明,开始形成自己的复习进度说明! 14:21 2023年2月28日星期二 武忠祥数学 截止目前,看完了01.高数基础01 14:21 2023年2月28日星期二 开始看02. 现在15:04 2023年2月28日星期二, 因为这2天的百度网盘不能进行解析了&…

初识HTML技术

文章目录一、为什么学习前端?二、第一个HTML文件VSCode三. HTML元素四. HTML页面一、为什么学习前端? 我们作为一个后端程序员,为什么还要学习前端,因为我们的终极目的是实现web开发,搭建网站,网站 前端 后端 比如我们随便…

最近几篇较好论文实现代码(附源代码下载)

《Towards Layer-wise Image Vectorization》(CVPR 2022) GitHub: github.com/ma-xu/LIVEInstallationWe suggest users to use the conda for creating new python environment.Requirement: 5.0<GCC<6.0; nvcc >10.0.git clone gitgithub.com:ma-xu/LIVE.gitcd LIVE…

一步一步学会给Fritzing添加元器件-丰富你的器件库

文章目录1、获取元器件文件2、单个添加元器件3、批量加入&#xff08;1&#xff09;、通过别人发布的bin文件加载&#xff08;2&#xff09;、终极大招&#xff08;拖&#xff09;4、制作自己器件文章出处&#xff1a; https://blog.csdn.net/haigear/article/details/12931545…

【C++】类和对象——六大默认成员函数

&#x1f3d6;️作者&#xff1a;malloc不出对象 ⛺专栏&#xff1a;C的学习之路 &#x1f466;个人简介&#xff1a;一名双非本科院校大二在读的科班编程菜鸟&#xff0c;努力编程只为赶上各位大佬的步伐&#x1f648;&#x1f648; 目录前言一、类的6个默认成员函数二、构造…

错误异常捕获

1、React中错误异常捕获 在 React 中&#xff0c;可以通过 Error Boundaries&#xff08;错误边界&#xff09;来捕获错误异常。Error Boundaries 是一种 React 组件&#xff0c;它可以在其子组件树的渲染期间捕获 JavaScript 异常&#xff0c;并且可以渲染出备用 UI。React 提…

802.11 service服务类型

802.11 serviceservice定义service分类按照模块分为两类按照功能分为六类数据传输相关服务分布式服务DS&#xff08;Distribution Service&#xff09;整合服务IS&#xff08;Integration Service&#xff09;关联&#xff08;association&#xff09;重关联&#xff08;reasso…

RAD 11.3 delphi和C++改进后新增、废弃及优化的功能

RAD 11.3 delphi和C改进后新增和废弃的功能 目录 RAD 11.3 delphi和C改进后新增和废弃的功能 一、版本RAD 11.3 delphi和C改进后新增功能 1、官方视频位置&#xff1a; 2、官方文档的链接位置&#xff1a; 二、版本RAD 11.3 delphi和C改进后废弃的功能 2.1、编译器不再使…

Eureka注册中心和Nacos注册中心详解以及Nacos与Eureka有什么区别?

目录&#xff1a;前言Eureka注册中心Nacos注册中心Nacos与Eureka有什么区别&#xff1f;前言提供接口给其它微服务调用的微服务叫做服务提供者&#xff0c;而调用其它微服务提供的接口的微服务则是服务消费者。如果服务A调用了服务B&#xff0c;而服务B又调用了服务C&#xff0…