2017-12-09 4 views
1

Ich mache ein Unity-Projekt und versuche, float* array zu senden, empfangen am am iPhone zu C# code bei Unity-Projekt.Senden von float * von Objective C nach C#

Diese Funktionsaufrufe, die von C# zu C++ - Seite initiiert werden, um Daten zu empfangen, indem Array übergeben wird, sind ziemlich häufig. Aber hier wird diese Datenübertragung von Objektiver Seite zu C# initiiert, wenn Daten empfangen werden.

Ich habe Plugin für die Schnittstelle zu C# verwendet.

Meine Objective C Seite hat

BLEObject.h, BLEObject.m, UnityBridge.h and UnityBridge.mm. UnityBridge ist C++ - Code für die Schnittstelle zu C#.

UnityBridge.h hat

#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 hat hat

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

Wenn ich Daten von BLE, I call [BLEObject sendMessage:floatArray] auf Ziel C-Seite erhalte.

bei Dann # Seite C,

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

I Callmethod als

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

} 

Eigentlich ist dieser Code nicht funktioniert, aber dies ist die Strömung ich implementieren möchten Dann implementieren. Wie kann ich das umsetzen?

+0

Ich implementiere den Code. Sobald ich fertig bin, kann ich ausführlich diskutieren. Bitte schließen Sie nicht für diejenigen, die versuchen, diesen Beitrag zu schließen. – batuman

Antwort

0

Lassen Sie mich beschreiben, wie ich Callback von Objective C zu C# implementiere.

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*/); 
} 

Also diese LastCallBack speichert die Funktion zurückrufen, wenn das Ereignis in Objective C Seite passiert.

Inside BLEObject.h, BLEObject.m: 

Oben auf BLEObject.m gibt es eine Dekalaration.

extern void CallMethod(); 

Also, wenn, gibt es ein Ereignis, können Sie diese CallMethod() nennen. Da die letzte Rückruffunktion gespeichert ist, wird sie immer an dieselbe Stelle in C# zurückgesetzt.

Innen C#: Sie haben diese

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!!!!"); 
    } 
} 

Während der Initialisierung des C# Objekt, wir nennen dies

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

So Objective C Seite weiß

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

Das heißt wie ich Callback from Objective C going through C++ interface to C# Unity side implementiere.

Verwandte Themen