1

我正在制作一个 Unity 项目并尝试将在 iPhone 上float* array收到的内容发送到Unity 项目。BLE (BlueTooth)C# code

那些从 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);

然后我将 CallMethod 实现为

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

}

实际上这段代码不起作用,但这是我喜欢实现的流程。我该如何实施?

4

1 回答 1

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();

因此,无论何时,有一个事件,你调用 this CallMethod()。由于最后一个回调函数被记住了,它总是会回到你在 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!!!!");
    }
}

在 C# 对象的初始化过程中,我们称之为

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

所以Objective C端知道

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

我就是这样实现Callback from Objective C going through C++ interface to C# Unity side的。

于 2017-12-12T16:36:50.373 回答