Unity 动画系统

来源:互联网 发布:ubuntu 17.04更新源 编辑:程序博客网 时间:2024/04/30 15:34

Unity拥有丰富而复杂的动画系统(有时被称为“ Mecanim ”)。它提供:
- 简单的工作流程和Unity的所有元素的动画设置,包括对象,字符和属性。
- 支持在Unity中创建的导入动画片段和动画。
- 人形动画重定向 -将动画从一个角色模型应用到另一角色模型的能力。
- 简化了对齐动画片段的工作流程。
- 方便地预览动画剪辑,转换和它们之间的交互。这使得动画师能够更独立于程序员的工作,原型和预览他们的动画之前的游戏代码被吸引。
- 管理动画与可视化编程工具之间的复杂交互。
- 用不同的逻辑动画不同的身体部位。
- 分层和掩蔽功能。

动画工作流程

Unity的动画系统基于动画片段的概念,动画片段包含有关特定对象随着时间的推移如何改变其位置,旋转或其他属性的信息。每个剪辑可以被认为是一个单一的线性记录。来自外部源的动画剪辑是由艺术家或动画师使用第三方工具(如Max或Maya)创建的,或者来自动作捕捉工作室或其他来源。

动画剪辑然后被组织成一个称为动画控制器的结构化流程图的系统。动画师控制器充当一个“ 状态机器 ”,它跟踪当前正在播放的剪辑,以及何时动画应该改变或混合在一起。
这里写图片描述

  1. 动画剪辑是从外部源导入的,或者是在Unity中创建的。在这个例子中,他们是导入动作捕捉的人形动画。
  2. 动画剪辑放置在一个动画控制器中。这显示了Animator窗口中Animator控制器的视图。状态(可能表示动画或嵌套的子状态机)显示为由线连接的节点。该动画制作控制器作为资源存在于“项目”窗口中。
  3. 操纵人物模型(在这种情况下,宇航员“Astrella”)具有映射到Unity的通用阿凡达格式的骨骼的特定配置。此映射作为导入的字符模型的一部分存储为“头像”资源,并且也会显示在“项目”窗口中,如图所示。
  4. 动画人物模型时,它附有一个动画组件。在上面显示的Inspector视图中,您可以看到Animator组件同时拥有Animator控制器和分配的头像。动画师一起使用这些来动画模型。只有在动画人形角色时才需要头像参考。对于其他类型的动画,只需要一个动画控制器。

1.Animation

这里写图片描述
找到我们导入的动画资源,选择Edit,则可以对动画进行剪切,比方说一个跳跃动作,包含起跳、落地两个动作,我们就可以将一个跳跃动画,剪切为两个动作供我们使用。编辑上图中Start、End时间,即可剪辑;点击上图中+-则增加或减少动作。
这里写图片描述

Animation Type
一定要注意Animation Type的设置,否则很容易出现错误的效果。

  • Legacy
    是我目前使用最多的动画系统,在我看来他已经满足一个项目的绝大部分需求,而且因为最基础所以也最易扩展,需要一些额外功能时也方便修改追加。
  • Generic
    与legacy相比,generic可以使用新系统自带的状态机,并且自带可编辑的动画融合系统,然而在我看来这都没什么用。如果generic不与humanoid配合使用,其功能与legacy并无二致,反而因为系统并不成熟更容易出现未知错误。当然,也可能是有其他功能我并未得知,如有遗漏还望指正。

  • Humanoid
    字面上理解即为人型骨骼系统,其最显著的特点是可以将max的骨骼转化为unity的骨骼,并且会生成一份avatar,将avatar指定给不同的角色模型。即可无视高矮胖瘦的体型差异将同一个动画分配给每个角色,简单来说就是可以实现动画的通用。

2.Animator

这里写图片描述
添加Animator,来使用动画的状态机,我们只需考虑状态切换的条件,便于快速制作我们想要的效果。

脚本通过修改状态机中定义的变量,来控制动画

Animation.SetBool("状态机中定义的变量", true);

Animator参数设置:

Apply Root Motion应特别注意

首先最重要的是,决定是否应用Root Transform,如果应用的话,那么在动画的同时,模型的位置和角度会同时跟着变化。如果这里不勾选的话,那么就是说不应用Root Transform,这样我们所有的Root Transform都将不起任何作用。(也就相当于于所有没有Bake into Pose 的变换都没有用了)。

Apply Root Motion的第二个作用是在动画结束后,将Body Transform中的变化应用到模型(注意,这里是结束的时候才应用,也就是说动画的时候,模型的position、rorate等参数是不变的,当动画结束之后,开始新的动画之前才会改变,注意这里跟前面提到的Root Transform的区别)
上面就是关于Root Motion的理论,然后我们来个几个实际的场景。

比如说我们有一个人物行走的动画,我们来考虑一下几种情况(这里以“Root transform position(XZ)为例)

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,所以变换将不被应用,所以模型将一直在本地不动,自然,新的动画开始时候,模型处于行走动画开始时的位置

参考博客:
http://blog.csdn.net/cubesky/article/details/39478207
https://docs.unity3d.com/Manual/AnimationOverview.html

原创粉丝点击