Unity 6.3
0 онлайн 42 гостей 3 в системе
Вход

Вызов функций JavaScript из скриптов Unity C#

Вы можете использовать функции из ваших плагинов JavaScript в коде Unity C#. Может быть полезно использовать код JavaScript в коде Unity, так как вам может понадобиться взаимодействовать с другими элементами на вашей веб-странице или Web APIs.

Чтобы узнать о типах файлов и как настроить плагин JavaScript для взаимодействия со скриптами Unity, см. Настройка плагина JavaScript. Чтобы узнать, как взаимодействовать с плагинами C/C++/C#, см. Вызов функций C/C++/C# из скриптов Unity C#.

Тема Описание
Передача различных переменных от JavaScript до Unity Советы по передаче различных переменных между Unity и JavaScript.
Выполнение кода сборки в собственной области Советы по улучшению видимости кода между Unity и JavaScript.
Пример Unity C# кода, который вызывает JavaScript функции Этот пример кода показывает, как вызвать функции JavaScript в Unity.
Используйте плагины Unity в качестве справки Показывает список плагинов, включенных в Unity, которые можно использовать в качестве справки.

Передача различных переменных от JavaScript до Unity

Чтобы интегрировать JavaScript с Unity, вам нужна эффективная связь между ними. Используйте следующие советы о том, как передать различные типы данных из JavaScript в Unity.

Числовые типы

Вы можете передавать простые числовые типы в JavaScript в параметрах функции без преобразования.

Например, эта функция в JavaScript: lang-js AddNumbers: function (x, y) { return x + y; },

принимает целые значения из C# без преобразования:

int result = AddNumbers(5, 7);

Вы можете передавать другие типы данных в качестве указателя в куче Emscripten. Купа Emscripten — это просто большой массив в памяти JavaScript.

Струны

Чтобы преобразовать строку в строку JavaScript, используйте вспомогательную функцию UTF8ToString.

var stringMessage = UTF8ToString("Hello World");

Чтобы возвратить строку, вызовите _malloc для выделения памяти и вспомогательную функцию stringToUTF8 для записи строки JavaScript в память. Если строка является возвращаемым значением, то время выполнения IL2CPP автоматически высвобождает память для вас.

 var returnStr = "Hello World";
    var bufferSize = lengthBytesUTF8(returnStr) + 1;
    var buffer = _malloc(bufferSize);
    stringToUTF8(returnStr, buffer, bufferSize);

Массивы

Для массивов примитивных типов, Emscripten предоставляет различные ArrayBufferViews в его кучу для различных размеров целочисленных, беззнаковых целых или с плавающей точкой представлений памяти: HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64.

Следующая функция повторяет массив HEAPF32 и выводит значения по каждому индексу.

PrintFloatArray: function (array, size) {
    for(var i = 0; i < size; i++)
    console.log(HEAPF32[(array >> 2) + i]);
  },

Текстуры

Чтобы получить доступ к текстуре в WebGL, Emscripten обеспечивает GL.textures массив, который отображает текстуру IDs от Unity до WebGL текстурных объектов. Вы можете вызвать WebGL функции на Emscripten’s WebGL контекст, GLctx.

Например, следующая функция привязывает текстуру WebGL из массива текстур GL к текстуре 2D.

 BindWebGLTexture: function (texture) {
    GLctx.bindTexture(GLctx.TEXTURE_2D, GL.textures[texture]);
  },

Выполнение кода сборки в собственной области

Рекомендуется выполнять весь код сборки в его собственной области. Если у вас есть свой код в своей собственной области, вы можете встраивать свой контент на страницу, не вызывая конфликтов с кодом встраиваемой страницы, и вы можете встраивать несколько сборок на одну и ту же страницу.

Код в плагинах .jslib

Если у вас есть весь код JavaScript в виде плагинов .jslib в вашем проекте, то этот код JavaScript будет работать в той же области, что и скомпилированная сборка, и ваш код должен работать так же, как и в предыдущих версиях Unity. Некоторые из объектов и функций, непосредственно видимых из кода плагина JavaScript, включают: * Module * SendMessage * HEAP8 * ccall

Вызов функций JavaScript из глобальной области

Если вы хотите вызывать внутренние функции JavaScript из глобальной области встраиваемой страницы, в шаблоне Web index.html, вы должны использовать unityInstance переменная.

Используйте unityInstance после успешного экземплярирования движка Unity, например:

  var MyGameInstance = null;
  script.onload = () => {
    createUnityInstance(canvas, config, (progress) => { /*...*/ }).then((unityInstance) => {
      MyGameInstance = unityInstance;

Затем вы можете использовать MyGameInstance.SendMessage() для отправки сообщения в сборку или использовать MyGameInstance.Module для доступа к объекту модуля сборки.

Пример Unity C# код, который вызывает JavaScript функции

Следующий код JavaScript создает функцию под названием Hello. Для этого примера используйте этот код в вашем плагине JavaScript, чтобы вы могли вызывать его в своих скриптах Unity C#.

mergeInto(LibraryManager.library, {

  Hello: function () {
    window.alert("Hello, world!");
  },
});

Затем используйте этот код C# в вашем проекте Unity для вызова функции Hello из вашего кода JavaScript:

using UnityEngine;
using System.Runtime.InteropServices;

public class NewBehaviourScript : MonoBehaviour {

    [DllImport("__Internal")]
    private static extern void Hello();

    void Start() {
        Hello();
    }
}

Большой пример кода с различными типами функций см. в Примеры кода: Вызов функций JavaScript и C/C++/C# в Unity.

Используйте плагины Unity в качестве справки

В папке установки Unity есть несколько плагинов, которые вы можете использовать в качестве справки:

  • PlaybackEngines/WebGLSupport/BuildTools/lib

  • PlaybackEngines/WebGLSupport/BuildTools/Emscripten/src/library*

Дополнительные ресурсы