unity

Unity WebGL与jslib相互调用的注意事项

2020-12-01  本文已影响0人  大其心宏其量扩其识

方法1:将C#方法传给js,js调用方法回调返回的方式

参考链接: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

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');注册
3.Runtime.dynCall('vi', JsCallCsTest.callback, [buffer]); 方法里viv指的是返回值是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]);
  1. 更多Runtime.dynCall调用的参考,什么类型对应什么符号的对应关系等

js调用unity方法二:SendMessage方法

SendMessage(unity_gameObjectName, gameObject_Method_Name, [string_params])

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

js里直接return相应的数字即可

更多参考

C# - .jslib 2-way communication
https://github.com/emscripten-core/emscripten/blob/ee17f05c0a45cad728ce0f215f2d2ffcdd75434b/src/library_browser.js#L715

上一篇 下一篇

猜你喜欢

热点阅读