Библиотека C# Lidgren - Отправить данные игрока
В настоящее время я пишу объектно-ориентированную игру с мультиплеером. Игрок наследует от сущности, и когда я отправляю свои текущие свойства игроков через
NetOutgoingMessage outmsg = Server.CreateMessage();
[...]
outmsg.WriteAllProperties(p);
где p - объект моего игрока, мои клиенты получают только свойства, которые объявлены в моем классе игроков, а не из класса сущностей. Поэтому мои клиенты не могут обновлять позиции игроков и т. Д.
Любой совет?
редактировать:
Он распознает унаследованные объекты, но не отправляет их должным образом. Я думаю, что мне может понадобиться использовать несколько флагов привязки, так как есть опция, и должна быть возможность посылать объекты, которые также выделены игроку. Я использую класс Vector2 для указания позиции и скорости моего игрока, но мой клиент либо не может получить класс Vector2, либо сервер не может его отправить. Если я использую целые числа, строки, логические значения или что-то еще, это работает, но не с пользовательскими классами.
2 ответа
Это должно быть (не пытался сделать это сам) возможно, поскольку вы можете сериализовать все что угодно в байты, но не сразу. Есть 3 основных условия:
- объекты, которые должны быть отправлены, должны быть одинаковыми на клиенте и сервере.
- Вам необходимо отправить тип данных вместе с данными в ожидаемой позиции.
- И, скорее всего, необходимо отправить количество байтов, отправленных с
NetIncomingMessage
не прочитал до конца.
Одним из способов отправки информации о типе данных является отправка перечисления в качестве первого байта.
enum PacketTypes
{
LOGIN,
MOVEMENT,
SHOOTING,
}
out.Write((byte)PacketTypes.Login);
NetOutgoingMessage.Write
может принимать байты или байтовый массив. Таким образом, вы можете использовать любой метод для сериализации вашего объекта в байты. Перед тем, как записать его как исходящее сообщение, сначала определите количество байтов и запишите его после информации о пакете. Затем запишите данные.
На принимающей стороне вам необходимо определить, какие данные вы получили, и правильно их обработать. if (inc.ReadByte() == (byte)PacketTypes.Login)
Теперь мы знаем, как обрабатывать этот пакет. Теперь прочитайте целое число, которое указывает, сколько байтов составляют данные, прочитайте это количество и десериализуйте его.
Существует множество источников, объясняющих сериализацию и десериализацию данных, поэтому я не буду вдаваться в подробности. И так как вы можете отправлять и получать байты с Lidgren
это действительно должно работать. Тем не менее, вы всегда должны посылать как можно меньше данных, и на практике пары примитивов достаточно часто. Например, имя игрока не нужно отправлять каждый раз, когда вы хотите получить должность. Способности этого игрока, вероятно, еще менее интересны. Вам нужно разбить его на части, если игрок перемещает, отправьте 2 поплавка. Если игрок получает удар, отправьте int. Для использования способности вам часто нужно только целое число в качестве идентификатора.
Я только (наконец) прочитал, что Лидгрен не может отправлять или читать пользовательские объекты.