使用Unity网络HLAPI的服务器和客户端的不同场景

时间:2016-12-01 20:33:05

标签: unity3d

我创建了一个networtk应用程序,其中一些客户端使用Unity网络高级API(HLAPI)连接到纯服务器(而不是主机)。

这是我打算实现的目标:

我的服务器具有配置为NetworkManager offlineScene和onlineScene属性的场景ServerOffline(简单地显示OFFLINE with canvas + text)和ServerOnline(显示关于连接客户端的信息,也包括canvas +文本)。那个NetworkManager显然是作为构建1的服务器启动的。

现在,任何客户端都有两个场景,但与服务器不同。 ClientOffline显示DISCONNECTED with canvas + text,ClientOnline显示app本身(cube shooting sphere)。使用相同的NetworkManager,但在将其作为Build 2的客户端启动之前,使用客户端场景(而非服务器场景)设置offlineScene和onlineScenes属性。

这是我得到的:

当客户端连接到服务器时,服务器会强制ITS场景到客户端。我在客户端上预期的场景没有加载。

问题:

如何使用Unity网络HLAPI在两端使用不同的场景操作我的服务器+客户端? NetworkManager方法是错误的吗?因为NetworkManager的做那么多好东西已经这将是可悲的不使用它。

非常感谢!

1 个答案:

答案 0 :(得分:4)

我会回答自己的问题,因为我找到了答案。我有一个名为" Base.unity"其中包含NetworkManager。

我创建了另外两个名为" Offline.unity"和" Online.unity"设置为NetworkManager属性" offlineScene"和" onlineScene"分别。 " Offline.unity"场景只有一个画面显示全屏" OFFLINE"在彩色文本中。 " Offline.unity"客户端和服务器都使用场景。

然而,我记得我的目标,我想在网上两端都有不同的场景。我创建了场景" DektopClientOnline.unity"它只包含桌面客户端的专用资产(没有摄像头,没有灯光等,因为所有常见的东西都在" Online.unity"场景中)并且我创建了场景" ServerOnline .unity"服务器专用资产(基本上是显示连接客户端的画布,等等,没有相机,灯光等)。

我专门研究了NetworkManager(称为AppNetworkManager),并基本上覆盖了两个函数:

public override void OnClientSceneChanged(NetworkConnection conn)
{
    SceneManager.LoadScene("DesktopClientOnline", LoadSceneMode.Additive);
    ClientScene.Ready(conn);
    ClientScene.AddPlayer(conn, 0);
}

public override void OnServerSceneChanged(string sceneName)
{
    SceneManager.LoadScene("ServerOnline", LoadSceneMode.Additive);
}

以下是发生的事情:

每当服务器上线时,当" Online.unity"时,将调用OnServerSceneChanged回调。场景(配置到NetworkManager中)已加载。因此,我只是注射" " ServerOnline.unity"的专门内容进入" Online.unity"。我在服务器上有我想要的东西。

然后客户端连接到服务器。然后在" Online.unity"之后调用OnClientSceneChanged回调。场景再次加载,但这次是在客户端上。我"注射" " DesktopClientOnline.unity"的专门内容进入" Online.unity"。我有客户想要的东西。

希望这对任何人都有帮助!