Unity Animator Layer + Avatar Mask

本文详细介绍了如何在Unity中使用AnimatorController设置动画层,包括BaseLayer和RunLayer,并结合AvatarMask实现复杂的动画效果。通过调整Layer权重和参数,实现了上半身攻击动画与下半身行走动画的同时播放。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Unity Animator Layer + Avatar Mask

创建Animator Controller 命名 LayerController
在这里插入图片描述

双击打开
点击 + 添加 Layer : RunLayer
在这里插入图片描述

在这里插入图片描述

编辑 Base Layer,添加 Idle 和 Attack 两个动画,将 Idle 设置为默认动画
设置 Idle -> Attack 的条件参数为 Attack = true
在这里插入图片描述

编辑 RunLayer,添加 Idle 和 Run 两个动画,将 Idle 设置为默认动画
设置 Idle -> Run 的条件参数为 Run = true
在这里插入图片描述

打开 BaseLayer 设置,Weight 默认值为 1
在这里插入图片描述

打开 RunLayer 设置,Weight 默认值为 0
在这里插入图片描述

Weight = 0,为不播放
Weight = 0 – 1为部分播放
Weight = 1,为播放全部

运行Unity
在这里插入图片描述

Base Layer 播放 Idle 动画
Run Layer 也播放 Idle 动画

通过窗口控制参数 Attack = true
Base Layer 动画从 Idle 切换为 Attack
在这里插入图片描述

控制参数 Run = true
Run Layer 动画从 Idle 切换为 Run
在这里插入图片描述

此时 BaseLayer 播放 Attack,RunLayer 播放Run,但是只能看到播放攻击的动画。
打开 RunLayer 设置 Weight = 0 权重太小,将RunLayer 中Weight 设置为 1
在这里插入图片描述

则只能看到 RunLayer 中播放的Run动画。

我希望看到的是上半身播放攻击动画,两条腿走路的动画,给RunLayer添加 Avatar Mask,遮挡RunLayer 中角色的上半身动画。

创建 Avatar Mask 命名为 RunMask,选中 RunMask 查看 Inspector 面板
在这里插入图片描述

一、当模型设置为Humanoid (人形态)时,使用上面的 Humanoid 遮罩,该方法将模型分为(头,上身,左右胳膊,左右手,左右腿)
在这里插入图片描述

将不需要播放动画的部位勾选为红色
在这里插入图片描述

则播放动画时只能看到绿色部位的动画。

二、当模型设置为 Generic 时,则Avatar Mask 需要使用 Transform 方式实现身体部位的遮挡。
展开Transform 设置 Avatar -> Import skeleton
在这里插入图片描述

在这里插入图片描述

模型骨骼模型Transform 加载完成如上。
我模型设置的 Rig 中 Animation Type 为 Generic,所以我需要使用设置Transform的方法,我只需要查看 两条腿的动画,所以我将两条腿之外的Transform都勾选掉
在这里插入图片描述

打开RunLayer 设置 Mask,设置 齿轮位置出现一个 M 标记(表示已经使用遮罩)
在这里插入图片描述

重新运行Unity,设置 Attack = true, Run = true, 设置 RunLayer 的 Weight = 1,展示出来的就是动画为 上半身播放攻击,下半身两条腿走的动画。

可以创建脚本来控制参数以及Layer 的 Weight
代码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AnimatorLayerMask : MonoBehaviour {

    private Animator animator;
	// Use this for initialization
	void Start () {
        animator = GetComponent<Animator>();
	}
	
	// Update is called once per frame
	void Update () {
		
        if (Input.GetKeyDown(KeyCode.W))
        {
            animator.SetBool("Attack", true);
        }

        if (Input.GetKeyDown(KeyCode.S))
        {
            animator.SetBool("Run", true);
        }

        if (Input.GetKeyDown(KeyCode.O))
        {
            animator.SetLayerWeight(1, 1);
        }

        if (Input.GetKeyDown(KeyCode.P))
        {
            animator.SetLayerWeight(1, 0);
        }
	}
}

### Unity Animator 中设置不同 Layer 的 Clip 播放 在 UnityAnimator 组件中,可以通过配置多个 Animation Layers 来实现不同的动画片段 (Clips) 在同一时间播放。每个 Layer 可以独立控制其权重 (Weight),从而影响最终的动画混合效果。 #### 层级结构与权重调整 Animator Controller 支持多层动画管理,每层可以绑定一个特定的动画剪辑 (Animation Clip)[^1]。通过设置每一层的 **Layer Weight** 参数,能够决定当前层对整体动画的影响程度。例如,在角色同时执行跑动和挥手的动作时,可分别定义两组动作对应的层级并分配合适的权重比例来达到自然过渡的效果[^2]。 #### 动画遮罩 Mask 使用 为了更精确地控制各部分身体部位的行为表现,比如仅让手臂参与某一段特殊的挥舞动作而保持腿部继续原有步伐节奏不变,则需要用到 Avatar Masks 技术[^1]。创建自定义蒙版后将其应用到指定的目标图层上,这样就能限定该层所驱动骨骼节点范围内的变化情况而不干扰其他区域的表现形式。 #### 实现步骤说明(不作为正式描述) 以下是基于上述理论的一个简单示例代码展示如何程序化修改这些参数: ```csharp using UnityEngine; public class Example : MonoBehaviour { private Animator animator; void Start() { animator = GetComponent<Animator>(); // 设定第二层(索引从0开始计数)的激活状态以及初始权重值 int secondLayerIndex = 1; animator.SetLayerWeight(secondLayerIndex , 0.7f); // 更改具体的状态触发器或者浮点数值用于切换不同预设好的动画序列 animator.SetFloat("Speed", 1.0f); animator.SetBool("IsWaving", true); } } ``` 以上脚本展示了怎样利用 C# 脚本来操作 Animator Component 上的相关属性,包括但不限于设定分层权重、更新速度因子等等。 另外值得注意的是关于周期偏移量(Cycle Offset)这一概念它允许我们微调某个循环性质较强的连续型动画起始帧位置以便于更好地衔接前后场景转换瞬间可能存在的突兀感问题[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值