2016-07-07 18 views
2

我試圖通過網絡使用ClientRpc屬性發送各種基本類型的數組。該documentation狀態,我可以把這些在網絡沒有問題:通過ClientRPC調用發送一組基本類型

  • 基本類型(字節,整型,浮點,字符串,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()'給你在運行時的_actual類型,它已經丟失了 – Felk

+0

你試過'if(o是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

請注意,這種方法是有限制的,因爲您不能包括某些類型的Unity可以以其他方式本地發送,如聯網的GameObjects – Felk

+0

另一個缺點是來自'System.Runtime.Serialization.Formatters.Binary'的'BinaryFormatter'不可用在很多.NET子集上。這可以通過使用另一個更廣泛的Serializer來解決,比如'XmlSerializer' – Felk

相關問題