8

ここは単なる好奇心の問題です。

iOS プラットフォームで Unity 用のプラグインを作成する場合、プラグインにはネイティブからマネージへのコールバック機能 (プラグインから Unity へ) が制限されています。基本的にこのドキュメント: iOS プラグイン Unity ドキュメント

コールバックできる関数シグネチャは次のとおりです。

次のシグネチャに対応するスクリプト メソッドのみをネイティブ コードから呼び出すことができます: function MethodName(message:string)

C で定義された署名は次のようになります。

void UnitySendMessage(const char* obj, const char* method, const char* msg);

つまり、これは文字列のみを Unity に送り返すことができることを意味します。

現在、私のプラグインでは、protobuf-net を使用してオブジェクトをシリアル化し、ユニティに送り返して逆シリアル化しています。私はこれを機能させましたが、解決策によって、私は非常に醜く、まったくエレガントではないと感じています:

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

これは機能します。しかし、それ以外の方法は本当にありませんか?おそらく、誰かが別の方法でそれを行う方法を知っていますか?

4

2 に答える 2

4

Base-64 (または別の同様のベース) がこれを行う正しい方法です。ここでエンコーディング (UTF8 など) を使用することはできません。エンコーディングは次の変換を目的としています

arbitrary string <===encoding===> structured bytes

つまり、バイトの構造が定義されている場所。これは protobuf には当てはまりません。あなたが欲しいのは:

arbitrary bytes <===transform===> structured string

ほとんどの場合、base-64 が最も便利な実装です。厳密に言えば、64 より少し高くすることもできますが、おそらく手動でロールする必要があります。Base-64 はよく理解され、十分にサポートされているため、適切な選択です。Cでそれを行う方法はわかりませんが、Unityでは次のようにする必要があります。

string s = Convert.ToBase64String(bytes);

多くの場合、メモリ内を次のようにシリアライズしていると仮定すると、ここで余分なバッファを回避することもできますMemoryStream

string s;
using(var ms = new MemoryStream()) {
    // not shown: serialization steps

    s = Convert.ToBase64String(ms.GetBuffer(), 0, (int)ms.Length);
}
于 2012-09-05T15:08:46.247 に答える
3

Marc Gravell の回答に基づく例:

iOS 側:

-(void)sendData:(NSData*)data
{
    NSString* base64String = [data base64Encoding];
    const char* utf8String = [base64String cStringUsingEncoding:NSUTF8StringEncoding];
    UnitySendMessage("iOSNativeCommunicationManager", "dataReceived", utf8String);
}

そして団結側では:

public delegate void didReceivedData( byte[] data );
public static event didReceivedData didReceivedDataEvent;

public void dataReceived( string bytesString )
{
    byte[] data = System.Convert.FromBase64String(bytesString);

    if( didReceivedDataEvent != null )
        didReceivedDataEvent(data);
}
于 2014-05-15T11:27:25.957 に答える