Unity插件-Mirror使用方法(七)组件介绍(Network Animator)

目录

一、插件介绍

二、主要组件

Network Manager

Network Manager HUD

Network Identity

Network Transform

三、Network Animator

1、组件介绍

2、核心功能

参数同步

状态机同步

服务器权威控制

延迟补偿

3、关键属性与配置

4、同步机制

1. 默认服务器权威模式

2. 客户端预测模式

5、基础使用步骤

步骤1:配置组件

步骤2:同步参数

6、高级功能与优化

1. 动态调整同步参数

2. 自定义动画同步逻辑

3. 解决触发冲突

7、常见问题与解决

8、最佳实践

参数命名规范

分层同步策略

安全性验证

动画事件同步


一、插件介绍

Unity插件-Mirror使用方法(一)Mirror介绍-CSDN博客


二、主要组件

Unity插件-Mirror使用方法(二)组件介绍-CSDN博客

Network Manager

Unity插件-Mirror使用方法(三)组件介绍(Network Manager)-CSDN博客

Network Manager HUD

Unity插件-Mirror使用方法(四)组件介绍(​Network Manager HUD)-CSDN博客

Network Identity

Unity插件-Mirror使用方法(五)组件介绍(​Network Identity)-CSDN博客

Network Transform

​Unity插件-Mirror使用方法(六)组件介绍(​Network Transform)-CSDN博客


三、Network Animator

1、组件介绍

Network Animator 是 Unity Mirror 中用于同步动画状态的核心组件,能够自动将 Animator 组件的参数(如布尔值、浮点数、触发器等)和动画状态在服务器与客户端之间同步。它适用于角色动作、机关动画、场景交互等需要多客户端动画一致的场景。

网络动画师组件允许您同步联网对象的动画状态。它会同步来自动画控制器 (Animator Controller) 的状态和参数。

请注意,如果在空游戏对象上创建网络动画师组件,Mirror 还会在该游戏对象上自动创建网络标识 (Network Identity) 组件和动画控制器 (Animator) 组件。


2、核心功能

  1. 参数同步

    • 自动同步 Animator 的以下参数类型:

      • Bool:如 isRunning(是否奔跑)。

      • Float:如 speed(移动速度)。

      • Int:如 attackType(攻击类型)。

      • Trigger:如 jumpTrigger(触发跳跃动画)。

    • 仅同步发生变化的参数,减少网络流量。

  2. 状态机同步

    • 确保所有客户端动画状态机(Animator State Machine)的当前状态一致。

    • 同步状态切换时的过渡(Transition)和混合树(Blend Tree)权重。

  3. 服务器权威控制

    • 默认由服务器驱动动画逻辑,客户端仅接收同步数据。

    • 可配置为客户端预测模式(需谨慎处理状态冲突)。

  4. 延迟补偿

    • 插值处理动画过渡,缓解网络延迟带来的卡顿感。


3、关键属性与配置

在 Unity Inspector 面板中,Network Animator 的主要配置如下:

属性 说明
Authority 控制权限类型(客户端或服务器),决定动画控制权的归属方
Client Authority 启用后允许客户端向服务器发送动画参数更改(需与Authority权限类型配合使用)
Animator 指定需要同步的Animator组件(若为空,默认绑定当前对象的Animator组件)
Sync Direction

同步方向:
- ​Server To Client​(默认)表示由服务器向客户端单向同步动画状态

- ​Client To Server 表示由客户端向服务器单向同步动画状态

Sync Mode 同步模式:
- ​Observers​(观察者模式)表示同步给所有观察该对象的客户端
- ​Owner​ 表示仅同步给对象的所有者客户端和服务器
Sync Interval 同步间隔时间(秒),数值为0时表示实时同步

4、同步机制

1. 默认服务器权威模式

  • 流程

    1. 客户端通过 [Command] 向服务器发送动画参数变更请求。

    2. 服务器验证后更新 Animator 参数,并广播给所有客户端。

    3. 客户端根据同步数据更新本地 Animator,播放动画。

  • 示例(触发攻击动画):

    public class PlayerCombat : NetworkBehaviour {
        private Animator animator;
        private NetworkAnimator networkAnimator;
    
        void Start() {
            animator = GetComponent<Animator>();
            networkAnimator = GetComponent<NetworkAnimator>();
        }
    
        void Update() {
            if (isLocalPlayer && Input.GetKeyDown(KeyCode.Space)) {
                CmdPlayAttackAnimation();
            }
        }
    
        [Command]
        void CmdPlayAttackAnimation() {
            // 服务器设置触发参数并同步
            animator.SetTrigger("attack");
            networkAnimator.SetTrigger("attack"); // 显式触发网络同步
        }
    }

