我的玩家角色在激活了根部动作的情况下使用Animator在世界各地移动。基本上,AI系统在Animator上设置速度,该速度又控制控制角色运动的Animation剪辑。由于这是一个标准功能,可以确保非常逼真的动画而不会出现明显的滑动,因此我认为这是个好主意……直到我添加了网络同步。

使用NetworkTransform和NetworkAnimation在网络上同步字符会导致这两个组件发生冲突:


NetworkTransform将字符移动到主机命令的任何位置。
NetworkAnimator同步动画变量,并按照主机的指示播放动画剪辑,而这些动画剪辑也应用根动画。


结果是精确的(意味着角色到达了确切的目标目的地),但动作非常结结(明显的跳跃)。

删除NetworkTransform后,角色的主机和客户端实例将非常不同步,这意味着,当它们仅由依赖于时间的Animator控制时,它们最终将位于世界的不同位置。

删除NetworkAnimator后,客户端实例将不会播放与主机相同的动画(如果有的话)。

我尝试在禁用Animator的根运动的同时保留两个组件(仅在客户端上)。但是,在那种情况下,NetworkTransform似乎根本不会插值。角色以大约0.02个单位的步长从同步位置跳到同步位置。与旋转相同。

NetworkTransform配置为“同步变换”,因为角色既没有RigidBody也没有CharacterController。所有其他值均为默认值:同步速率9(也尝试使用更高的值),运动阈值0.001,捕捉阈值5,插值运动= 1。

如何在网络上获得流畅的根部运动?我希望这是一个标准方案...

最佳答案

您需要的是在非本地实例上禁用“根运动”标志,而且还要内插旋转,而不仅是移动。

此外,插值1似乎很高,与5的阈值相同:除非您不使用1单位= 1米的Unity标准,否则插值似乎不太现实。我将为运动设置25cm(0.25)的插值,并为旋转设置3度的插值。 9的同步速率就足够了,但是根据我的经验,必须根据丢包率重新计算它。

07-24 09:47