Unity2021发布WebGL与网页交互问题的解决

目录
  • (一)首先说Unity调用页面方法的办法。
  • (二)其次说说页面方法调用Unity内方法的办法。

(一)首先说Unity调用页面方法的办法。

首先是需要在工程的Asset目录里面建一个Plugins文件夹,然后在文件夹里面创建一个.txt文件,名字倒是无所谓,创建好后要把扩展名改成.jslib。文件要包含类似如下内容:

mergeInto(LibraryManager.library, {

  Hello: function () {
    window.alert("Hello, world!");
  },

  HelloString: function (str) {
    window.alert(Pointer_stringify(str));
  },

  PrintFloatArray: function (array, size) {
    for(var i = 0; i < size; i++)
    console.log(HEAPF32[(array >> 2) + i]);
  },

  AddNumbers: function (x, y) {
    return x + y;
  },

  StringReturnValueFunction: function () {
    var returnStr = "bla";
    var bufferSize = lengthBytesUTF8(returnStr) + 1;
    var buffer = _malloc(bufferSize);
    stringToUTF8(returnStr, buffer, bufferSize);
    return buffer;
  },

  BindWebGLTexture: function (texture) {
    GLctx.bindTexture(GLctx.TEXTURE_2D, GL.textures[texture]);
  },

});

这其中只有mergeInto的第二个参数是可以修改的,第二个参数是一个对象,这个对象里面包含了多个方法的引用,这些方法(例如:Hello()、BingdeWebGLTexture()等)都是在Unity编程中可以引入的。这些方法内调用的方法(例如:wiindow.alert()、GLctx.bindTexture()等)都是将来页面中可以被调用的。

具体在Unity编程中引入方法的方式以C#为例:

首先需要引入命名空间:

using System.Runtime.InteropServices;

其次需要写具体引入代码:

[DllImport("__Internal")] private static extern void Hello();

参考以下代码引入和使用示例

using UnityEngine;
using System.Runtime.InteropServices;

public class NewBehaviourScript : MonoBehaviour {

    [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);

    void Start() {
        Hello();

        HelloString("This is a string.");

        float[] myArray = new float[10];
        PrintFloatArray(myArray, myArray.Length);

        int result = AddNumbers(5, 7);
        Debug.Log(result);

        Debug.Log(StringReturnValueFunction());

        var texture = new Texture2D(0, 0, TextureFormat.ARGB32, false);
        BindWebGLTexture(texture.GetNativeTextureID());
    }
}

(二)其次说说页面方法调用Unity内方法的办法。

简单说就是使用unityInstance发消息就行了。具体方法定义如下:

unityInstance.SendMessage(objectName, methodName, value);

其中的参数objectName是Unity场景列表中的物体的名字,这里注意要保证场景中只有一个叫这个名字的物体,别出现重名的,否则乱套了。methodName是发消息的方法名,value是方法的参数,这个参数可以没有,有的话可以是整数或者字符串。

具体使用方式参考如下:

unityInstance.SendMessage('MyGameObject', 'MyFunction');
unityInstance.SendMessage('MyGameObject', 'MyFunction', 5);
unityInstance.SendMessage('MyGameObject', 'MyFunction', 'MyString');

不过这个unityInstance是内部对象(我不知道怎么说这个话比较准确,暂时先这么说吧。),如果要在外部引用这个对象,页面代码请参考如下:

var myGameInstance = null;
      createUnityInstance(canvas, config).then((unityInstance) => {myGameInstance = unityInstance;});

var SendCmd = function(funName){
        myGameInstance.SendMessage("ZongCai", funName);
}

这样就是使用myGameInstance获得了unityInstance的引用,可以用myGameInstance来发消息了。

官方参考:

WebGL:与浏览器脚本交互 - Unity 手册

