c# - 从 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)
}
这行得通吗?这是正确的模式吗?有更好的方法吗?
任何这样做的指针都受到高度赞赏。
解决方案
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);
}
}
推荐阅读
- coinbase-api - Coinbase 的官方 Python API 被标记为已弃用
- c# - WPF 全屏问题
- git - 你可以在 Git 中标记单个文件夹/文件吗?
- c# - Blazor 服务器:手动刷新重新呈现的 UI
- python - 你如何给 seaborn lattice plot 一个整体标题?
- azure-ad-b2c - Azure B2C 令牌信息
- java - 分数练习的递归(递归的连续分数问题)java编程
- ruby-on-rails - 在 Redis 中使用特定模式获取键范围的最佳方法
- kafka-consumer-api - 一些 Python Confluent Kafka 消费者保持空闲/未分配,即使其他人超载/过度分配
- python - Pandas 从列值中提取子级别并在其他列中填充子级别值