콜백은 Unity 프로젝트가 JavaScript 브라우저, JavaScript 플러그인, C/C++/C# 플러그인과 더 나은 통신을 할 수 있으므로 웹 개발의 중요한 부분입니다. Unity C# 코드에서 C/C++/C# 또는 JavaScript 코드로 함수를 호출할 수 있으며, 콜백은 이 경우 효과적인 방법입니다.
JavaScript 코드에서 C, C++ 또는 C# 콜백을 호출하려면 makeDynCall을 사용합니다. 예를 들어 다음 JavaScript 코드는 함수 ‘callback’을 호출합니다.
{{{ makeDynCall('vii', 'callback') }}}(1, 2)
'vii'는 파라미터의 서명입니다. 예를 들어 콜백 함수는 void 유형(v)이고, (1,2)는 둘 다 정수(ii)입니다.'callback'은 콜백 함수의 이름입니다.(1, 2)는 함수에 전달되는 인자입니다.다음은 ‘onresponse’ 함수를 사용하여 콜백을 수행하고 플로트(f)와 여러 정수 유형 값을 전달하는 코드의 또 다른 예시입니다.
{{{ makeDynCall('vfii', 'onresponse') }}}(2.8, arg, 0);
다음 스크립트는 콜백 함수를 사용하여 JavaScript, C++ 및 C# 코드 간에 통신하는 방법의 예를 보여 줍니다.
다음은 타임아웃을 예약하고 콜백을 호출하는 .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++ 파일의 예시입니다.
* 외부 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);
}
다음 코드는 C++ 및 JavaScript 콜백에서 메시지를 수신하는 C# Unity 코드의 예시입니다.
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}\"");
}
}