往往一个角色可能有多个动作,例如走路,射击,但是想要在游戏中体现出边走路边射击的动画,这时就可以使用Layer。
创建命名为Layer的Animator Controller,并将其赋给角色的Animator组件的Controller属性,双击Layer,进入到Animator视图。
在Base Layer中新建一个Walk动画状态,并给它赋一个命名为HumanoidWalk的Animation Clip(动画片段)。
如果想让其他的动画叠加到当前角色上,需要在Layers标签栏(默认有一个Base Layer)下新建一个新的Layer并命名为ArmUp。
在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)来实现。
在Project视图下右键->Create -> Avatar Mask来创建遮罩,并对人体下半部位添加遮罩。
然后将名为UpBody的遮罩添加到名为ArmUp的Layer的Mask属性中。
这时,我们在运行发现,角色的上半身和下半身在做不同的动画,也不会在因为权重而影响其他的动画了。
Sync勾选后表示不使用自己的动画控制系统,而使用其他层的已有的,只是将动画状态替换为新的。
通过鼠标左键来控制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);
}
}
}
学习自链接