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);
}
}
}