Unity之NetCode多人网络游戏联机对战教程(9)--NetworkAnimator组件

文章目录

    • 前言
    • NetworkAnimator
    • Animator的Trigger属性
    • 服务器权威模式(Server Authoritative Mode)
    • 客户端权威模式 (Owner Authoritative Mode)
    • 学习文档

前言

这个组件是NetCode常用的组件之一,NetworkAnimatorNetworkTransform一样,用来同步信息,NetworkAnimator是用来同步动画的。


NetworkAnimator

NetworkAnimator组件为提供了如何在网络会话期间同步动画的基本示例。动画状态与加入现有网络会话的玩家同步,并与在动画状态更改之前已连接的任何客户端同步。

加入现有网络会话的玩家将与以下内容同步:

  • 所有Animator的当前属性状态
    • 除了Animatortrigger属性。这些仅与已连接的客户端同步。
  • 任何正在进行的过渡
  • 已连接的玩家将与Animator的更改同步:
    • 状态
    • 过渡
    • 属性
      • NetworkAnimator仅同步自上一帧以来发生更改的属性值。
      • 由于trigger类似于event,当将Animator属性设置为true时,它将始终同步。

NetworkAnimator可以以两种权威模式运行:

  • 服务器权威(默认):服务器启动动画状态更改。
    • 拥有者仍然可以调用NetworkAnimator.SetTrigge
  • 客户端权威:客户端所有者启动动画状态更改。

Animator的Trigger属性

AnimatorTrigger属性类型基本上不过是一个布尔值,当设置为true时,在Animator组件处理完触发器后将自动重置为false。通常,触发器用于启动Animator层状态之间的过渡。从这个意义上说,可以将Trigger看作是信号"事件的开始"的一种方式。由于Trigger属性具有这种独特的行为,因此要通过NetworkAnimator.SetTrigger方法设置触发器值。

注意: 如果使用Animator.SetTrigger设置Trigger属性,那么这不会与非所有者客户端同步


服务器权威模式(Server Authoritative Mode)

NetworkAnimator的默认设置是服务器权威模式(Server Authoritative Mode)。在服务器权威模式下,任何在服务器端设置(触发器)或检测到的(层、状态或任何Animator属性的更改,不包括触发器)的动画状态更改都将与所有客户端同步。由于服务器发起对Animator状态更改的任何同步,与NetworkAnimator相关联的NetworkObject的所有者客户端可能会滞后大约完整的往返时间(RTT)。下面是一个时序图来展示这一点:

Unity之NetCode多人网络游戏联机对战教程(9)--NetworkAnimator组件_第1张图片
在上面的图表中,客户端可能会向服务器发送一个RPC,告诉服务器玩家正在执行某种可能改变玩家动画的操作(包括设置触发器)。在这种情况下,客户端向服务器发送一个RPC(一半RTT),服务器处理RPC,NetworkAnimator(服务器端)检测到相关的Animator状态更改,然后所有客户端(包括所有者客户端)都与更改同步。

  • 服务器权威模型的优势
    • 如果运行一个普通的服务器(非主机),这个模型有助于减少所有客户端动画之间的同步延迟。
  • 服务器权威模型的缺点
    • 主机将始终“稍微领先”于所有其他客户端,这可能对您的项目是一个问题或不是一个问题。
    • 客户端所有者在执行动作(移动、拾取物品、导致Animator状态更改的任何操作)时会经历延迟。

客户端权威模式 (Owner Authoritative Mode)

通常,项目设计(或个人偏好)可能要求所有者立即更新到任何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。

Unity之NetCode多人网络游戏联机对战教程(9)--NetworkAnimator组件_第2张图片

在上面的图表中,显示了所有者客户端有一个Animator状态更改,被NetworkAnimator(OwnerNetworkAnimator)检测到,它自动将服务器与更改的状态同步。服务器在本地应用了这些更改,然后将此状态更改广播给所有非所有者客户端。

  • Owner authoritative mode优点
    • 所有者能够即时获得Animator状态更改的视觉反馈,为本地玩家提供更流畅的体验。
  • Owner authoritative mode缺点
    • 非所有者客户端的动画大约滞后于所有者客户端一个完整的往返时间(RTT)。
    • 主机的动画大约滞后于所有者客户端的动画半个往返时间(RTT)。

学习文档

https://docs-multiplayer.unity3d.com/netcode/current/components/networkanimator/

你可能感兴趣的:(#,NetCode,unity,NetworkAnimator,NetCode,动画,同步)