Создание обратных вызовов между 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}\"");
}
}