首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >统一镜-如何执行单独的场景旅行?

统一镜-如何执行单独的场景旅行?
EN

Stack Overflow用户
提问于 2020-12-12 20:38:28
回答 1查看 3.5K关注 0票数 2

我有点被困在这里该怎么办了。我没有得到任何帮助,从不和谐服务器,所以我转到这里,希望有人对我有一些洞察力。

背景:

这就是我想要达到的目标。我希望有一个server+client主机(使用Unity ),但允许所有客户端在场景之间来回移动。这个概念看起来很简单,但我还没有找到一个好的解决方案。请注意,我有服务器调节设置的球员移动。

我尝试过的:

每次客户想去一个新的场景时,他都会向服务器发送一个请求。服务器将额外加载场景,并将RPC发送回客户端,客户端也将额外加载场景。然后场景已经成功加载,无论是客户端还是服务器,它都将调用MoveObjects命令(在SceneManager上)将播放机字符移动到新场景。所以这意味着和解应该还是可以的。如果您不是服务器,那么卸载旧场景。如果您是服务器,那么当场景中仍然有客户端时,保持所有场景的附加加载。

我上述方法的唯一问题是,我不能禁用/隐藏服务器上的场景(或者至少我还不知道如何做到这一点)。

我的请求

这是最好的办法吗?有免费的代码示例我可以看吗?可以解释更好的方法的教程吗?还有其他人用更好的方法做这件事吗?我真的很感激能在这件事上得到任何帮助。

最后的想法

我想的最后一件事是如何动态地启动一个新的服务器,并在每一个新的统一场景中连接到新的服务器,从而分离玩家。这种方法唯一的问题是它破坏了跨场景的通信。比如,如果我想展示玩家所在的场景,以及他们当前的健康状况,那么在多个场景的派对上,所有的玩家都会看到他们的健康状况。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-23 03:21:27

这有点复杂。然而,我做到了以下几点:

  1. 制作了一个旅行函数,这个函数会让客户端直接向服务器发送请求,让服务器自己加载场景,然后告诉客户端也这样做。在旅行函数中,它将有一个简单的调用,如:

代码语言:javascript
复制
NetworkClient.Send(new ClientRequestLoadScene() { sceneName = sceneName, travelPoint = travelPoint }); 

服务器上的

  1. 注册了希望使用此消息类型的自定义处理程序。如果场景尚未加载,则自己加载场景,然后告诉客户端使用内置处理程序加载场景,该处理程序在客户端上注册如下:

代码语言:javascript
复制
conn.Send(new SceneMessage() { sceneName = msg.sceneName, sceneOperation = SceneOperation.LoadAdditive });

当服务器加载完该场景时,

  1. 将客户端播放器移动到新场景:

代码语言:javascript
复制
SceneManager.MoveGameObjectToScene(character, SceneManager.GetSceneByName(GetCleanedSceneName(msg.sceneName)));

只有在特定的scene

  • (Optional)中,
  1. 才能使NetworkSceneChecker具有可见性,如果场景中加载了3d物理,则包含PhysicsSimulator组件。

现在,这并没有给出关于如何做到这一点的每一个微小的细节,但这是一个很好的起点,可以理解您如何能够做到这一点。主要有以下几个方面:

客户端将不会自己加载场景,除非他们从server

  • clients收到这样做的请求,需要告诉服务器需要加载什么场景,

  • 客户端需要在加载

  • 时告诉服务器,服务器需要加载所有请求的场景

  • ,服务器负责将播放器移动到新场景

<代码>F 234

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65269591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档