目录
一、插件介绍
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、核心功能
-
参数同步
-
自动同步
Animator
的以下参数类型:-
Bool:如
isRunning
(是否奔跑)。 -
Float:如
speed
(移动速度)。 -
Int:如
attackType
(攻击类型)。 -
Trigger:如
jumpTrigger
(触发跳跃动画)。
-
-
仅同步发生变化的参数,减少网络流量。
-
-
状态机同步
-
确保所有客户端动画状态机(Animator State Machine)的当前状态一致。
-
同步状态切换时的过渡(Transition)和混合树(Blend Tree)权重。
-
-
服务器权威控制
-
默认由服务器驱动动画逻辑,客户端仅接收同步数据。
-
可配置为客户端预测模式(需谨慎处理状态冲突)。
-
-
延迟补偿
-
插值处理动画过渡,缓解网络延迟带来的卡顿感。
-
3、关键属性与配置
在 Unity Inspector 面板中,Network Animator 的主要配置如下:
属性 | 说明 |
---|---|
Authority | 控制权限类型(客户端或服务器),决定动画控制权的归属方 |
Client Authority | 启用后允许客户端向服务器发送动画参数更改(需与Authority权限类型配合使用) |
Animator | 指定需要同步的Animator组件(若为空,默认绑定当前对象的Animator组件) |
Sync Direction | 同步方向: - Client To Server 表示由客户端向服务器单向同步动画状态 |
Sync Mode | 同步模式: - Observers(观察者模式)表示同步给所有观察该对象的客户端 - Owner 表示仅同步给对象的所有者客户端和服务器 |
Sync Interval | 同步间隔时间(秒),数值为0时表示实时同步 |
4、同步机制
1. 默认服务器权威模式
-
流程:
-
客户端通过
[Command]
向服务器发送动画参数变更请求。 -
服务器验证后更新
Animator
参数,并广播给所有客户端。 -
客户端根据同步数据更新本地
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. 客户端预测模式
-
流程:
-
客户端直接修改本地
Animator
参数并立即播放动画。 -
向服务器发送参数变更请求,服务器验证后广播修正。
-
若服务器拒绝,客户端回滚动画状态。
-
-
风险:客户端预测可能导致动画状态短暂不一致(如攻击动作被服务器拒绝)。
-
适用场景:对实时性要求高且状态可安全回滚的动画(如移动、跳跃)。
5、基础使用步骤
步骤1:配置组件
-
为需要同步动画的物体(如角色预制体)添加
Animator
组件,并绑定动画控制器。 -
添加
Network Animator
组件,将Animator
字段拖拽赋值。 -
确保物体已挂载
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、最佳实践
参数命名规范
- 统一命名动画参数(如
movementSpeed
、isJumping
),避免拼写错误导致同步失败。
分层同步策略
- 高频参数(如移动速度):同步间隔短(
Sync Interval = 0.1
)。 - 低频参数(如死亡动画):仅在变化时同步(
Sync Interval = 0
)。
安全性验证
- 对客户端发送的动画请求进行服务器验证,防止非法动画触发:
[Command]
void CmdPlayAttack() {
if (CanAttack()) { // 检查冷却时间、状态等
networkAnimator.SetTrigger("attack");
}
}
动画事件同步
- 使用
ClientRpc
同步动画事件(如脚步声、特效生成):
// Animator 事件调用的本地方法
void OnFootstepEvent() {
if (isServer) {
RpcPlayFootstepSound();
}
}
[ClientRpc]
void RpcPlayFootstepSound() {
AudioSource.PlayClipAtPoint(footstepClip, transform.position);
}