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

Layer应用场景

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

创建游戏物体

Unity之动画系统的学习(三):Layer_第1张图片

创建Animator Controller

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

新建一个Walk动画状态

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

新建一个Layer

如果想让其他的动画叠加到当前角色上,需要在Layers标签栏(默认有一个Base Layer)下新建一个新的Layer并命名为ArmUp。
Unity之动画系统的学习(三):Layer_第2张图片

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

在ArmUp层新建一个动画状态,并赋上名为HumanoidJumpUp的动画片段。
Unity之动画系统的学习(三):Layer_第3张图片

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

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

权重,如下图所示。
Unity之动画系统的学习(三):Layer_第4张图片

调节权重

我们可以点击想调节权重的Layer上的设置,通过调节Weight的值进行权重的调节。
Unity之动画系统的学习(三):Layer_第5张图片

通过上图,我们发现在将ArmUp的权重调节到1时,发现只会播放ArmUp的动画了,这是因为Layer之间的融合方式采用的是覆盖模式(Override)。通过调节权重可以调节覆盖程度,0不覆盖,1位全覆盖。
Unity之动画系统的学习(三):Layer_第6张图片

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

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

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

Unity之动画系统的学习(三):Layer_第7张图片

然后将名为UpBody的遮罩添加到名为ArmUp的Layer的Mask属性中。
Unity之动画系统的学习(三):Layer_第8张图片

这时,我们在运行发现,角色的上半身和下半身在做不同的动画,也不会在因为权重而影响其他的动画了。
Unity之动画系统的学习(三):Layer_第9张图片

Unity之动画系统的学习(三):Layer_第10张图片
Sync勾选后表示不使用自己的动画控制系统,而使用其他层的已有的,只是将动画状态替换为新的。
Unity之动画系统的学习(三):Layer_第11张图片

通过代码控制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);
        }
    }
}

学习自链接

你可能感兴趣的:(Unity3D,游戏,unity,动画系统)