我有一个即将完成的游戏。游戏具有多个“房间”,这些“房间”在运行时会生成以创建“关卡”。这些房间都包含预制件,例如杠杆,门和压板,这些东西一起构成一个难题,需要解决才能打开下一个房间。这些杠杆和门(等)均具有NetworkIdentity组件,因此它们的状态可以通过网络进行同步。以前,我有一个复杂的系统,用于在网络上同步添加场景的负载,uNet本身不支持这种功能,但是我发现添加嵌套的预制件会使生活变得更简单。附加场景的实现只是存在许多无法追踪的错误,从而阻碍了游戏体验,并使某些客户端无法玩游戏。
我已经删除了所有附加场景加载代码,并将房间场景转换为房间嵌套的预制件。现在,使用NetworkServer.Spawn()生成了这些预制件。但是,每个房间都需要一个NetworkIdentity才能通过网络生成。这意味着没有任何子级预制件(例如杠杆和门)通过网络连接。
相反,我从房间中删除了NetworkIdentity组件,在客户端和服务器上本地实例化了它们。然后,我使服务器使用NetworkIdentity组件生成所有房间对象对象,并在客户端上使用本地实例化的网络标识组件销毁所有对象,而不是等待生成的对象出现。我还将房间中的每个联网对象注册为客户端上可生成的预制件。但是,这些对象是使用基础预制件的一致NetworkIdentity.assetId在服务器上生成的,即所有杠杆都具有相同的资产ID。这不是我想要的,因为我希望每个级别中的每个杠杆或门都具有唯一的资产ID,以便可以在每个客户端上正确生成它。
如果我可以强制服务器上每个房间对象的assetId唯一,则可以在客户端上正确生成这些对象。但是,即使那样,我也必须重建对对象所需的其余场景的所有引用,以及对场景所需的所有对象的引用。该属性似乎是只读的,所以我不能。我不知道如何解决这个问题。有人可以帮忙吗?
如果有人可以确认此功能已在其他解决方案中实现,我准备从uNet更改网络框架。