首页 > 解决方案 > 从 C 到 C# 引发事件(iOS 到 Unity)

问题描述

我想在 Unity 中注册事件并在 iOS 中从 C 中引发这些事件。

我有以下模式 -

// Unity side register delegate and event handler
private delegate void CallbackDelegate(CBObj data);
public static event CallbackDelegate dataUpdatedEvent;

// for iOS
#if !UNITY_EDITOR && UNITY_IOS
[DllImport("__Internal")]
private static extern void PluginFunction(CallbackDelegate callback);
#endif

public CBObj {
    // marshal C objects to c# objects in the constructor here using the Ptr from C
}
[MonoPInvokeCallback(typeof(CallbackDelegate))]
static void CallbackMethod(CBObj dataPtr)
{
    if (dataUpdatedEvent != null)
    {
        CBObj obj = new CBObj(dataPtr);
        dataUpdatedEvent(obj);
    }
}

// Unity Usage
private CallbackDelegate evt;
void Start(){
    evt += updateEvent;
}
public void updateEvent(CBObj data){
    // do something with data everytime its called
}

// C code
extern "C" typedef void (*CallBackFuncP) (CBObj dataPtr);
typedef struct
{
    float *data1;
    int *data2;
} CBObj;
extern "C" {
    CallBackFuncP* cb;
    void PluginFunction(CallBackFuncP callback) {
        // store the the callback function pointer
        cb = callback;
    }
}
// raise the event somewhere in code
if (cb != NULL) {
    CBObj *test =  [[CBObj alloc] init];
    cb(test)
}

这行得通吗?这是正确的模式吗?有更好的方法吗?

任何这样做的指针都受到高度赞赏。

标签: c#iosobjective-cunity3d

解决方案


Unity 建议使用UnitySendMessage函数从 C 调用 C# 方法。

您可以使用json来格式化数据

NSDictionary *d = @{ @"data1":1, @"data2":2.0 };
NSData *j = [NSJSONSerialization dataWithJSONObject:d options:0 error:NULL];
NSString *s = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
UnitySendMessage("GameObjectName", "MethodName", [s UTF8String]);

在统一中,创建一个名为GameObjectName 的游戏对象,附加一个带有名为MethodName的方法的脚本。使用json 库将字符串解码为对象。

public class YourScriptName : Monobehaviour
{
    public class CBObj
    {
        public int data1;
        public float data2;
    }

    public void MethodName(string data)
    {
         var obj = UnityEngine.JsonUtility.FromJson<CBObj>(data);
    }
}

推荐阅读