Возвращение сложных значений из JavaScript в Unity WebGL - PullRequest
1 голос
/ 02 июля 2019

Я использую поддержку WebGL в Unity3D и пытаюсь вызвать библиотеку JavaScript из моего кода для выполнения некоторых вычислений. Тип возвращаемого значения функции, которую я пытаюсь вызвать - это объект JavaScript. Документация Unity предоставляет информацию о том, как вызывать функции из JavaScript и возвращать примитивные значения:

    [DllImport("__Internal")]
    private static extern string StringReturnValueFunction();

Таким образом, в настоящее время я использую это для преобразования объекта в JSON, передачи его в Unity и последующей десериализации. Как вы можете себе представить, у этого подхода есть некоторые проблемы с производительностью.

Что я действительно хочу сделать, так это напрямую вернуть объект JavaScript и получить к нему доступ из C #:

    [DllImport("__Internal")]
    private static extern MyStruct StructReturnValueFunction();

Есть ли какой-нибудь эффективный способ сопоставить объект JavaScript, чтобы к нему можно было обращаться из управляемого C # на стороне emscripten?

1 Ответ

0 голосов
/ 03 июля 2019

Afaik это невозможно.


Посмотрите на эту тему .

Есть эти два сообщения, которые в значительной степени точно, что выспрашивая:

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 #.Как было отмечено ранее, сценарии C # сначала преобразуются в код C ++ с использованием il2cpp.Не существует прямого соответствия между классами C # и их сгенерированными представлениями C ++, и даже если бы это было так, это зависело бы от конкретной версии Unity, и поэтому вы не могли бы полагаться на нее.Однако должно быть возможно добиться чего-то подобного с помощью плагина C.

Обратите внимание, что упомянутое связывание C ++ не включает совместное использование реальных объектов класса или памяти.Когда вы используете instance.x = 20 в JavaScript из вышеприведенного примера, вы не изменяете значение x в куче напрямую, а вместо этого неявно выполняете функцию установки JavaScript экземпляра, которая затем передает ваше значение 20 в binded & MyClass:: setX C ++ функция.Так что это похоже только на обмен, а на самом деле это копирование.Этот механизм был реализован для удобства программирования, и вы не должны ожидать какого-либо повышения производительности при его использовании.Более того, вы можете самостоятельно реализовать те же функции доступа для ваших классов C # (в этом случае вам также придется вручную добавить код привязки в JavaScript).


Однако это из2016 ... вещи могли измениться, но на самом деле string и числовые типы и массивы из них являются единственно возможными типами возврата.

...