在 Unity Netcode 中将服务器世界同步到客户端 (v1.3)

学习如何在 Unity Netcode for Entities 中正确地将服务器初始化的实体同步到客户端,了解正确的幽灵实体复制的关键要求。

GameUnityNetcode
在 Unity Netcode 中将服务器世界同步到客户端 (v1.3)

本指南基于 Unity Netcode for Entities 版本 1.3。

介绍

当使用 Unity Netcode for Entities 构建多人游戏时,一个常见的障碍是让客户端正确地与服务器初始化的世界同步。如果您像我一样,可能已经在服务器上编写了一个 WorldInitSystem,使用 EntityManager.Instantiate 实例化实体,期望这些实体会自动出现在客户端。

然而,运行游戏时,您可能会注意到客户端什么都没有显示,更糟糕的是——控制台中没有错误。这使得调试特别困难。

经过一些挫折后,我转向了 Entities Hierarchy 窗口。默认情况下,Unity 显示 Server World,所以我最初在那里看到了实体,以为一切都正常工作。但在切换到 Client World 后,我意识到它是空的——没有实体从服务器同步过来。

这就是"恍然大悟"的时刻:客户端没有从服务器同步幽灵实体

实体同步的关键要求

1. 客户端必须请求连接

  • 客户端: 应该有一个连接实体。

  • 服务器端: 它为所有客户端保存连接。

  • 每个连接实体都会自动获得一个 NetworkId 组件。

  • 但在准备就绪之前,连接还没有 NetworkStreamInGame 组件。

  • 要将连接标记为_"游戏中"_(准备交换快照),客户端需要:

    • 创建一个具有 IRpcCommandSendRpcCommandRequest 组件的实体。

    • SendRpcCommandRequest.TargetConnection 设置为连接实体。

  • 在服务器上,一旦接收到此 RPC,它可以将 NetworkStreamInGame 添加到连接中,表示双方都准备好同步。

2. 仅限启用幽灵的预制件

在服务器上实例化的任何实体都必须基于包含 GhostAuthoringComponent 的预制件。没有这个,Netcode 不知道这些实体应该被复制。

要设置它,在 Unity 编辑器中打开预制件,点击"Add Component",并附加 GhostAuthoringComponent。从那里,您可以配置其设置,如幽灵类型(插值或预测)和更新频率。确保此预制件包含在您的 GhostPrefabCollectionComponent 中,该组件应添加到子场景中的 GameObject 上。

确保:

  • 预制件存在于您的 GhostPrefabCollectionComponent 中。

  • 预制件正确标记有 GhostAuthoringComponent

  • 您正在使用服务器端的 EntityManager 实例化这些预制件。

3. 使用自定义 ClientServerBootstrap

另一个关键(且经常被忽视)的步骤是使用自定义 ClientServerBootstrap 类。这确保:

  • 世界(客户端、服务器、精简客户端等)被正确初始化。

  • 幽灵预制件注册和连接管道被正确连接。

最终思考

一旦您满足了上述要求,您应该看到服务器实例化的幽灵实体出现在客户端,通过 Netcode 正确同步。

如果您正在调试类似问题,请记住:

  • 始终检查您在 Entities Hierarchy 中查看的是哪个世界

  • 确认连接握手已完成(存在 NetworkStreamInGame)。

  • 确保在服务器和客户端上幽灵预制件设置正确。

我希望这篇文章能帮助您避免我在首次使用 Unity Netcode for Entities 时遇到的同样困惑。多人游戏开发很复杂——但是一旦正确的部分到位,一切就会顺利运行。

Recommended Posts

回复 (0)

还没有评论。成为第一个分享想法的人!