场景对象

使用NetworkServer.Spawn()将动态创建的对象添加到网络中,但场景中已存在的对象的处理方式不同。这些对象与客户端和服务器上的场景一起加载,并在发送任何产生消息之前存在于运行时。

场景加载时,在客户端和服务器上,具有NetworkIdentity组件的场景中的所有对象都将被禁用。然后,当场景完全加载时,调用NetworkServer.SpawnObjects()来激活这些联网场景对象。这将在服务器场景加载完成时由NetworkManager自动完成 - 或者可以由用户代码直接调用。这将导致网络场景对象以特殊方式产生 - 现有的实例被连接到网络,而不是创建新的实例。

有一些很好的理由使用场景对象而不是动态生成的对象。这些对象:

  1. 被加载的级别,所以在运行时不会有暂停
  2. 可以具有与预制不同的特定修改
  3. 可以被场景中的其他对象实例引用,这可以避免在运行时找到对象来挂钩它们

一旦场景对象由NetworkServer.SpawnObjects()产生,那么它们的行为就像其他每个产生的对象一样。更新将被发送,并可以进行ClientRPC调用。

如果场景中的某个对象在客户端加入游戏之前在服务器上被销毁,那么它将永远不会在新加入的客户端上产生。

联网场景对象在网络启动时被禁用。场景中具有NetworkIdentity的任何场景对象都是联网的场景对象。

在服务器上,当调用NetworkServer.SpawnObjects()时会启用这些对象 - 所以当服务器启动时,或场景在服务器上完成加载时。当客户端连接时,客户端会为该客户端可见的每个服务器上存在的每个场景对象发送ObjectSpawnScene spawn消息。此消息会导致客户端上的对象被启用,并且具有来自服务器中该对象的最新状态。因此,客户端上只会激活客户端可见且未在服务器上销毁的对象。与常规的非场景对象一样,当客户端加入游戏时,这些场景对象将以最新状态启动。

?