2

我正在尝试使用该ClientRpc属性通过网络发送各种基本类型的数组。文档指出,我可以毫无问题地通过网络发送这些:

  • 基本类型(byte、int、float、string、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 调用发送具有不同基本类型的各种数量的参数?

4

1 回答 1

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

正如预期的那样,客户端和服务器端的输出是相同的。

于 2016-07-07T11:05:49.287 回答