​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介绍-优快云博客


二、主要组件

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

Network Manager

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

Network Manager HUD

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

Network Identity

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

Network Transform

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


三、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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一颗橘子宣布成为星球

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值