【问题标题】:Unity UNET How to change online scene in sync with clientsUnity UNET 如何与客户端同步更改在线场景
【发布时间】:2019-05-17 08:40:39
【问题描述】:

我在我的游戏中使用旧的 Unity 2017.3 UNET 实现。玩家连接到服务器并被放置在大厅场景中,直到派对领袖选择另一个级别去。该实现只是默认 NetworkLobbyManager 的略微修改版本。

现在问题开始了,因为我已经开始大量测试网络代码,方法是为客户端运行已编译的构建,然后将编辑器用作服务器。很多时候,在编辑器中运行的服务器会比编译的客户端构建慢很多。因此,当我使用NetworkManager.ServerChangeScene 时,客户端将在服务器之前加载场景,这将导致客户端场景上的所有 NetworkIdentities 都被禁用(因为它们尚未在服务器上创建。)

如果服务器正在运行已编译的构建,则发生这种情况的可能性要小得多,因为服务器几乎总是会在任何客户端之前加载场景。但它确实暴露了 Unity 本身的一个更大的问题。无法保证切换场景时服务器可用。

在网络游戏中还有其他改变场景的方法吗?有没有办法保证服务器在任何客户端之前进入场景?还是我只是希望网络在场景变化之间保持稳定?

【问题讨论】:

标签: unity3d networking unity3d-unet


【解决方案1】:

好吧,我想了一夜之间,决定转向其他方向,因为更多调查显示,有时当服务器首先加载场景时,网络身份仍然被禁用。

我正在查看UNET source code 并意识到服务器应该考虑它在客户端之后加载场景的情况,尽管该代码在我看来有点卡顿。这个理论得到了documentation 的支持,我发现它还说启动时场景中的 NetworkIdentities 被视为在服务器启动时动态生成。

现在知道了这些事情,我开始认为我只是愚蠢并且把一些东西搞砸了。被禁用的对象是启用和禁用其他 NetworkIdentity 对象的管理器。我很确定主要问题是它正在禁用客户端上的网络身份,而该身份仍然在服务器上启用,这导致整个事情变得混乱。

在未来,我将尽量避免在网络基础上启用和禁用游戏对象,并坚持将相关功能放在我自己的标志后面,这样我就可以“软禁用”一个对象,而无需窃听任何传入的 RPC 或 SyncVar 数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-26
    • 2022-11-11
    • 2017-06-14
    相关资源
    最近更新 更多