Unity之动画系统的学习(三):Layer

Layer应用场景

往往一个角色可能有多个动作,例如走路,射击,但是想要在游戏中体现出边走路边射击的动画,这时就可以使用Layer。

创建游戏物体

在这里插入图片描述

创建Animator Controller

创建命名为Layer的Animator Controller,并将其赋给角色的Animator组件的Controller属性,双击Layer,进入到Animator视图。
在这里插入图片描述

新建一个Walk动画状态

在Base Layer中新建一个Walk动画状态,并给它赋一个命名为HumanoidWalk的Animation Clip(动画片段)。

在这里插入图片描述

新建一个Layer

如果想让其他的动画叠加到当前角色上,需要在Layers标签栏(默认有一个Base Layer)下新建一个新的Layer并命名为ArmUp。
在这里插入图片描述

在新建的Layer中添加一个动画状态

在ArmUp层新建一个动画状态,并赋上名为HumanoidJumpUp的动画片段。
在这里插入图片描述

如此当前角色的Animator Controller就具有了两个Layer(分别为Base Layer和ArmUp)。

当我们运行时,观察发现Game视图中角色只是在行走而没有其他的动画效果。观察Animator视图中Base Layer和ArmUp发现Base Layer的权重占满了,而ArmUp权重为0。而Base Layer和ArmUp的动画状态确都在播放。
在这里插入图片描述

权重,如下图所示。
在这里插入图片描述

调节权重

我们可以点击想调节权重的Layer上的设置,通过调节Weight的值进行权重的调节。
在这里插入图片描述

在这里插入图片描述

通过上图,我们发现在将ArmUp的权重调节到1时,发现只会播放ArmUp的动画了,这是因为Layer之间的融合方式采用的是覆盖模式(Override)。通过调节权重可以调节覆盖程度,0不覆盖,1位全覆盖。
在这里插入图片描述

现在想要在不同的身体部位展现不同的动画。那么可以使用遮罩(Avatar Mask)来实现。

利用Avatar Mask来对身体部位动画进行遮罩

在Project视图下右键->Create -> Avatar Mask来创建遮罩,并对人体下半部位添加遮罩。

在这里插入图片描述

然后将名为UpBody的遮罩添加到名为ArmUp的Layer的Mask属性中。
在这里插入图片描述

这时,我们在运行发现,角色的上半身和下半身在做不同的动画,也不会在因为权重而影响其他的动画了。
在这里插入图片描述

在这里插入图片描述
Sync勾选后表示不使用自己的动画控制系统,而使用其他层的已有的,只是将动画状态替换为新的。
在这里插入图片描述

通过代码控制Layer的权重

通过鼠标左键来控制Layer的权重。

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

public class LayerController : MonoBehaviour {
    
    

    public float speed = 1f;

    private Animator anim;

    
    void Start() {
    
    
        anim = GetComponent<Animator>();
    }

    
    void Update() {
    
    
        if (Input.GetMouseButton(0)) {
    
    
            //GetLayerWeight(1):获取索引为1的Layer的权重
            float w = anim.GetLayerWeight(1) > 1 ? 1 : anim.GetLayerWeight(1) + speed * Time.deltaTime;
            //设置索引为1的Layer的权重
            anim.SetLayerWeight(1, w);
        } else {
    
    
            //GetLayerWeight(1):获取索引为1的Layer的权重
            float w = anim.GetLayerWeight(1) < 0 ? 0 : anim.GetLayerWeight(1) - speed * Time.deltaTime;
            //设置索引为1的Layer的权重
            anim.SetLayerWeight(1, w);
        }
    }
}

在这里插入图片描述

学习自链接

猜你喜欢

转载自blog.csdn.net/weixin_39520967/article/details/107372810