LoginSignup
13
16

More than 5 years have passed since last update.

【Unity】OSXネイティブからのコールバックを受け取る(ログをコンソールに表示)

Last updated at Posted at 2016-01-25

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の公式情報あってもいいのになーと思う。

参考

13
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
16