到此这篇关于Unity2021发布WebGL与网页交互问题的解决的文章就介绍到这了,更多相关Unity2021发布WebGL与网页交互内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 旧项目升级新版Unity2021导致Visual Studio无法使用的问题

    在项目开发过程中,不可避免的会升级开发工具.这次我在旧项目版本升级到新版Unity2021.2.x时,出现Visual Studio无法定位等问题.经过查阅资料将问题解决了,在这里为后来者提供一点帮助. Unity升级新版后,会出现的情况: 1.双击脚本会单独打开Visual Studio,类似下图 2.使用 Assets → Open C# Project,无法正常开启Visual Studio.可能直接打开项目目录 3.无法正常的生成解决方案,等等 4.新建工程可以正常使用 如有以上情况,可

  • Unity2021发布WebGL与网页交互问题的解决

    目录 (一)首先说Unity调用页面方法的办法. (二)其次说说页面方法调用Unity内方法的办法. (一)首先说Unity调用页面方法的办法. 首先是需要在工程的Asset目录里面建一个Plugins文件夹,然后在文件夹里面创建一个.txt文件,名字倒是无所谓,创建好后要把扩展名改成.jslib.文件要包含类似如下内容: mergeInto(LibraryManager.library, { Hello: function () { window.alert("Hello, world!&qu

  • C#在WinForm中使用WebKit传递js对象实现与网页交互的方法

    本文实例讲述了C#在WinForm中使用WebKit传递js对象实现与网页交互的方法.分享给大家供大家参考,具体如下: 有个项目要使用WebBroswer控件,并且要能传递一个js对象供前台调用,用c#的WebBroswer控件很容易实现: private void Form1_Load(object sender, EventArgs e) { WebBrowser wb = new WebBrowser(); wb.ObjectForScripting = new myClass(); }

  • swf和网页交互本地测试的注意事项

    注意是在本地测试 一.编码格式,如果是utf-8编码则直接打开页面内含有object对象时会提示是否加载控件,如果改为gb2312编码则没有提示 二,如果以gb2312编码的网页往页面中的swf对象传递参数中包含中文字符时,swf收到后需进行如下转码: var BA:ByteArray = new ByteArray; BA.writeMultiByte(value,"utf-8"); BA.position = 0; value=BA.readMultiByte(BA.length,

  • 四个常见html网页乱码问题及解决办法

    上周同事在做网页时,遇到网页打开之后都是乱码,同事很迷茫了,不知道该怎么解决,下面是小编抽时间把比较常见的html网页乱码问题及解决办法整理分享给大家. 其实导致网页乱码主要有几个原因,以下给出解决方法. 1.HTML的字符编码问题 该问题较常见,也是最明显和最容易解决的. 在网页<head>中加上: <meta http-equiv="Content-Type" Content="text/html;charset=utf8"/> 即可.

  • 详解微信小程序与内嵌网页交互实现支付功能

    上个月,小程序开放了新功能,支持内嵌网页,所以我就开始了小程序内嵌网页之路,之前我只是个小安卓. 内嵌网页中可使用JSSDK 1.3.0提供的接口,可坑就来了,居然不支持支付接口的调用,经过一番研究,总算打通了两边的交互. 大概流程 1.先说明涉及到的文件,下面会用到 1.1 app.js:小程序的app.js文件,在globalData里定义一个全局变量paySuccessUrl: '',用来保存支付成功跳转url 1.2 wxminiwebview.js:小程序中放web-view的界面 1

  • jQuery快速高效制作网页交互特效

    jQuery中的事件 1,基础事件 基础事件又包括 a:window事件 在javaScript中的window事件又  window onload = fn(); 和onclick  在jQuery中常用的事件有文档就绪事件,对应的方法ready() $(document).ready(fn(){}); b:鼠标事件 常用的鼠标事件有: click(fn);         单机鼠标时发生,fn表示绑定的函数 keydown(fn);  鼠标指针移过时,fn表示绑定函数 blur(fn)   

  • IE无法打开网页的常见问题与解决方法

    一.网络设置的问题 这种原因比较多出现在需要手动指定IP.网关.DNS服务器联网方式下,及使用代理服务器上网的.仔细检查计算机的网络设置.  二.DNS服务器的问题  当IE无法浏览网页时,可先尝试用IP地址来访问,如果可以访问,那么应该是DNS的问题,造成DNS的问题可能是连网时获取DNS出错或DNS服务器本身问题,这时你可以手动指定DNS服务(地址可以是你当地ISP提供的DNS服务器地址,也可以用其它地方可正常使用DNS服务器地址.)在网络的属性里进行,(控制面板-网络和拔号连接-本地连接-

  • utf-8 网页不显示+utf-8网页乱码的通用解决方法

    在windows操作系统上使用IE作为浏览器时.常常会发生这样的问题:在浏览使用UTF-8编码的网页时,浏览器无法自动侦测(即没有设定"自动选择"编码格式时)该页面所用的编码.即使网页已经声明过编码格式: <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 由此造成某些含有中文UTF-8编码的页面产生空白输出. 如果使用的是Mozilla.Mozi

  • Node.js抓取中文网页乱码问题和解决方法

    Node.js 抓取非 utf-8 的中文网页时会出现乱码问题,比如网易的首页编码是 gb2312,抓取时会出现乱码 复制代码 代码如下: var request = require('request')  var url = 'http://www.163.com' request(url, function (err, res, body) {      console.log(body) }) 可以使用 iconv-lite来解决 安装 复制代码 代码如下: npm install ico

  • iis、apache、nginx使用X-Frame-Options防止网页被Frame的解决方法

    当然也是因为被360检测到了示"X-Frame-Options头未设置",根据360的提示与百度了一些网上的一些资料整理了下,完美解决问题. 首先看下360给出的方案,但么有针对服务器的具体设置,不是每个人对服务器都很懂啊. 描述: 目标服务器没有返回一个X-Frame-Options头. X-Frame-Options HTTP响应头是用来确认是否浏览器可以在frame或iframe标签中渲染一个页面,网站可以用这个头来保证他们的内容不会被嵌入到其它网站中,以来避免点击劫持. 危害: 攻击者可

随机推荐