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

本指南基于 Unity Netcode for Entities 版本 1.3。
介绍
当使用 Unity Netcode for Entities 构建多人游戏时,一个常见的障碍是让客户端正确地与服务器初始化的世界同步。如果您像我一样,可能已经在服务器上编写了一个 WorldInitSystem,使用 EntityManager.Instantiate 实例化实体,期望这些实体会自动出现在客户端。
然而,运行游戏时,您可能会注意到客户端什么都没有显示,更糟糕的是——控制台中没有错误。这使得调试特别困难。
经过一些挫折后,我转向了 Entities Hierarchy 窗口。默认情况下,Unity 显示 Server World,所以我最初在那里看到了实体,以为一切都正常工作。但在切换到 Client World 后,我意识到它是空的——没有实体从服务器同步过来。
这就是"恍然大悟"的时刻:客户端没有从服务器同步幽灵实体。
实体同步的关键要求
1. 客户端必须请求连接
客户端: 应该有一个连接实体。
服务器端: 它为所有客户端保存连接。
每个连接实体都会自动获得一个
NetworkId组件。但在准备就绪之前,连接还没有
NetworkStreamInGame组件。要将连接标记为_"游戏中"_(准备交换快照),客户端需要:
创建一个具有
IRpcCommand和SendRpcCommandRequest组件的实体。将
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 时遇到的同样困惑。多人游戏开发很复杂——但是一旦正确的部分到位,一切就会顺利运行。
