方法1:將C#方法傳給js,js調(diào)用方法回調(diào)返回的方式
-
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")]
//方法名與參數(shù)返回值要與jslib里的方法名一模一樣
public static extern void ProvideCallback (Action<string> action);
void Start () {
ProvideCallback (Callback);
}
// 需要加MonoPInvokeCallback 標(biāo)記
[MonoPInvokeCallback (typeof (Action<string>))]
public static void Callback (string arg) {
Debug.Log (arg.ToString());
}
}
1.C#綁定js方法 ProvideCallback 方法名、返回值、參數(shù)數(shù)量要與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.返回的字符串需要轉(zhuǎn)為字節(jié)數(shù)組
function getPtrFromString(str) {
var buffer = _malloc(lengthBytesUTF8(str) + 1);
stringToUTF8(str, buffer, str.length + 1);
return buffer;
}
2.用$variableName開頭聲明的變量要用autoAddDeps(LibraryJsCallCsTest, '$variableName');注冊。如果一個方法被另一個方法調(diào)用,也要加$MethodName號,并注冊
3.Runtime.dynCall('vi', JsCallCsTest.callback, [buffer]); 方法里vi里v指的是返回值是void,i值是int或指針類型,字節(jié)數(shù)組是指針類型,所以:
//沒有參數(shù)是
Runtime.dynCall('v', JsCallCsTest.callback);
// 一個參數(shù)是
Runtime.dynCall('vi', JsCallCsTest.callback, [param1]);
//兩個參數(shù)是
Runtime.dynCall('vii', JsCallCsTest.callback, [param1, param2]);
//三個參數(shù)是
Runtime.dynCall('viii', JsCallCsTest.callback, [param1, param2, param3]);
//四個參數(shù)是
Runtime.dynCall('viiii', JsCallCsTest.callback, [param1, param2, param3, param4]);
- 更多Runtime.dynCall調(diào)用的參考,什么類型對應(yīng)什么符號的對應(yīng)關(guān)系等
js調(diào)用unity方法二:SendMessage方法
SendMessage(unity_gameObjectName, gameObject_Method_Name, [string_params])
- unity_gameObjectName:unity里gameobject的名字,需要先調(diào)用js傳進(jìn)來,或?qū)懰?/li>
- gameObject_Method_Name: unity里綁定組件里的方法名,需要先調(diào)用js傳進(jìn)來,或?qū)懰?/li>
-
[string_params]: 可選的方法的參數(shù),為字符串,如果有多個參數(shù)可以用字符串拼接好再傳入,如
123|內(nèi)容文本到C#里再用Split分割,或者json等。如果沒有參數(shù),可以不傳
-
C#調(diào)js返回字符串
[DllImport ("__Internal")]
//方法名與參數(shù)返回值要與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#調(diào)js返回int
js里直接return相應(yīng)的數(shù)字即可
-
C#傳字符string參數(shù)給js
C#傳字符串給js,js拿到的是指針,用Pointer_stringify(str)轉(zhuǎn)換一下即可
更多參考
C# - .jslib 2-way communication
https://github.com/emscripten-core/emscripten/blob/ee17f05c0a45cad728ce0f215f2d2ffcdd75434b/src/library_browser.js#L715