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 发送速率之间的差异。
我希望我对此已经足够清楚了。
这可能是一篇非常大的文章,我自己也遇到了麻烦,我将与您分享我的知识。这可能因您的游戏而异。
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" 并让客户端插入其新位置。
此时可以根据您的方法进行大量优化。
根据您的游戏,其中一些可能不适合您。
有用的链接:
如需了解更多信息,请随时与我联系。
我使用的是 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 发送速率之间的差异。
我希望我对此已经足够清楚了。
这可能是一篇非常大的文章,我自己也遇到了麻烦,我将与您分享我的知识。这可能因您的游戏而异。
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" 并让客户端插入其新位置。
此时可以根据您的方法进行大量优化。
根据您的游戏,其中一些可能不适合您。
有用的链接:
如需了解更多信息,请随时与我联系。