首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# Lidgren库-发送播放数据

C# Lidgren库-发送播放数据
EN

Stack Overflow用户
提问于 2015-05-06 08:32:48
回答 2查看 2.6K关注 0票数 1

我目前正在用多人游戏编写一个面向对象的游戏。Player从实体继承,当我将当前的播放机属性发送到

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

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

有什么建议吗?

编辑:

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-02 07:33:00

这应该是可能的(我自己也没有尝试过),因为您可以将任何东西序列化成字节,但不能直接打开框。有三个基本条件:

  • 需要发送的对象在客户端和服务器上应该完全相同。
  • 您需要将数据类型与数据一起发送到预期位置。
  • 而且最可能需要发送的字节数量,因为NetIncomingMessage没有读到结束。

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

代码语言:javascript
复制
enum PacketTypes
{
    LOGIN,
    MOVEMENT,
    SHOOTING,
}

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

NetOutgoingMessage.Write可以使用一个字节或字节数组。因此,可以使用任何方法将对象序列化为字节。在将它写成out消息之前,首先确定字节的数量,然后在数据包信息之后写入字节。那就写数据。

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

有很多源可以解释序列化和反序列化数据,所以我不会在这里深入讨论。而且,由于您可以使用Lidgren发送和接收字节,所以真正的应该只工作。然而,您应该始终发送尽可能少的数据,并且在实践中,只需要几个原语就足够了。例如,每次需要位置时,不需要发送播放机的名称。那个球员的能力可能更不有趣了。你需要把它分解成碎片,如果一个玩家移动发送2个浮球。如果玩家被击中,发送一个int。对于正在使用的能力,通常只需要一个整数作为ID。

票数 2
EN

Stack Overflow用户

发布于 2015-05-06 12:59:51

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30071454

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档