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 に答える