Передача данных сервер-клиент

Сеть в Unity3D

Передача данных сервер-клиент

Сообщение elf01 08 дек 2017, 14:01

Здравствуйте. Ребят пытаюсь передать List приконектившимуся игроку, но что-то идет не так и лист у игрока пустой.
Делаю на старой системе unity.

К примеру висит скрипт на объекте пустом
Синтаксис:
Используется csharp
public List<string> Players = New List<string>();
private string PName="name";
...
Players.Add(PName);
networkView.RPC("StatsPlayer", RPCMode.AllBuffered, Players);
...
[RPC]
void StatsPlayer(List<string> PlayersInfo)
{
PlayersInfo = Players;
}
 

А на персонаже, который подключается, висит скрипт
Синтаксис:
Используется csharp
public List<string> Players2 = New List<string>();
...
[RPC]
void StatsPlayer(List<string> PlayersInfo)
{
Players2 = PlayersInfo ;
}
 
elf01
UNIверсал
 
Сообщения: 370
Зарегистрирован: 07 июл 2013, 08:59

Re: Передача данных сервер-клиент

Сообщение Woolf 08 дек 2017, 18:55

а List разве сериализуемый? Либо создайте свой сериализуемый лист, либо сконвертируйте его в byte[] или еще проще, в string с разделителем.

А вообще, для передачи по сети дарю вам два своих удобных класса:

Синтаксис:
Используется csharp
using System;
using System.IO;
using System.Text;

public class DataOut {

    private MemoryStream ms;
    private BinaryWriter bw;

    public DataOut() {
        ms = new MemoryStream();
        bw = new BinaryWriter(ms);
    }

    public void clear() {
        ms = new MemoryStream();
        bw = new BinaryWriter(ms);
    }

    public void close() {
        ms.Close();
        bw.Close();

        bw = null;
        ms = null;
    }

    public byte[] getBytes() {
        return ms.ToArray();
    }

    public void writeDateTime(DateTime dt) {
        // return new DateTime(readShort(), readShort(), readShort(), readShort(), readShort(), readShort());
        writeShort((short)dt.Year);
        writeShort((short)dt.Month);
        writeShort((short)dt.Day);
        writeShort((short)dt.Hour);
        writeShort((short)dt.Minute);
        writeShort((short)dt.Second);
    }

    public void writeVector3(MVector vec) {
        bw.Write(vec.X);
        bw.Write(vec.Y);
        bw.Write(vec.Z);
    }


    public void writeInt(int aval) {
        bw.Write(aval);
    }

    public void writeLong(long aval) {
        bw.Write(aval);
    }

    public void writeFloat(float aval) {

        bw.Write(aval);
    }

    public void writeDouble(double aval) {
        bw.Write(aval);
    }


    public void writeShort(short aval) {
        bw.Write(aval);
    }

    public void writeByte(byte aval) {
        bw.Write(aval);
    }

    public void writeBytes(byte[] aval) {
        bw.Write((byte[])aval);
    }

    public void writeBool(bool aval) {
        writeByte((byte)(aval == true ? 1 : 0));
    }

    public void writeString(string astr) {
        if (astr != null) {
            UTF8Encoding encoding = new UTF8Encoding();
            byte[] bytes = encoding.GetBytes(astr);
            writeShort((short)bytes.Length);
            writeBytes(bytes);
        } else {
            writeShort((short)0);
        }
    }
}

 


Синтаксис:
Используется csharp

using System;
using System.IO;
using System.Text;

public class DataIn {

    private MemoryStream _ms;
    private BinaryReader _bw;
    private readonly long _length;
    private long _index;

    public DataIn(byte[] data) {
        _index = 0;
        _ms = new MemoryStream(data);

        _length = data.Length;
        _index = 0;
        _bw = new BinaryReader(_ms);
    }

    public void close() {
        _ms.Close();
        _bw.Close();

        _bw = null;
        _ms = null;
    }


    public bool eof {
        get {
            return _index >= _length;
        }
    }

    public MVector readVector3() {
        return new MVector(readDouble(), readDouble(), readDouble());
    }

    public byte[] readAll() {
        return readBytes((int)(_length - _index));
    }

    public int readInt() {
        _index += 4;
        return _bw.ReadInt32();
    }

    public long readLong() {
        _index += 8;
        return _bw.ReadInt64();
    }

    public float readFloat() {
        _index += 4;
        return _bw.ReadSingle();
    }


    public DateTime readDateTime() {
        return new DateTime(readShort(), readShort(), readShort(), readShort(), readShort(), readShort());
    }


    public double readDouble() {
        _index += 8;

        return _bw.ReadDouble();
    }

    public short readShort() {
        _index += 2;
        return _bw.ReadInt16();
    }

    public byte readByte() {
        _index += 1;
        return _bw.ReadByte();
    }

    public byte[] readBytes(int count) {
        _index += count;
        return _bw.ReadBytes(count);
    }

    public bool readBool() {
        _index += 1;
        return _bw.ReadByte() == 1;
    }


    public string readString() {
        int cnt = readShort();
        if (cnt <= 0) {
            return "";
        }
        byte[] strb = readBytes(cnt);
        return Encoding.UTF8.GetString(strb);
    }
}

 



Работаем с ними так, на примере вашего листа:

Отправка данных:
Синтаксис:
Используется csharp
  List<string> lst = new List<string>();
******************
                DataOut os = new DataOut();
                try {
                    os.writeInt(lst.Count);
                    foreach (var str in lst) {
                        os.writeString(str);
                    }

                    send("cmd", os.getBytes());
                } finally {
                    os.close();
                }


Приём данных:
Синтаксис:
Используется csharp
DataIn din=new DataIn(bytes);

                List<string> lst = new List<string>();
                int lcnt = din.readInt();
                for (int indx = 0; indx < lcnt; indx++) {
                    lst.Add(din.readString());
                }
 



разумеется, классы умеют передавать и принимать самые разнородные данные в одном потоке. Всё, что нужно, это просто научить ваши классы записываться и читаться из потока.
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

Re: Передача данных сервер-клиент

Сообщение danquimby 21 дек 2017, 10:42

А ты рассматривал вопрос насчет того что бы не в байтах присылать а в json
если данных много, можно его в zip закинуть это не так долго для проца
по крайней мере раньше мы замарачивались на с++ как раз отсылкой байтов, подсчет размера класса
потом его приведение тот еще гемор.
с моделями в json на много проще работать стало и гибче.
Делая механизм создание классов-моделей на основе json пакетов, и все
Пока компьютер еще не научился самостоятельно мыслить, доверять ему можно
Аватара пользователя
danquimby
UNIт
 
Сообщения: 54
Зарегистрирован: 29 янв 2015, 21:33
Откуда: Иваново
Skype: danquimby
  • Сайт


Вернуться в Сеть

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2