Unity Animator Layer + Avatar Mask

Unity Animator Layer + Avatar Mask

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

双击打开
点击 + 添加 Layer : RunLayer
Unity Animator Layer + Avatar Mask_第1张图片

Unity Animator Layer + Avatar Mask_第2张图片

编辑 Base Layer,添加 Idle 和 Attack 两个动画,将 Idle 设置为默认动画
设置 Idle -> Attack 的条件参数为 Attack = true
Unity Animator Layer + Avatar Mask_第3张图片

编辑 RunLayer,添加 Idle 和 Run 两个动画,将 Idle 设置为默认动画
设置 Idle -> Run 的条件参数为 Run = true
Unity Animator Layer + Avatar Mask_第4张图片

打开 BaseLayer 设置,Weight 默认值为 1
Unity Animator Layer + Avatar Mask_第5张图片

打开 RunLayer 设置,Weight 默认值为 0
Unity Animator Layer + Avatar Mask_第6张图片

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

运行Unity
Unity Animator Layer + Avatar Mask_第7张图片

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

通过窗口控制参数 Attack = true
Base Layer 动画从 Idle 切换为 Attack
Unity Animator Layer + Avatar Mask_第8张图片

控制参数 Run = true
Run Layer 动画从 Idle 切换为 Run
Unity Animator Layer + Avatar Mask_第9张图片

此时 BaseLayer 播放 Attack,RunLayer 播放Run,但是只能看到播放攻击的动画。
打开 RunLayer 设置 Weight = 0 权重太小,将RunLayer 中Weight 设置为 1
Unity Animator Layer + Avatar Mask_第10张图片

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

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

创建 Avatar Mask 命名为 RunMask,选中 RunMask 查看 Inspector 面板
Unity Animator Layer + Avatar Mask_第11张图片

一、当模型设置为Humanoid (人形态)时,使用上面的 Humanoid 遮罩,该方法将模型分为(头,上身,左右胳膊,左右手,左右腿)
Unity Animator Layer + Avatar Mask_第12张图片

将不需要播放动画的部位勾选为红色
Unity Animator Layer + Avatar Mask_第13张图片

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

二、当模型设置为 Generic 时,则Avatar Mask 需要使用 Transform 方式实现身体部位的遮挡。
展开Transform 设置 Avatar -> Import skeleton
Unity Animator Layer + Avatar Mask_第14张图片

Unity Animator Layer + Avatar Mask_第15张图片

模型骨骼模型Transform 加载完成如上。
我模型设置的 Rig 中 Animation Type 为 Generic,所以我需要使用设置Transform的方法,我只需要查看 两条腿的动画,所以我将两条腿之外的Transform都勾选掉
Unity Animator Layer + Avatar Mask_第16张图片

打开RunLayer 设置 Mask,设置 齿轮位置出现一个 M 标记(表示已经使用遮罩)
Unity Animator Layer + Avatar Mask_第17张图片

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