Mecanim动画系统

Unity3D动画系统
分为旧版动画系统和新版动画(Mecanim)系统即Animation 与 Animator

Animation动画录制

Animation是U3D旧版的动画状态机,我们一般将模型中的动画放入其中,通过代码开执行动画。


Mecanim动画系统_第1张图片
动画录制
// 拿到Animation组件
Animation Ani = GetComponent();
// 执行已经放入其中的动画片段
Ani.CrossFade("Walk"); // 默认就是正播
Ani["Walk"].speed = 1f;

Ani["Walk"].speed = -1f; // 如果是-1 那就是倒着播放
Ani.CrossFade("Walk");

Animator动画状态机

创建动画状态机


Mecanim动画系统_第2张图片
Paste_Image.png

然后打开我们的动画状态机,然后吧我们的录制的动画扔入动画状态机中


Mecanim动画系统_第3张图片
Paste_Image.png
这样一个小的动画状态就完成了,然后我们再给我们的人物添加动画Animator
Mecanim动画系统_第4张图片
Paste_Image.png

每一个动画人物都会有自己的骨骼,我们可以随便打开一个人物的骨骼观察


Mecanim动画系统_第5张图片
Paste_Image.png
最后我们运行下可以看到效果
Mecanim动画系统_第6张图片
11.gif

****动画人物属性****
我看可以看下每个动画人物的属性
Mecanim动画系统_第7张图片
Paste_Image.png

Mecanim动画系统_第8张图片
642887-a59f2b68d46aad27.png

Mecanim动画系统_第9张图片
Paste_Image.png

Mecanim动画系统_第10张图片
Paste_Image.png

****骨骼属性****


Mecanim动画系统_第11张图片
Paste_Image.png

Animator-事件系统

注意:在拥有动画状态机的那一级添加脚本才能实现,不然会报错(就是在角色身上添加脚本,实现事件才不会出错)

Mecanim动画系统_第12张图片
Paste_Image.png

我们添加脚本监听书写的事件方法
我们在悟空人物上挂载脚本enumtextddd.

public class enumtextdddd : MonoBehaviour {
 public void NewEvent()
{
        Debug.Log("dddd");
}
}

运行后我们可以在动画播放在一个地方时调用我们的方法这样我们就可以实现我们人物播放释放技能特效的效果了

Animator-拆分动画

Mecanim动画系统_第13张图片
Paste_Image.png

动画片段其他属性:

Mecanim动画系统_第14张图片
Paste_Image.png

Mecanim动画系统_第15张图片
Paste_Image.png

我们首先来看这个“Bake into Pose".在untiy中将动画中的变换分成两种,Body Transform和Root Transform,我们可以设置动画中的关于模型的一些变换(平移、旋转等)是属于Body Transform(pose)还是Root Transform(trajectory)的一部分。这里的Bake into Pose 也就是将变换设置为Body Transform(pose)的一部分。我们可以这样去理解,如果是设置成Body Transform(pose)的话,就相当这些变换是属于动画本身的一部分,也就是说,不管设不设置Apply Root Motion,在场景中,我们都会看到模型位置或角度的变化。(因为Body Transform不影响模型实际的位置和角度,所以这里只是纯粹的动画效果,模型的位置和角度参数值不变),如果设置成Root Transform,Root Transform将影响模型的实际位置和角度(前提是要设置“Apply Root Motion”,如果不设置Apply Root Motion的话,也就是说变换将不应用,场景中的模型位置或角度是不会有变化的(参数值自然也不变),就像一个行走动画,可能一直在原地行走)。
然后我们来重点再看看这里的”Apply Root Motion".这里他会起到两个作用,首先最重要的是,决定是否应用Root Transform,如果应用的话,那么在动画的同时,模型的位置和角度会同时跟着变化。如果这里不勾选的话,那么就是说不应用Root Transform,这样我们所有的Root Transform都将不起任何作用。(也就相当于于所有没有Bake into Pose 的变换都没有用了)。
Apply Root Motion的第二个作用是在动画结束后,将Body Transform中的变化应用到模型(注意,这里是结束的时候才应用,也就是说动画的时候,模型的position、rorate等参数是不变的,当动画结束之后,开始新的动画之前才会改变,注意这里跟前面提到的Root Transform的区别)

1、勾选”Bake into Pose",不勾选“Apply Root Motion",勾选”Bake into Pose"后,变换属于Body Transform,所以即使这里未勾选”Apply Root Motion“,但是动画依然会在场景中体现,人物会按照动画的路径行走(但是如果我们观察Inspector中模型的position参数,值一直不变)。但是因为没有勾选Apply Root Motion,所以动画结束后,变换不会应用到模型,所以如果这时候,如果开始一个新的动画的话,模型会瞬间回到起始位置(新的动画开始时候,模型处于行走动画开始时的位置)。

2、勾选”Bake into Pose",并勾选“Apply Root Motion",这里跟上面的情况唯一不同的就是,动画结束后,开始新的动画之前,变换会应用到模型。(模型的position在新的动画开始之前会发生变化,新的动画开始时候,模型处于动画结束时的位置)

3、不勾选”Bake into Pose",勾选“Apply Root Motion",这时候,变换是作为Root Transform,所以因为这里勾选了Apply Root Motion,变换会应用到模型(模型的position跟着动画不停的变化),自然,新的动画开始时候,模型处于动画结束时的位置。

4、不勾选”Bake into Pose",并且不勾选“Apply Root Motion",这里变化还是作为Root Transform,但是因为没有勾选Apply Root Motion,所以变换将不被应用,所以模型将一直在本地不动,自然,新的动画开始时候,模型处于行走动画开始时的位置

动画状态机动画层

Mecanim动画系统_第16张图片
Paste_Image.png

Mecanim动画系统_第17张图片
Paste_Image.png

注意:如果不设置权重,你会发现即便分好层,而且在状态机中发现动画执行了,但是界面的角色并没有显示出来。

前面的分享已经提到过使用代码控制动画的参数,这里如何通过代码设置权重呢?

    [SerializeField]
    private Animator ani;
    void Start () {
        // 表示设置动画第二层的权重为1
        ani.SetLayerWeight(1, 1);
    }

如何设置固定骨骼
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/3912830-743ff24253430551.png?
imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

你可能感兴趣的:(Mecanim动画系统)