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