我有点不知道在这里要做什么。我没有从不和谐服务器得到任何帮助,所以我来到这里希望有人能给我一些见解。
背景:
这就是我想要实现的目标。我想要一个服务器+客户端
主机(使用Unity Mirror),但允许所有客户端分别在场景之间来回移动。这个概念看起来很简单,但我还没有找到一个好的解决方案。请注意,我有用于玩家移动的服务器协调设置。
我尝试过的:
每当客户端想要前往新场景时,他都会向服务器发送请求。服务器将附加加载场景并将 RPC 发送回客户端,客户端也将附加加载场景。然后场景已成功加载,客户端或服务器将调用 MoveObjects 命令(在 SceneManager 上)将玩家角色移动到新场景。所以这意味着和解应该*仍然可以。如果您不是服务器,则卸载旧场景。如果您是服务器,则当场景中仍然有客户端时,会保留所有场景的附加加载。
我上述方法的唯一问题是我无法禁用/隐藏服务器上的场景(或者至少我还不知道如何做到这一点)。
我的请求
这是最好的方法吗?有免费的代码示例我可以查看吗?可能解释更好方法的教程?还有其他人用更好的方法做到这一点吗?我非常感谢我能在这方面获得的任何帮助。
最终想法
我想到的最后一件事是动态启动一个新服务器并为每个新的统一场景连接到新服务器以这种方式分离玩家。这种方法的唯一问题是它破坏了跨场景通信。就像我想向多个场景中的所有玩家显示玩家所在的场景以及他们当前的健康状况一样。
最佳答案
这有点复杂。但是,我能够实现如下所示:
- 制作一个旅行功能,该功能将让客户端简单地向服务器发送请求,让服务器加载场景本身,然后告诉客户端执行相同的操作。在旅行函数中,它只会有一个简单的调用,如下所示:
NetworkClient.Send(new ClientRequestLoadScene() { sceneName = sceneName, travelPoint = travelPoint });
- 在服务器上注册一个需要此消息类型的自定义处理程序。如果场景尚未加载,请自行加载场景,然后告诉客户端使用开箱即用的向客户端注册的内置处理程序加载场景,如下所示:
conn.Send(new SceneMessage() { sceneName = msg.sceneName, sceneOperation = SceneOperation.LoadAdditive });
- 当服务器完成加载该场景时,将客户端播放器移动到新场景:
SceneManager.MoveGameObjectToScene(character, SceneManager.GetSceneByName(GetCleanedSceneName(msg.sceneName)));
- 包含
NetworkSceneChecker
,以便仅当您处于特定场景时才可见 - (可选)如果您的场景加载了 3D 物理,请包含
PhysicsSimulator
组件。
现在,这并没有提供有关如何执行此操作的每一个微小细节,但这是了解如何实现此操作的一个很好的起点。主要收获如下:
- 客户端不会自行加载场景,除非它们明确收到服务器的请求
- 客户端需要告诉服务器他们需要加载什么场景
- 客户端需要在加载完成后通知服务器
- 服务器需要加载所有请求的场景
- 服务器负责将玩家移动到新场景
关于unity-game-engine - Unity Mirror - 如何进行单独场景行走?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65269591/