这个组件是NetCode常用的组件之一,NetworkAnimator
跟NetworkTransform
一样,用来同步信息,NetworkAnimator
是用来同步动画的。
NetworkAnimator
组件为提供了如何在网络会话期间同步动画的基本示例。动画状态与加入现有网络会话的玩家同步,并与在动画状态更改之前已连接的任何客户端同步。
加入现有网络会话的玩家将与以下内容同步:
trigger
属性。这些仅与已连接的客户端同步。trigger
类似于event
,当将Animator属性设置为true时,它将始终同步。NetworkAnimator
可以以两种权威模式运行:
NetworkAnimator.SetTrigge
。Animator
的Trigger
属性类型基本上不过是一个布尔值,当设置为true时,在Animator
组件处理完触发器后将自动重置为false。通常,触发器用于启动Animator层状态之间的过渡。从这个意义上说,可以将Trigger
看作是信号"事件的开始"的一种方式。由于Trigger
属性具有这种独特的行为,因此要通过NetworkAnimator.SetTrigger
方法设置触发器值。
注意: 如果使用
Animator.SetTrigger
设置Trigger
属性,那么这不会与非所有者客户端同步。
NetworkAnimator
的默认设置是服务器权威模式(Server Authoritative Mode)
。在服务器权威模式下,任何在服务器端设置(触发器)或检测到的(层、状态或任何Animator属性的更改,不包括触发器)的动画状态更改都将与所有客户端同步。由于服务器发起对Animator状态更改的任何同步,与NetworkAnimator相关联的NetworkObject的所有者客户端可能会滞后大约完整的往返时间(RTT)。下面是一个时序图来展示这一点:
在上面的图表中,客户端可能会向服务器发送一个RPC,告诉服务器玩家正在执行某种可能改变玩家动画的操作(包括设置触发器)。在这种情况下,客户端向服务器发送一个RPC(一半RTT),服务器处理RPC,NetworkAnimator(服务器端)检测到相关的Animator状态更改,然后所有客户端(包括所有者客户端)都与更改同步。
通常,项目设计(或个人偏好)可能要求所有者立即更新到任何Animator状态更改。最典型的原因是为本地玩家提供即时的视觉(动画)反馈。要创建一个以所有者为权威的NetworkAnimator
,您需要创建一个从NetworkAnimator
派生的新类,重写NetworkAnimator.OnIsServerAuthoritative
方法,并在覆盖的OnIsServerAuthoritative
方法中返回false,就像下面提供的示例一样:
using UnityEngine;
using Unity.Netcode.Components;
public class OwnerNetworkAnimator : NetworkAnimator
{
protected override bool OnIsServerAuthoritative()
{
return false;
}
}
这个写法就是跟之前的
ClientNetworkTransform
是一样的。
观察所有者为权威的NetworkAnimator的时序,在下面的图表中,您可以看到尽管所有者客户端获得了“即时的视觉动画响应”,但非所有者客户端最终落后于所有者客户端大约一个完整的往返时间(RTT),而主机将落后于所有者客户端的一半RTT。
在上面的图表中,显示了所有者客户端有一个Animator状态更改,被NetworkAnimator(OwnerNetworkAnimator)
检测到,它自动将服务器与更改的状态同步。服务器在本地应用了这些更改,然后将此状态更改广播给所有非所有者客户端。
https://docs-multiplayer.unity3d.com/netcode/current/components/networkanimator/