【发布时间】:2012-09-05 13:22:10
【问题描述】:
这里只是一个好奇的问题。
当您在 iOS 平台上为 Unity 编写插件时,插件具有有限的本地到托管回调功能(从插件到 Unity)。基本上这个文档: iOS plugin Unity documentation
声明您可以回调的函数签名是这样的:
只有符合以下签名的脚本方法才能从本机代码中调用:function MethodName(message:string)
C 中定义的签名如下所示:
void UnitySendMessage(const char* obj, const char* 方法, const char* msg);
所以这几乎意味着我只能将字符串发送回 Unity。
现在在我的插件中,我使用 protobuf-net 来序列化对象并将它们发送回 unity 进行反序列化。我已经让这个工作了,但是通过一个我觉得很丑陋而且一点也不优雅的解决方案:
Person* person = [[[[[Person builder] setId:123]
setName:@"Bob"]
setEmail:@"bob@example.com"] build];
NSData* data = [person data];
NSString *rawTest = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
UnitySendMessage("GameObject", "ReceiveProductRequestResponse", [rawTest cStringUsingEncoding:NSUTF8StringEncoding]);
基本上我只是将字节流编码成一个字符串。然后在 Unity 中获取字符串的字节并从那里反序列化:
System.Text.UTF8Encoding encoding=new System.Text.UTF8Encoding();
Byte[] bytes = encoding.GetBytes(message);
这确实有效。但是真的没有别的办法了吗?也许有人知道如何以其他方式完成它?
【问题讨论】:
-
这种方法绝对没有错。如果您必须将数据作为字符串传输,则将其编码为字符串。也就是说,UTF8 不是一个好的选择; UTF8 旨在将字符串编码为二进制,反之亦然。我会使用 base64。
-
或者,使用生成文本的序列化机制而不是协议缓冲区,例如 JSON 或 XML。
-
哈哈有趣 :) 我会尝试使用 Base64 编码。感谢您的建议:D 我不确定这是否是一种可接受的方式。
-
一个很好的问题,但它不应该在 UnityAnswers 上而不是堆栈溢出上吗?
标签: c# objective-c c unity3d protobuf-net