文章目录
- NetworkObject
- Always Replicate As Root
- Synchronization Transform
- Active Scene Synchronization
- Scene Migration Synchronization
- Spawn With Observers
- Dont Destroy With Owner
- Auto Object Parent Sync
- 后话
NetworkObject
为了复制任何Netcode感知属性或发送/接收RPCs,一个GameObject必须具有一个NetworkObject
组件和至少一个NetworkBehaviour
组件。任何与Netcode相关的组件,如NetworkTransform
或具有一个或多个NetworkVariables
或RPCs的NetworkBehaviour,都需要在相同的相对GameObject上(或在相关GameObject的父GameObject上)有一个NetworkObject组件。
当生成一个NetworkObject
时,NetworkObject.GlobalObjectIdHash
的值最初标识与客户端实例化的网络预制体资源相关联的对象,用于创建客户端本地的克隆。在本地实例化后,每个NetworkObject
都分配一个NetworkObjectId
,用于在网络中关联NetworkObject。例如,一个对等方可以说:“将此RPC发送到具有NetworkObjectId 103的对象”,每个人都知道它指的是哪个对象。当为NetworkObject
分配一个唯一的NetworkObjectId
时,它就在客户端上生成。
Always Replicate As Root
如果设置为true,该对象将始终在客户端作为根对象进行复制,而其父对象将被忽略。
Synchronization Transform
有时候,您可能希望使用NetworkObject
来处理不需要同步transform
的情况。您可能有一个在场景中放置的NetworkObject
,纯粹用于管理游戏状态(或类似的用途),并且在生成时同步transform
不是初始客户端同步的成本。要防止NetworkObject
在生成时初始同步transform
,请取消选中"Synchronize Transform
"属性。默认情况下,此属性已启用(选中)。
Active Scene Synchronization
当实例化一个GameObject时,它会在当前活动的场景中被实例化。然而,有时您可能会发现希望更改当前活动的场景,并希望特定的NetworkObject实例自动迁移到新分配的活动场景。虽然您可以保持一个NetworkObject实例的列表或表,并编写代码/逻辑来将它们迁移到新分配的活动场景,但这可能会耗费时间,并根据项目的大小和复杂性变得复杂。处理这个问题的替代方法(也是推荐的方法)是通过启用/检查每个要自动迁移到任何新分配场景的NetworkObject的"Active Scene Synchronization"属性来处理。默认情况下,此属性处于禁用/未选中状态。
Scene Migration Synchronization
与NetworkObject.ActiveSceneSynchronization
类似,此属性将自动同步通过主机或服务器端的SceneManager.MoveGameObjectToScene迁移到场景中的客户端端NetworkObject
实例。如果您希望将NetworkObject
实例迁移到不是当前活动场景的特定场景中,这将非常有用。
Spawn With Observers
当设置为false时,NetworkObject将在初始时不会具有任何Observers
(除了Server)。
Dont Destroy With Owner
是否销毁此对象,如果其所有者被销毁。如果设置为true,该对象的所有权将移交给服务器。
Auto Object Parent Sync
是否启用自动的NetworkObject父对象同步。
后话
官方文档教程:
-
https://docs-multiplayer.unity3d.com/netcode/current/basics/networkobject/
-
https://docs.unity3d.com/Packages/com.unity.netcode.gameobjects@1.6/api/Unity.Netcode.NetworkObject.html