C#/Unity - TCP/UDP 位置和旋转更新的多人服务器?

C#/Unity - TCP/UDP Multyplayer server for Positions and Rotations update?

我使用的是 Unity 2018.3.14,我已经创建了自己的 TCP 和 UDP 服务器。 我使用 TCP 层发送不太强烈和重复的消息,例如简单的聊天或损坏。

我使用 UDP 连接发送玩家位置和旋转等消息。

基本上,当 1 个玩家移动时,我会将 Unity 看到的他从点 A 到点 B 的移动 (x,y,z) 的所有坐标发送给所有其他连接的玩家。

这会导致发送大量消息。假设我连接了 100 名玩家,并且所有玩家同时 运行。我相信这会淹没服务器。

所以我的问题是传输玩家在从点 A 到点 B 的旅程中到达的所有坐标 (x,y,z) 是个好主意,或者您可以提出更好的建议方法?

对于任何网络游戏,您都应该定义位置/旋转的发送速率。不建议以与 Update() 相同的速率发送(每秒 60 次)。您必须创建一个移动脚本来消除 Update() 速率和网络 position/rotation 发送速率之间的差异。

即使在已弃用的 UNET 中,也有选项:网络发送速率(秒)

我希望我对此已经足够清楚了。

这可能是一篇非常大的文章,我自己也遇到了麻烦,我将与您分享我的知识。这可能因您的游戏而异。

1) 与Deltas的物理同步

您可以发送发生的速度变化,而不是一次又一次地向每个人发送位置。例如,您按下 "W" 键并向前移动,而不是不断发送位置,而是发送一条表示您正在移动的消息,类似于 "My Velocity is Vector3(0,0,10)" 每个将收到此消息的客户端将开始移动所述对象。 当你释放 "W" 键时,它会发送一条新消息 "My Velocity is Vector3(0,0,0)" 所以我基本上停止了。

您将不得不时不时地同步您的位置,以确保每个人都在正确的位置,但没有什么比充斥着位置数据包更好的了。

2)相对对象

在具有大地图或奇怪房间和地理位置的游戏中,您可以更新以下客户端:

  • 你可以看到它们
  • 他们在您的 X 半径范围内
  • 可能会以任何方式与您互动

例如,您不需要将您的位置发送给远在天边甚至可能不知道您存在的人。

这会大大减少您的流量,尤其是当您有很多玩家分布在一个很大的区域时。

3) 分组消息

根据您的实施,您必须每秒发送 X 条消息。 这是位置更新、速度更新或您决定发送的任何内容。 将每个数据包保持在最低限度。 示例:

  • 不要发送"Player A moved from Point1 to Point2",发送“玩家A是 现在在 Point2" 并让客户端插入其新位置。

此时可以根据您的方法进行大量优化。

根据您的游戏,其中一些可能不适合您。

有用的链接:

Snapshot Compression

GameDev Usefull Post

如需了解更多信息,请随时与我联系。