方法1:将C#方法传给js,js调用方法回调返回的方式
-
C#
参考链接:WebGL throwing abort(104) on callback from .jslib function
using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using AOT;
using UnityEngine;
public class Token : MonoBehaviour {
[DllImport ("__Internal")]
//方法名与参数返回值要与jslib里的方法名一模一样
public static extern void ProvideCallback (Action<string> action);
void Start () {
ProvideCallback (Callback);
}
// 需要加MonoPInvokeCallback 标记
[MonoPInvokeCallback (typeof (Action<string>))]
public static void Callback (string arg) {
Debug.Log (arg.ToString());
}
}
1.C#绑定js方法 ProvideCallback 方法名、返回值、参数数量要与jslib一模一样
2.要传入js的方法要加MonoPInvokeCallback
-
jslib
var LibraryJsCallCsTest = {
$JsCallCsTest: {},
ProvideCallback: function (obj) {
var returnStr = "error";
var bufferSize = lengthBytesUTF8(returnStr) + 1;
var buffer = _malloc(bufferSize);
stringToUTF8(returnStr, buffer, bufferSize);
JsCallCsTest.callback = obj;
Runtime.dynCall('vi', JsCallCsTest.callback, [buffer]);
}
};
autoAddDeps(LibraryJsCallCsTest, '$JsCallCsTest');
mergeInto(LibraryManager.library, LibraryJsCallCsTest);
1.返回的字符串需要转为字节数组
function getPtrFromString(str) {
var buffer = _malloc(lengthBytesUTF8(str) + 1);
stringToUTF8(str, buffer, str.length + 1);
return buffer;
}
2.用$variableName开头声明的变量要用autoAddDeps(LibraryJsCallCsTest, '$variableName');注册。如果一个方法被另一个方法调用,也要加$MethodName号,并注册
3.Runtime.dynCall('vi', JsCallCsTest.callback, [buffer]); 方法里vi里v指的是返回值是void,i值是int或指针类型,字节数组是指针类型,所以:
//没有参数是
Runtime.dynCall('v', JsCallCsTest.callback);
// 一个参数是
Runtime.dynCall('vi', JsCallCsTest.callback, [param1]);
//两个参数是
Runtime.dynCall('vii', JsCallCsTest.callback, [param1, param2]);
//三个参数是
Runtime.dynCall('viii', JsCallCsTest.callback, [param1, param2, param3]);
//四个参数是
Runtime.dynCall('viiii', JsCallCsTest.callback, [param1, param2, param3, param4]);
- 更多Runtime.dynCall调用的参考,什么类型对应什么符号的对应关系等
js调用unity方法二:SendMessage方法
SendMessage(unity_gameObjectName, gameObject_Method_Name, [string_params])
- unity_gameObjectName:unity里gameobject的名字,需要先调用js传进来,或写死
- gameObject_Method_Name: unity里绑定组件里的方法名,需要先调用js传进来,或写死
-
[string_params]: 可选的方法的参数,为字符串,如果有多个参数可以用字符串拼接好再传入,如
123|内容文本
到C#里再用Split分割,或者json等。如果没有参数,可以不传
-
C#调js返回字符串
[DllImport ("__Internal")]
//方法名与参数返回值要与jslib里的方法名一模一样
public static extern string GetInfo();
jslib写成
function GetInfo() {
var str = string_variable;
if(str == null)
return null;
var buffer = _malloc(lengthBytesUTF8(str) + 1);
stringToUTF8(str, buffer, str.length + 1);
return buffer;
}
-
C#调js返回int
js里直接return相应的数字即可
-
C#传字符string参数给js
C#传字符串给js,js拿到的是指针,用Pointer_stringify(str)转换一下即可
更多参考
C# - .jslib 2-way communication
https://github.com/emscripten-core/emscripten/blob/ee17f05c0a45cad728ce0f215f2d2ffcdd75434b/src/library_browser.js#L715