C# Lidgren Library - Send playerdata



我当前正在用多人游戏编写面向对象的游戏。播放器从实体继承,当我通过

发送我当前的玩家属性时

NetOutgoingMessage outmsg = Server.CreateMessage(); [...] outmsg.WriteAllProperties(p);

如果p是我的播放器对象,我的客户仅收到在我的玩家类中声明的属性,而不是从实体类中声明。因此,我的客户无法更新玩家位置等。

有建议吗?

编辑:

它识别继承的对象,但无法正确发送它们。我认为我可能需要使用一些绑定器,因为它有一个选项,并且应该可以发送分配给播放器的对象。我正在使用vector2类来指定播放器的位置和速度,但是我的客户端要么无法接收vector2类,要么服务器无法发送。如果我使用整数,字符串,布尔值或它有效的任何东西,而是使用自定义类。

这应该(我本人没有尝试过),因为您可以将任何内容序列化到字节中,而不是直接盒子。有3个主要条件:

  • 需要发送的对象在客户端和服务器上应完全相同。
  • 您需要发送数据类型以及预期位置的数据。
  • 很可能需要发送发送的字节数量,因为NetIncomingMessage直到结束才读取。

发送数据类型信息的一种方法是将枚举发送为第一个字节

enum PacketTypes
{
    LOGIN,
    MOVEMENT,
    SHOOTING,
}
out.Write((byte)PacketTypes.Login);

NetOutgoingMessage.Write可以使用字节或字节数组。因此,您可以使用任何方法将对象序列化为字节。在将其写入输出消息之前,请先确定字节数量,然后在数据包信息之后写入。然后写入数据。

在接收端,您需要确定收到哪种数据并正确处理。if (inc.ReadByte() == (byte)PacketTypes.Login),现在我们知道如何处理此自定义软件包。现在读取说明数据的数量的整数,读出该数量并值得注意。

有很多来源可以解释序列化和绝望数据,因此我在这里不会深入探讨。而且,由于您可以使用Lidgren发送和接收字节,因此应该只能工作。但是,您应该始终发送尽可能少的数据,而实际上,几个原语通常就足够了。例如,每次您想要一个位置时,都不需要发送播放器的名称。该玩家的能力甚至不太有趣。如果玩家移动发送2个浮标,则需要将其分解成碎片。如果播放器被击中,请发送int。对于使用的能力,您通常只需要一个整数作为ID。

我只是(最后)读,lidgren无法发送或读取自定义对象。

https://groups.google.com/forum/# !! Topic/lidgren-network-gen3/sdj6lfmdkay

最新更新