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

Создание обратных вызовов между Unity C#, JavaScript и C/C++/C# кодом

Обратные вызова являются важной частью веб-разработки, потому что они позволяют вашему проекту Unity лучше взаимодействовать с вашим браузером JavaScript, плагином JavaScript и плагинами C/C++/C#. Вы можете пожелать вызвать функции из вашего кода C/C++/C# или JavaScript в коде Unity C#, и обратные вызова являются эффективным способом сделать это.

Используйте функцию makeDynCall для обратного вызова

Используйте makeDynCall для вызова обратных вызовов C, C++ или C# из кода JavaScript. Например, следующий код JavaScript вызывает функцию callback:

{{{ makeDynCall('vii', 'callback') }}}(1, 2)
  • 'vii' является подписью параметров. Например, функция callback является подписью функции callback. void типа v) и (1,2) являются целыми числами (ii). Эта подпись говорит о базовой Emscripten toolchain, какие типы данных возвращает функция и принимает в качестве параметров. Список всех поддерживаемых типов символов см. в Документация библиотеки dyncall.
  • 'callback' — имя функции обратного вызова.
  • (1, 2) — аргументы, которые будут переданы в функцию.

Следующий код является еще одним примером кода, который делает обратный вызов с функцией “onresponse” и передает в плавающей (f) и множественные целые типа значения:

{{{ makeDynCall('vfii', 'onresponse') }}}(2.8, arg, 0);

Использование обратных вызовов в скриптах

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

JavaScript плагин код

Следующий код является примером файла .jslib, который планирует время ожидания и вызывает обратный вызов.

mergeInto(LibraryManager.library, {
    JsSetTimeout: function (message, timeout, callback) {
        // Create copy of message because it might be deleted before callback is run
        var stringMessage = UTF8ToString(message);
        var buffer = stringToNewUTF8(stringMessage);
        setTimeout(function () {
            {{{ makeDynCall('vi', 'callback') }}} (buffer);
            _free(buffer);
        }, timeout);
    }
});

C++ код плагина

Следующий код является примером файла C++, который: * вызывает внешнюю функцию JavaScript (JsSetTimeout) * содержит функцию обратного вызова, которую JavaScript вызывает при истечении времени ожидания.


// CallbackExample.cpp
#include <stdio.h>

typedef void (*OnTimeOutCallback)(char* message);

extern "C"
{
    void JsSetTimeout(char* message, int timeout, OnTimeOutCallback callback);
}

void CCallback(char* message)
{
    printf("C callback received \"%s\"\n", message);
}

extern "C" void SetCTimeout()
{
    JsSetTimeout("Hello World", 1000, CCallback);
}

Unity C# код

Следующий код является примером кода C# Unity, который получает сообщения от обратных вызовов C++ и JavaScript.

using AOT;
using System;
using System.Text;
using System.Runtime.InteropServices;
using UnityEngine;

public class CallbackExample : MonoBehaviour
{
    void Awake()
    {
        SetCSharpTimeout();
        SetCTimeout();
    }

    void SetCSharpTimeout()
    {
        JsSetTimeout("Hello World", 500, CSSharpCallback);
    }

    [DllImport("__Internal")]
    public static extern void SetCTimeout();    
    
    [DllImport("__Internal")]
    public static extern void JsSetTimeout(string message, int timeout, Action<string> action);

    [MonoPInvokeCallback(typeof(Action<string>))]
    public static void CSSharpCallback(string message)
    {
       Debug.Log($"C# callback received \"{message}\"");
    }
}

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