Unity2021发布WebGL与网页交互问题的解决
作者:ttod 时间:2023-01-27 23:44:17
(一)首先说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 手册
来源:https://blog.csdn.net/ttod/article/details/121034263
标签:Unity2021,WebGL,网页交互
0
投稿
猜你喜欢
java 获取当前时间的三种方法
2022-10-11 21:54:04
Java中的static关键字修饰属性和方法(推荐)
2021-09-29 05:46:20
logback使用filter过滤日志操作
2022-07-11 03:20:27
SpringBoot 整合mybatis+mybatis-plus的详细步骤
2022-09-29 21:06:10
详解Java包装类及自动装箱拆箱
2023-11-14 21:13:23
使用java8 API遍历过滤文件目录及子目录和隐藏文件示例详解
2023-08-29 02:42:29
Android仿QQ微信侧滑删除效果
2023-07-08 11:22:15
SpringBoot微信消息接口配置详解
2023-08-23 09:51:21
Java中transient关键字的详细总结
2021-12-11 03:19:33
Android实现微信登录的示例代码
2022-04-04 15:55:56
springboot读取配置文件中的参数具体步骤
2023-11-29 05:46:14
Mybatis order by 动态传参出现的问题及解决方法
2022-07-26 04:13:09
简单了解java自定义和自然排序
2022-01-29 02:47:26
Java 栈与队列超详细分析讲解
2023-08-15 01:09:07
Android实现带列表的地图POI周边搜索功能
2022-09-17 02:48:35
对C#中public、private、protect的区别说明
2021-05-30 22:11:21
你可知HashMap为什么是线程不安全的
2021-12-10 20:14:59
C#-WinForm跨线程修改UI界面的示例
2022-01-14 13:25:44
WPF实现多运算符表达式计算器
2023-07-17 10:31:40
C#图像处理之木刻效果实现方法
2022-05-20 04:28:13