Unity Mirror - 如何进行单场景漫游?

Unity Mirror - How To Perform Individual Scene Traveling?

我有点不知所措。我没有从 discord 服务器得到任何帮助所以我转向这里希望有人对我有一些见解。

背景:

这是我想要完成的。我想要一个 server+client 主机(使用 Unity Mirror)但允许所有客户端分别在场景之间来回移动。这个概念看起来很简单,但我还没有找到好的解决方案。请注意,我有针对玩家移动的服务器协调设置。

我尝试过的:

每当客户端想要前往一个新场景时,他都会向服务器发送一个请求。服务器将附加加载场景并将 RPC 发送回客户端,客户端也将附加加载场景。然后场景已成功加载,客户端或服务器将调用 MoveObjects 命令(在 SceneManager 上)将玩家角色移动到新场景。所以这意味着和解应该*仍然可以。如果您不是服务器,则卸载旧场景。如果您是服务器,则在该场景中仍有客户端时,保持所有场景附加加载。

我上述方法的唯一问题是我无法在服务器上 disable/hide 场景(或者至少我还不知道该怎么做)。

我的要求

这是最好的方法吗?有没有我可以看的免费代码示例?可能解释更好方法的教程?有没有其他人用更好的方法做到这一点?如果能得到任何帮助,我将不胜感激。

最后的想法

我最后想到的是动态启动新服务器并为每个新的统一场景连接到新服务器以这种方式分离玩家。这种方法的唯一问题是它破坏了跨场景通信。就像我想在多个场景中向派对中的所有玩家显示玩家所在的场景以及他们当前的健康状况。

这有点复杂。但是,我能够像下面这样实现它:

  1. 制作一个旅行功能,这个功能将让客户端简单地向服务器发送一个请求,让服务器自己加载场景,然后告诉客户端这样做。在旅行功能中,它只会有一个简单的调用,如下所示:
NetworkClient.Send(new ClientRequestLoadScene() { sceneName = sceneName, travelPoint = travelPoint }); 
  1. 在服务器上注册一个需要此消息类型的自定义处理程序。如果尚未加载场景,请自行加载场景,然后告诉客户端使用内置的处理程序加载场景,该处理程序已开箱即用地向客户端注册,如下所示:
conn.Send(new SceneMessage() { sceneName = msg.sceneName, sceneOperation = SceneOperation.LoadAdditive });
  1. 当服务器完成加载该场景时,将该客户端玩家移动到新场景:
SceneManager.MoveGameObjectToScene(character, SceneManager.GetSceneByName(GetCleanedSceneName(msg.sceneName)));
  1. 包含 NetworkSceneChecker 以便仅当您在特定场景中时才可见
  2. (可选)如果场景加载了 3d 物理,则包含 PhysicsSimulator 组件。

现在这并没有给出关于如何做到这一点的每一个微小的细节,但这是一个很好的起点,可以帮助您了解如何实现这一点。重要的收获如下:

  • 客户端不会自己加载场景,除非他们明确收到来自服务器的请求
  • 客户端需要告诉服务器他们需要加载什么场景
  • 客户端加载完成后需要通知服务器
  • 服务器需要加载所有请求的场景
  • 服务器负责将玩家移动到新场景