我正在使用Unity3D的WebGL支持,并且试图从我的代码中调出JavaScript库以执行一些计算。我尝试调用的函数的返回类型是JavaScript对象。 The Unity documentation提供有关如何从JavaScript调用函数并返回原始值的信息:
[DllImport("__Internal")]
private static extern string StringReturnValueFunction();
所以我目前使用的方法是将对象转换为JSON,将其传递给Unity,然后反序列化。您可能会想到,这种方法存在一些性能问题。
我真正想做的是直接返回一个JavaScript对象并从C#中访问它:
[DllImport("__Internal")]
private static extern MyStruct StructReturnValueFunction();
是否有某种有效的方法来映射JavaScript对象,以便可以从脚本端的托管C#中访问它?
答案 0 :(得分:0)
不可能。
看看this thread。
以下两个帖子与您要问的完全一样:
dansav
有什么方法可以在unity c#和webgl javascript之间共享用户创建的类?我正在阅读Emscripten Embind,它似乎提供了在c ++和javascript之间共享类的解决方案。可以制作jslib类吗?
https://kripken.github.io/emscripten-site/docs/porting/connecting_cpp_and_javascript/embind.html
还有UnityTechnologies的答案
否,您不能直接将这种机制用于C#。如前所述,首先使用il2cpp将C#脚本转换为C ++代码。 C#类与其生成的C ++表示形式之间没有直接的对应关系,即使存在,也将是特定于Unity版本的,因此您将无法依赖它。但是,应该可以使用C插件实现类似的功能。
请注意,提到的C ++绑定不涉及共享实际的类对象或内存。在上例中的JavaScript中使用instance.x = 20时,您无需直接修改堆上的x值,而是隐式执行实例的JavaScript setter函数,该函数随后将值20传输到绑定的&MyClass: :setX C ++函数。因此,这实际上看起来像是共享,而实际上是在复制。实现此机制是为了方便编程,使用它时不应期望任何性能提升。此外,您可以自己为C#类实现相同的访问器函数(在这种情况下,还必须将绑定代码手动添加到JavaScript)。
但是,从2016年开始..事情可能已经改变,但是afaik仍然是string
,数字类型和数组是唯一直接可能的返回类型。