2. 客户端预测模式

  • 流程

    1. 客户端直接修改本地 Animator 参数并立即播放动画。

    2. 向服务器发送参数变更请求,服务器验证后广播修正。

    3. 若服务器拒绝,客户端回滚动画状态。

  • 风险:客户端预测可能导致动画状态短暂不一致(如攻击动作被服务器拒绝)。

  • 适用场景:对实时性要求高且状态可安全回滚的动画(如移动、跳跃)。


5、基础使用步骤

步骤1:配置组件

  1. 为需要同步动画的物体(如角色预制体)添加 Animator 组件,并绑定动画控制器。

  2. 添加 Network Animator 组件,将 Animator 字段拖拽赋值。

  3. 确保物体已挂载 Network Identity 组件。

步骤2:同步参数

  • 自动同步
    Network Animator 默认自动同步所有 Animator 参数。若需手动控制,可通过代码指定:

    // 在服务器端设置参数并同步
    networkAnimator.SetParameterAutoSend(animator.GetParameterHash("speed"), true);
  • 手动同步
    通过 networkAnimator.SetTrigger() 或 networkAnimator.SetFloat() 显式触发同步:

    // 客户端触发跳跃动画(需通过 Command 发送到服务器)
    [Command]
    void CmdJump() {
        animator.SetTrigger("jump");
        networkAnimator.SetTrigger("jump"); // 同步到所有客户端
    }

6、高级功能与优化

1. 动态调整同步参数

根据动画重要性动态启用/禁用参数同步,减少带宽占用:

public class DynamicAnimSync : NetworkBehaviour {
    private NetworkAnimator networkAnimator;
    private int speedParamHash;

    void Start() {
        networkAnimator = GetComponent<NetworkAnimator>();
        speedParamHash = Animator.StringToHash("speed");
    }

    void Update() {
        if (isServer) {
            // 仅在速度变化较大时同步
            float speed = animator.GetFloat(speedParamHash);
            bool shouldSync = Mathf.Abs(speed - lastSpeed) > 0.1f;
            networkAnimator.SetParameterAutoSend(speedParamHash, shouldSync);
            lastSpeed = speed;
        }
    }
}

2. 自定义动画同步逻辑

继承 NetworkAnimator 并重写方法,实现复杂同步逻辑:

public class CustomNetworkAnimator : NetworkAnimator {
    // 仅同步特定层级(如只同步基础动作层)
    protected override void UpdateAnimator() {
        for (int i = 0; i < animator.layerCount; i++) {
            if (i == 0) { // 仅同步第0层
                animator.GetCurrentAnimatorStateInfo(i);
            }
        }
        base.UpdateAnimator();
    }
}

3. 解决触发冲突

使用唯一标识符避免触发器重复触发:

[Command]
void CmdPlayUniqueAnimation(int animationId) {
    if (CanPlayAnimation(animationId)) {
        animator.SetTrigger("action_" + animationId);
        networkAnimator.SetTrigger("action_" + animationId);
    }
}

7、常见问题与解决

问题 解决方案
动画不同步 检查 Network Animator 是否绑定正确的 Animator,确保参数名称一致。
Trigger 未触发 使用 networkAnimator.SetTrigger() 而非直接调用 animator.SetTrigger()
动画卡顿 降低 Sync Interval 或启用插值(需自定义脚本)。
客户端权限问题 确认 Client Authority 配置正确,且动画逻辑在服务器验证。
带宽占用过高 减少同步参数数量,或动态禁用非关键参数同步。

8、最佳实践

参数命名规范

  1. 统一命名动画参数(如 movementSpeedisJumping),避免拼写错误导致同步失败。

分层同步策略

  1. 高频参数(如移动速度):同步间隔短(Sync Interval = 0.1)。
  2. 低频参数(如死亡动画):仅在变化时同步(Sync Interval = 0)。

安全性验证

  1. 对客户端发送的动画请求进行服务器验证,防止非法动画触发:
[Command]
void CmdPlayAttack() {
    if (CanAttack()) { // 检查冷却时间、状态等
        networkAnimator.SetTrigger("attack");
    }
}

动画事件同步

  1. 使用 ClientRpc 同步动画事件(如脚步声、特效生成):
// Animator 事件调用的本地方法
void OnFootstepEvent() {
    if (isServer) {
        RpcPlayFootstepSound();
    }
}

[ClientRpc]
void RpcPlayFootstepSound() {
    AudioSource.PlayClipAtPoint(footstepClip, transform.position);
}