2017-12-09 9 views
1

私はUnityプロジェクトを作成しており、UnityプロジェクトでC# codeBLE (BlueTooth)で受け取ったfloat* arrayをiPhoneに送ろうとしています。Objective CからC#へのfloat *の送信

これらの関数呼び出しは、C#側からC++側に配列を渡してデータを受け取るように開始されました。 しかし、ここでは、このデータ転送は、データが受信されたときにObjective側からC#に開始されます。

私はC#とのインターフェイスにプラグインを使用しました。

Objective C側は

BLEObject.h, BLEObject.m, UnityBridge.h and UnityBridge.mmを持っています。 UnityBridgeはC#とのインターフェイスをとるためのC++コードです。

UnityBridge.hは

#ifdef __cplusplus 
extern "C" { 
#endif 
    void CallMethod(float* array); 

#ifdef __cplusplus 
} 
#endif 

UnityBridge.mmが

#import "UnityBridge.h"  

void CallMethod(float* objectName) 
{ 
    //some implementation here 
} 

BLEObject.hが有する有し有する

+(void) sendMessage:(NSData*)floatArray; 

BLEObject.m有する

+(void) sendMessage:(NSData*)floatArray 
{ 
    //I need to convert here NSData* to float array, how? 
    CallMethod(floatArray); 
} 

BLE, I call [BLEObject sendMessage:floatArray]からのデータをObjective C側で受け取ったとき。

そしてC#の側に、

[DllImport ("__Internal")] 
    public static extern void CallMethod (float* array); 

そして私は実際にこのコードは動作しないが、これは私が実現したいフローで

public static void CallMethod (float* array){ 
    //reading array here 

} 

としてCallMethodを実装します。 どうすれば実装できますか?

+0

私はコードを実装しています。完了したら、私は詳細に議論することができます。この投稿を閉じることを試みている人は、閉じないでください。 – batuman

答えて

0

Objective CからC#へのコールバックの実装方法について説明します。

Inside UnityBridge.h and UnityBridge.mm: 

typedef void (*UnityCommandCallback)(); 

#ifdef __cplusplus 
extern "C" { 
#endif 
    void ConnectCallback(UnityCommandCallback callbackMethod);  
    void CallMethod(); 
#ifdef __cplusplus 
} 
#endif 

#import "UnityBridge.h" 
//THis is the implementation of methods in the header file 
//A static variable to hold our function pointer 
static UnityCommandCallback LastCallBack = NULL; 
void ConnectCallback(UnityCommandCallback callbackMethod) 
{ 
    LastCallBack = callbackMethod;//a simple assignment using the connect method 

} 

void CallMethod() 
{ 
    if(LastCallBack != NULL) 
     LastCallBack(/*objectName, methodName, parameter*/); 
} 

だから、これLastCallBackは、イベントがObjective Cの側で起こるたびコールバック関数を記憶します。

Inside BLEObject.h, BLEObject.m: 

BLEObject.mの上には、デカルトがあります。

extern void CallMethod(); 

イベントが発生すると、いつでもCallMethod()を呼び出します。 最後のコールバック関数は記憶されているので、常にC#で必要な場所に戻ります。

内部のC#: あなたがC#のオブジェクトの初期化時には、この

public class BLEBridge : MonoBehaviour { 

    public delegate void UnityCallbackDelegate(/*IntPtr objectName, IntPtr methodName, IntPtr parameter*/); 
    [DllImport ("__Internal")] 
    public static extern void ConnectCallback(UnityCallbackDelegate callbackMethod); 
    [MonoPInvokeCallback(typeof(UnityCallbackDelegate))] 
    private static void ManagedTest() 
    { 
     Debug.Log("IT WORKS!!!!"); 
    } 
} 

を持って、私たちはそうObjective Cの側であることを

`ManagedTest()` is the function to call back whenever an event happens at Objective C side. 

を知っている

public static void TestSendMsg() 
    { 
     ConnectCallback (ManagedTest); 
    } 

これを呼び出します私はどのように実装する Callback from Objective C going through C++ interface to C# Unity side

関連する問題