Unity NetCode

GameObject和NetworkObject对比:

功能 GameObject NetworkObject
基本特性 场景中的基础对象,用于承载组件。 增强版的 GameObject,带有网络同步功能。
标识符 无全局唯一标识,只是场景中的对象。 NetworkId,全局唯一,确保网络实例同步一致。
生命周期管理 本地管理,场景销毁时自动销毁。 服务端控制,通过 Spawn()Despawn() 同步。
同步状态 本地状态,不支持网络同步。 支持 NetworkVariable 和组件(如位置、变换)的同步。
通信能力 无法直接通信。 通过 [ServerRpc][ClientRpc] 实现网络通信。
所有权管理 无所有权概念,任何对象都可操作。 OwnerClientId,支持动态分配所有权。
使用场景 单机游戏或不需要同步的对象。 多人网络游戏,需要同步的对象。

NetworkBehaviour标志位:

标志位 描述 关系描述
IsServer 判断是否是服务器端 IsServerIsClient 互斥,一个是服务器,一个是客户端
IsClient 判断是否是客户端端 IsClientIsServer 互斥,一个是服务器,一个是客户端
IsOwner 判断是否是对象的所有者 IsLocalPlayer 相关,通常本地玩家拥有对象的控制权
IsLocalPlayer 判断是否是本地玩家 IsLocalPlayer 是指当前客户端控制的玩家角色,而非对象的所有者
IsHost 判断是否是主机(既是服务器又是客户端) IsHost 为 true 时,IsServerIsClient 都为 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/
作者
Yonagi
发布于
2024年11月19日
许可协议