NetworkTransform 学习笔记

2 阅读4分钟

前言

NetworkTransform让所有客户端看到的游戏物体位置、旋转、缩放完全一致

它是 NGO 框架中最常用的组件之一


一、核心概念:什么是 NetworkTransform?

NetworkTransform 是一个继承自 NetworkBehaviour 的专用组件,专门负责同步游戏物体的 位置(Position)、旋转(Rotation)、缩放(Scale) 三大空间状态。

  • NetworkObject = 物体的「网络身份证」,用来识别这个物体是谁
  • NetworkTransform = 物体的「实时 GPS 定位」,用来同步这个物体在哪、朝向哪、多大

核心:权限模型

NetworkTransform 最核心的设计是权限模型,它决定了「谁能说了算,谁能修改这个物体的位置」:

  1. 服务器权威(Server Authority) :默认模式,只有服务器能修改物体位置,客户端的修改会被服务器强制覆盖
  2. 客户端权威(Owner Authority) :物体的拥有者客户端能直接修改,服务器不回滚,修改自动同步给所有人

二、基础使用

1. 添加组件

给需要同步的物体添加两个必须的组件:

  1. NetworkObject:网络身份标识(没有它,NetworkTransform 无法工作)
  2. NetworkTransformClientNetworkTransform:根据你的权限需求选择

2. 基础配置

在 Inspector 面板中,你只需要做两步配置:

  1. 勾选你需要同步的轴(比如 2D 游戏可以关掉 Y 轴位置同步)
  2. 选择 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 内部用了快照插值的机制:

  1. 权威端:定时把物体的位置、时间戳打包成「状态快照」发给所有人
  2. 非权威端:把收到的快照存到一个缓冲队列里
  3. 插值计算:根据本地的网络时间,在两个快照之间做平滑过渡,就算丢了几个包,也能靠缓冲补回来

这就是为什么移动同步能做到丝滑,就算有 100ms 的延迟,你也看不到闪现。


和 Rpc 的关系

  • NetworkTransform:专门负责「位置 / 旋转 / 缩放」的低延迟自动同步,不用你写代码
  • Rpc:专门负责「所有其他游戏逻辑」,比如攻击、开门、放技能,需要服务器验证

就像玩家的标准架构:

  • 移动:ClientNetworkTransform,零延迟,自动同步
  • 攻击 / 跳跃 / 交互:ServerRpc,交给服务器验证,防止作弊