Unity WebGL C#與jslib交互的細(xì)節(jié)

方法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]); 方法里viv指的是返回值是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]);
  1. 更多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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容