UnityでOSXネイティブのプログラムを作成するときにコールバックの作り方で悩んだのでメモ。以下は、ネイティブからのログをUnityのコンソールに表示する場合。
- XCodeでBundleを作成するプロジェクトを作成(プロジェクト名:NativePlugin)
- 次のようなコードを作成
native.h
#ifndef native_h
#define native_h
typedef void (*logCallbackFunc)(const char *);
static logCallbackFunc logCallback;
#endif /* native_h */
native.m
void _initLogCallback(logCallbackFunc callback) {
// some other init here
logCallback = callback;
if(logCallback != NULL)
sendLog([@"Log callback is set" UTF8String]);
}
void sendLog(const char * l){
logCallback(l);
}
Bundleを作成してUnityの Assests/Plugins にコピー
Unityで適当なC#スクリプトを作成してDLLをロード
UnityでのC#スクリプト(DLLをロードする部分)
using UnityEngine;
using System.Collections;
using ObjC = ObjCMessage;
using System;
using System.Runtime.InteropServices;
public class NativePlugin : MonoBehaviour {
void Start(){
InitLogCallback(); //コールバックを初期化
}
public delegate void logCallback(string message);
[AOT.MonoPInvokeCallback(typeof(logCallback))]
public static void Log Received (string message) {
Debug.Log("[Native]:"+message);
}
[DllImport("NativePlugin")]
private static extern void _initLogCallback(logCallback callback);
public static void InitLogCallback() {
if (Application.platform == RuntimePlatform.OSXEditor) {
_initLogCallback(LogReceived);
}
}
}
Unityの公式情報あってもいいのになーと思う。