2016-07-07 12 views
2

ClientRpc属性を使用してネットワーク経由でさまざまな基本タイプの配列を送信しようとしています。私は問題なくネットワーク経由でこれらを送信できることdocumentation状態、:ClientRPC呼び出しでプリミティブタイプの配列を送信する

  • の基本タイプ(バイト、int型、float型、文字列、UInt64型など)
  • 基本型の配列

しかし、それらが混在しているように見えますが、object[]アレイでは動作しません。私は、次の例があります。サーバー上で

[Command] 
void CmdForwardEvent(string eventName, object[] args) { 
    Debug.Log ("Broadcasting event: " + eventName); 
    foreach (var o in args) { 
     Debug.Log ("arg-class: " + o.GetType() + ": " + o); 
    } 
    RpcForwardEvent (eventName, args); 
} 

[ClientRpc] 
void RpcForwardEvent(string eventName, object[] args) { 
    Debug.Log ("Received event " + eventName); 
    foreach (var o in args) { 
     Debug.Log ("arg-class: " + o.GetType() + ": " + o); 
    } 
} 

void Update() { 
    if (Input.GetKeyDown (KeyCode.P)) { 
     CmdForwardEvent("Testevent", new object[]{"some string", 1, false}); 
    } 
} 

を、私はクライアントで出力

Broadcasting event: Testevent 
arg-class: System.String: some string 
arg-class: System.Int32: 1 
arg-class: System.Boolean: false 

を取得し、これはエラーなしで到着:

Received event: Testevent 
arg-class: System.Object: System.Object 
arg-class: System.Object: System.Object 
arg-class: System.Object: System.Object 

はどのようにして、様々な送信することができますClientRpc呼び出しで異なる基本型を持つ引数の量

+0

しかし、それは働いていますか?クライアントに必要なプリミティブ型にキャストして値をアンボックスするだけで済みます。私は本当に何が問題なのか分かりません。 –

+0

問題は、クライアント側のタイプがわからないことです。 'GetType()'はruntime _に_実際の型を返します。紛失しました – Felk

+0

'if(o is System.String)'を試してみましたか? –

答えて

1

可能な回避策は、手動byte[]として配列をシリアル化して送信することである:期待どおりに、クライアントとサーバ側の

// new code 

private BinaryFormatter bf = new BinaryFormatter(); 

private byte[] objectToBytes(object os) { 
    MemoryStream stream = new MemoryStream(); 
    bf.Serialize (stream, os); 
    return stream.ToArray(); 
} 

private object bytesToObject(byte[] bytes) { 
    MemoryStream stream = new MemoryStream (bytes); 
    return bf.Deserialize (stream); 
} 

// modified code: 

[Command] 
void CmdForwardEvent(string eventName, byte[] argsAsBytes) { 
    object[] args = bytesToObject(argsAsBytes) as object[]; // deserialize 
    Debug.Log ("Broadcasting event: " + eventName); 
    foreach (var o in args) { 
     Debug.Log ("arg-class: " + o.GetType() + ": " + o); 
    } 
    RpcForwardEvent (eventName, argsAsBytes); 
} 

[ClientRpc] 
void RpcForwardEvent(string eventName, byte[] argsAsBytes) { 
    object[] args = bytesToObject(argsAsBytes) as object[]; // deserialize 
    Debug.Log ("Received event " + eventName); 
    foreach (var o in args) { 
     Debug.Log ("arg-class: " + o.GetType() + ": " + o); 
    } 
} 

void Update() { 
    if (Input.GetKeyDown (KeyCode.P)) { 
     // serialize 
     byte[] bytes = objectToBytes(new object[]{"some string", 1, false}); 
     CmdForwardEvent("Testevent", bytes); 
    } 
} 

出力は、同じです。

+0

私もそれについて考えていました。ありがとう - 将来的には役に立つかもしれない。 –

+0

ネットワークゲームオブジェクトのようにユニティがネイティブに送信できるいくつかの型を含めることができないので、このアプローチは制限されています。 – Felk

+0

もう一つの欠点は、 'System.Runtime.Serialization.Formatters.Binary'の' BinaryFormatter'が利用できないということです多くの.NETサブセットでこれは、 'XmlSerializer'のような広く普及しているシリアライザを使って修正することができます – Felk

関連する問題