前言
NetworkTransform :让所有客户端看到的游戏物体位置、旋转、缩放完全一致。
它是 NGO 框架中最常用的组件之一
一、核心概念:什么是 NetworkTransform?
NetworkTransform 是一个继承自 NetworkBehaviour 的专用组件,专门负责同步游戏物体的 位置(Position)、旋转(Rotation)、缩放(Scale) 三大空间状态。
NetworkObject= 物体的「网络身份证」,用来识别这个物体是谁NetworkTransform= 物体的「实时 GPS 定位」,用来同步这个物体在哪、朝向哪、多大
核心:权限模型
NetworkTransform 最核心的设计是权限模型,它决定了「谁能说了算,谁能修改这个物体的位置」:
- 服务器权威(Server Authority) :默认模式,只有服务器能修改物体位置,客户端的修改会被服务器强制覆盖
- 客户端权威(Owner Authority) :物体的拥有者客户端能直接修改,服务器不回滚,修改自动同步给所有人
二、基础使用
1. 添加组件
给需要同步的物体添加两个必须的组件:
NetworkObject:网络身份标识(没有它,NetworkTransform 无法工作)NetworkTransform或ClientNetworkTransform:根据你的权限需求选择
2. 基础配置
在 Inspector 面板中,你只需要做两步配置:
- 勾选你需要同步的轴(比如 2D 游戏可以关掉 Y 轴位置同步)
- 选择 Authority 模式:Server 或 Owner
3. 权限判断
不管是哪种模式,你都需要在代码里加权限判断,避免所有客户端都执行移动逻辑:
void Update()
{
// 只有拥有这个物体的客户端,才能执行移动逻辑
if (!IsOwner) return;
// 你的移动代码...
}
三、核心参数详解
| 参数 | 作用 | 适用场景 |
|---|---|---|
| Sync Position/X/Y/Z | 是否同步位置的对应轴 | 2D 游戏可以关闭 Y 轴,减少带宽 |
| Sync Rotation/X/Y/Z | 是否同步旋转的对应轴 | 不需要旋转的物体可以直接关掉 |
| Sync Scale/X/Y/Z | 是否同步缩放的对应轴 | 静态物体永远不变的话可以关掉 |
| Position Threshold | 位置变化超过多少才同步 | 小抖动 / 震动不用同步,优化性能 |
| Rotation Threshold | 旋转变化超过多少才同步 | 同上,减少不必要的更新 |
| Scale Threshold | 缩放变化超过多少才同步 | 同上 |
| Interpolate | 是否开启插值平滑 | 开启后移动不会闪现,非常丝滑 |
| Slerp Position | 用球形插值代替线性插值 | 曲线移动、旋转物体更自然 |
| Send Interval | 同步频率,默认 0.05s(20 次 / 秒) | 玩家用高频,静态物体用低频 |
| In Local Space | 同步局部坐标而非世界坐标 | 子物体跟随父物体移动时用 |
| Use Unreliable Deltas | 用不可靠信道发送同步包 | 移动同步允许丢包,提高速度 |
| Use Half Float Precision | 用半精度浮点数压缩数据 | 减少 50% 的位置同步带宽 |
| Use Quaternion Compression | 压缩四元数旋转数据 | 减少旋转同步的带宽占用 |
四、两种 Transform:Server vs Client 怎么选?
| 特性 | NetworkTransform(服务器权威) | ClientNetworkTransform(客户端权威) |
|---|---|---|
| 权限规则 | 服务器说了算,客户端改了会被回滚 | 拥有者客户端说了算,服务器不覆盖 |
| 操作延迟 | 客户端→服务器→客户端,有延迟 | 客户端本地直接改,零延迟手感 |
| 防作弊 | 强,服务器验证所有状态 | 弱,客户端可以修改本地数据 |
| 适用场景 | NPC、怪物、门、平台、场景物体 | 玩家角色、本地载具、可拖拽道具 |
五、权限判断:IsOwner vs IsLocalPlayer 别搞混
这是新手 90% 都会踩的坑!两个属性完全不是一回事:
| 属性 | 含义 | 适用对象 |
|---|---|---|
| IsLocalPlayer | 是不是「当前客户端自己的玩家对象」 | 只有玩家对象(NetworkObject 勾选了 Is Player) |
| IsOwner | 是不是「当前客户端拥有这个网络物体」 | 所有网络物体(玩家、道具、怪物、门都能用) |
怎么用?
- 做玩家输入、玩家本地逻辑 → 用
IsLocalPlayer - 做普通网络物体(比如你捡的道具)的操控 → 用
IsOwner
六、底层原理:为什么移动这么丝滑?
你有没有好奇过,为什么开了 Interpolate 之后,就算网络有延迟,物体移动也不会闪现?
NetworkTransform 内部用了快照插值的机制:
- 权威端:定时把物体的位置、时间戳打包成「状态快照」发给所有人
- 非权威端:把收到的快照存到一个缓冲队列里
- 插值计算:根据本地的网络时间,在两个快照之间做平滑过渡,就算丢了几个包,也能靠缓冲补回来
这就是为什么移动同步能做到丝滑,就算有 100ms 的延迟,你也看不到闪现。
和 Rpc 的关系
- NetworkTransform:专门负责「位置 / 旋转 / 缩放」的低延迟自动同步,不用你写代码
- Rpc:专门负责「所有其他游戏逻辑」,比如攻击、开门、放技能,需要服务器验证
就像玩家的标准架构:
- 移动:ClientNetworkTransform,零延迟,自动同步
- 攻击 / 跳跃 / 交互:ServerRpc,交给服务器验证,防止作弊