Create callbacks between Unity C#, JavaScript, and C/C++/C# code
Learn how to use callbacks to communicate between your plug-in, browser, and Unity project.
Read time 3 minutesLast updated 10 days ago
Callbacks are an important part of web development because they let your Unity project communicate better with your JavaScript browser, JavaScript plug-in, and C/C++/C# plug-ins. You might want to call functions from your C/C++/C# or JavaScript code in your Unity C# code, and callbacks are an effective way to do this.
Use the makeDynCall function to make callbacks
Use to call C, C++, or C# callbacks from JavaScript code. For example, the following JavaScript code calls the function :
makeDynCallcallback{{{ makeDynCall('vii', 'callback') }}}(1, 2)
- is the signature of the parameters. For example, the callback function is a
'vii'type (v), and thevoidare both integers (ii). This signature tells the underlying Emscripten toolchain what data types the function returns and accepts as parameters. For a list of all supported type characters, refer to the dyncall library documentation.(1,2) - is the name of the callback function.
'callback' - are the arguments to pass into the function.
(1, 2)
The following code is another example of code that does a callback with the function "onresponse" and passes in a float (f) and multiple integer type values:
{{{ makeDynCall('vfii', 'onresponse') }}}(2.8, arg, 0);
Use callbacks in your scripts
The following scripts show an example of how to use callback functions to communicate between JavaScript, C++, and C# code.
Javascript plug-in code
The following code is an example of a file that schedules a timeout and invokes a callback.
.jslibmergeInto(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++ plug-in code
The following code is an example of a C++ file that:
- calls the external JavaScript function ()
JsSetTimeout - contains the callback function the JavaScript calls when a timeout happens.
// 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# code
The following code is an example of C# Unity code that receives the messages from the C++ and JavaScript callbacks.
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}\""); }}