기술 자료

Unity Engine

Unity Engine

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# 콜백을 호출하려면
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# 코드 간에 통신하는 방법의 예를 보여 줍니다.

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++ 및 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}\""); }}

추가 리소스