Unity Animator Layer + Avatar Mask

创建Animator Controller 命名 LayerController

unity avprovedio使用 unity animator avatar_Mask

双击打开

点击 + 添加 Layer : RunLayer

unity avprovedio使用 unity animator avatar_Mask_02

unity avprovedio使用 unity animator avatar_Mask_03

编辑 Base Layer,添加 Idle 和 Attack 两个动画,将 Idle 设置为默认动画

设置 Idle -> Attack 的条件参数为 Attack = true

unity avprovedio使用 unity animator avatar_Mask_04

编辑 RunLayer,添加 Idle 和 Run 两个动画,将 Idle 设置为默认动画

设置 Idle -> Run 的条件参数为 Run = true

unity avprovedio使用 unity animator avatar_Mask_05

打开 BaseLayer 设置,Weight 默认值为 1

unity avprovedio使用 unity animator avatar_unity avprovedio使用_06

打开 RunLayer 设置,Weight 默认值为 0

unity avprovedio使用 unity animator avatar_unity avprovedio使用_07

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

运行Unity

unity avprovedio使用 unity animator avatar_unity avprovedio使用_08

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

通过窗口控制参数 Attack = true

Base Layer 动画从 Idle 切换为 Attack

unity avprovedio使用 unity animator avatar_unity avprovedio使用_09

控制参数 Run = true

Run Layer 动画从 Idle 切换为 Run

unity avprovedio使用 unity animator avatar_Mask_10

此时 BaseLayer 播放 Attack,RunLayer 播放Run,但是只能看到播放攻击的动画。

打开 RunLayer 设置 Weight = 0 权重太小,将RunLayer 中Weight 设置为 1

unity avprovedio使用 unity animator avatar_unity avprovedio使用_11

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

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

创建 Avatar Mask 命名为 RunMask,选中 RunMask 查看 Inspector 面板

unity avprovedio使用 unity animator avatar_unity avprovedio使用_12

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

unity avprovedio使用 unity animator avatar_unity avprovedio使用_13

将不需要播放动画的部位勾选为红色

unity avprovedio使用 unity animator avatar_Mask_14

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

二、当模型设置为 Generic 时,则Avatar Mask 需要使用 Transform 方式实现身体部位的遮挡。

展开Transform 设置 Avatar -> Import skeleton

unity avprovedio使用 unity animator avatar_Mask_15

unity avprovedio使用 unity animator avatar_Mask_16

模型骨骼模型Transform 加载完成如上。

我模型设置的 Rig 中 Animation Type 为 Generic,所以我需要使用设置Transform的方法,我只需要查看 两条腿的动画,所以我将两条腿之外的Transform都勾选掉

unity avprovedio使用 unity animator avatar_unity avprovedio使用_17

打开RunLayer 设置 Mask,设置 齿轮位置出现一个 M 标记(表示已经使用遮罩)

unity avprovedio使用 unity animator avatar_Mask_18

重新运行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);
        }
	}
}