首页 > 解决方案 > 在 Photon Bolt 中,如何将令牌中的 int 数据列表与事件一起发送?

问题描述

我的代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Bolt;
using UdpKit;
//using System.Linq;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;

public class ListOfIntToken : IProtocolToken
{
    public List<int> intList;
    public int byteArraySize;

    public void Read(UdpPacket packet)
    {
        byteArraySize = packet.ReadInt();
        var objectBytes = packet.ReadByteArray(byteArraySize);
        var mStream = new MemoryStream();
        var binFormatter = new BinaryFormatter();
        mStream.Write(objectBytes, 0, objectBytes.Length);
        mStream.Position = 0;
        intList = binFormatter.Deserialize(mStream) as List<int>;
    }

    public void Write(UdpPacket packet)
    {
        var binFormatter = new BinaryFormatter();
        var mStream = new MemoryStream();
        binFormatter.Serialize(mStream, intList);
        //byte[] bytes = userId.Select(x => (byte)x).ToArray();
        var byteArray = mStream.ToArray();
        byteArraySize = byteArray.Length;
        packet.WriteInt(byteArraySize);
        packet.WriteByteArray(byteArray);
    }
}

我有两个客户端运行 A 和 B。A 是服务器。两者都使用此令牌发送事件,但使用不同的数据进行测试。在Write方法中我打印byteArraySize出来,当服务器上收到数据时,我也打印出来。A的byteArraySize数据为 0,打印的时间在方法中的打印行之前Write,其中大小为 221。但是对于 B 的数据,大小是正确的。什么可能导致这个问题?

标签: photon

解决方案


最终解决方案:

public void Read(UdpPacket packet)
{
    intList.Clear();

    if (packet.ReadBool()) // check if we have data to read
    {
        var total = packet.ReadInt();

        for (int i = 0; i < total; i++)
        {
            intList.Add(packet.ReadInt());
        }
    }
}

public void Write(UdpPacket packet)
{
    var total = intList.Count;
    
    if (packet.WriteBool(total > 0)) // Write bool to signal we have some data
    {
        packet.WriteInt(total);

        foreach (var item in intList)
        {
            packet.WriteInt(item);
        }
    }
}

奇怪的错误是由分配给错误的变量引起的。它已在问题中得到纠正。


推荐阅读