Unity NetCode
GameObject和NetworkObject对比:
| 功能 | GameObject |
NetworkObject |
|---|---|---|
| 基本特性 | 场景中的基础对象,用于承载组件。 | 增强版的 GameObject,带有网络同步功能。 |
| 标识符 | 无全局唯一标识,只是场景中的对象。 | 有 NetworkId,全局唯一,确保网络实例同步一致。 |
| 生命周期管理 | 本地管理,场景销毁时自动销毁。 | 服务端控制,通过 Spawn() 和 Despawn() 同步。 |
| 同步状态 | 本地状态,不支持网络同步。 | 支持 NetworkVariable 和组件(如位置、变换)的同步。 |
| 通信能力 | 无法直接通信。 | 通过 [ServerRpc] 和 [ClientRpc] 实现网络通信。 |
| 所有权管理 | 无所有权概念,任何对象都可操作。 | 有 OwnerClientId,支持动态分配所有权。 |
| 使用场景 | 单机游戏或不需要同步的对象。 | 多人网络游戏,需要同步的对象。 |
NetworkBehaviour标志位:
| 标志位 | 描述 | 关系描述 |
|---|---|---|
IsServer |
判断是否是服务器端 | IsServer 与 IsClient 互斥,一个是服务器,一个是客户端 |
IsClient |
判断是否是客户端端 | IsClient 与 IsServer 互斥,一个是服务器,一个是客户端 |
IsOwner |
判断是否是对象的所有者 | 与 IsLocalPlayer 相关,通常本地玩家拥有对象的控制权 |
IsLocalPlayer |
判断是否是本地玩家 | IsLocalPlayer 是指当前客户端控制的玩家角色,而非对象的所有者 |
IsHost |
判断是否是主机(既是服务器又是客户端) | IsHost 为 true 时,IsServer 和 IsClient 都为 true |
IsSceneObject |
判断是否是场景中的物体 | 用于标识场景内的物体,与服务器或客户端角色无关 |
[ServerRpc]和[ClientRpc]的区别:
| 特性 | [ServerRpc] | [ClientRpc] |
|---|---|---|
| 定义位置 | 只能在客户端的 NetworkBehaviour 中定义 |
只能在服务端的 NetworkBehaviour 中定义 |
| 调用方 | 客户端调用,向服务端发送请求 | 服务端调用,向所有客户端广播 |
| 执行位置 | 在服务端执行,通常处理游戏逻辑和数据修改 | 在客户端执行,通常用于更新UI或进行客户端特有的操作 |
| 调用顺序 | 客户端调用,触发服务端逻辑 | 服务端调用,触发客户端执行相应的逻辑 |
| 网络传输方向 | 客户端 → 服务端 | 服务端 → 所有客户端 |
| 参数的传输方式 | 参数必须可以序列化(基本数据类型、NetworkVariable 等) |
参数必须可以序列化(基本数据类型、NetworkVariable 等) |
| 多播/单播 | 单播(每个客户端分别调用对应的 ServerRpc) | 多播(同一个 ClientRpc 被所有客户端调用) |
| 是否需要权限控制 | 无权限控制(客户端向服务端请求执行操作) | 无权限控制(服务端主动广播,所有客户端接收) |
| 用途 | 用于客户端向服务端发送请求,进行状态更改或逻辑处理 | 用于服务端向客户端广播消息或更新客户端状态 |
关于NetworkObject.Spawn():
通过Spawn()同步的对象初始化执行顺序
Awake() 此时Network没有初始化完成,相关标志位不能使用
OnNetworkSpawn()
Start()
Unity NetCode
https://blog.yonagi.top/2024/11/19/9929a788aeae/