C#Lidgren图书馆 - 发送playerdata

时间:2015-05-06 08:32:48

标签: c# lidgren

我目前正在用多人游戏编写一个面向对象的游戏。 玩家继承自实体,当我通过

发送我当前的玩家属性时

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

其中p是我的玩家对象,我的客户端只接收在我的玩家类中声明的属性,而不是实体类。因此,我的客户无法更新玩家位置等。

有什么建议吗?

编辑:

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

2 个答案:

答案 0 :(得分:1)

这应该(我自己没有试过)可以,因为你可以将任何东西序列化为字节但不是直接开箱即用。有三个主要条件:

  • 需要发送的对象在客户端和服务器上应该完全相同。
  • 您需要在预期的位置发送数据类型和数据。
  • 并且很可能需要发送自NetIncomingMessage没有读取到结束的字节数。

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

enum PacketTypes
{
    LOGIN,
    MOVEMENT,
    SHOOTING,
}

out.Write((byte)PacketTypes.Login);

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

在接收端,您需要确定收到的数据类型并妥善处理。 if (inc.ReadByte() == (byte)PacketTypes.Login),现在我们知道如何处理这个自定义包。现在读出整数,该整数指定数据的字节数,读出该数量并反序列化。

有很多资料来解释数据的序列化和反序列化,所以我不会在这里深入探讨。由于您可以使用Lidgren发送和接收字节,因此才能正常工作。但是,您应该始终发送尽可能少的数据,实际上,一些原语通常就足够了。例如,每次想要一个位置时都不需要发送播放器的名称。该球员的能力可能更不有趣。如果玩家移动发送2个花车,你需要将它分解成碎片。如果玩家被击中,则发送一个int。对于正在使用的能力,您通常只需要一个整数作为ID。

答案 1 :(得分:0)

我(最后)读到,Lidgren无法发送或读取自定义对象。

https://groups.google.com/forum/#!topic/lidgren-network-gen3/sdj6LFMdKAY