1. 简介

Mecanim把游戏中的角色设计提高到了一个新的层次,使用Mecanim可以通过Retargeting(重定向)来提高角色动画的重用性。在处理人类角色动画时,用户可以使用动画状态机来处理动画之间的过渡及动画之间的逻辑。

Mecanim支持运动重定向(Retargeting)功能:即把动画从一个角色模型应用到另一个角色模型上的功能。

2. Animator关键元素

2.1 Animator组件

有Animator动画的Gameobject必须有Animator组件,Animation组件如下图所示:

Animator组件负责把动画分配给GameObject。Animator包含以下两个关键元素:
    1) Animator Controller
    2) Avatar (仅当GameObject是人形角色时,才定义Avatar)

下图示意:一个游戏对象的Animator组件如何把Animation Clips、Animator Controller和Avatar资源组合在一起。

2.2 Avatar

创建动画的一个基本步骤就是建立一个从Mecanim系统的简化人形骨架结构用户实际提供的骨架结构的映射,这种映射关系称为Avatar。

2.2.1 创建Avatar

创建Avatar是使用Mecanim的关键步骤。Avatar的创建过程,就是分析导入的角色资源的骨骼结构,其内部过程就是与Mecanim中已有的、简化的、标准的人类骨骼进行对比,最后将其转换或标识为Mecanim可以识别的骨骼结构。

      通过Avatar的创建,可以实现角色之间的Retargeting。

1)导入角色模型文件(如FBX)之后,在Project窗口中选中导入的角色,然后在其Inspector窗口中指定模型的的Rig为Humanoid,然后点【Apply】按钮

         
   2)点【Apply】之后,Mecanim尝试把角色已经存在骨骼结构匹配到Avatar的骨骼结构(在大部分情况下,Mecanim能自动完成),如果匹配成功,在【Configure】旁边有一个“V”的符号,如下图所示:

3)在成功匹配之后,Avatar子资产被增加到模型资产的下面,其在Project窗口中如下图所示:

4)选中Avatar子资产(如上图中的EthanAvatar),Inspector窗口如下图所示,点【Configure Avatar】之后,可配置Mapping和Muscles。

2.2.2 配置Avatar

Avatar是Mecanim系统中极为重要的模块,因此为模型资源正确地设置Avatar也就变得至关重要。不管Avatar的自动创建是否成功,用户都需要进入到Configure Avatar界面中去确认Avatar的有效性,即确认用户提供的骨骼结构与Mecanim预定义的骨骼结构已经正确匹配起来,并且模型已经处于T形姿态。

1) 实线圆圈:骨骼是必须匹配的

2) 虚线圆圈:骨骼是可选匹配的
      可选匹配骨骼的运动会根据必须匹配骨骼的状态来自动插值计算。为了方便Mecanim进行骨骼匹配,用户提供的骨架中应包含所有必须匹配的骨骼。为了提高匹配的几率,应尽量通过骨骼代表的部位给骨骼命名(如:左手命名为LeftArm)。

3) Avatar自动创建成功,其界面如下:

4) Avatar自动创建失败,其 界面如下:

5) Avatar Configure Inspector (骨骼映射)

6) 如果auto-mapping(Mapping->Automap)部分或完全失败,可以在Scene中拖动骨骼以进行分配。如果Mecanim认为骨骼合理,则在Avatar Inspector中以绿色显示,否则以红色显示。


    7) 如果骨骼绑定正确,但是角色姿势不对(不是标准的T形),在Scene中可看到消息“Character not in T-Pose”,解决此问题可通过Pose->Enforce T-Pose或旋转其它的骨骼。

2.2.3 肌肉设定

1) Mecanim允许使用“肌肉”来控制不同骨骼的运动范围。
       2) 当Avatar被创建且被成功配置之后,Mecanim可理解骨骼结构,且允许在Avatar Inspector的【Muscles】选项卡中调节相关参数。在此可以调整角色的运动范围,以确保骨骼运动起来真实、自然。

详细使用方法参见:http://www.unitymanual.com/thread-1211-1-1.html

3) 通过设置各个关节的旋转范围来控制不现骨骼的运动范围。

2.3 Animator Controller

负责定义使用哪些动画素材,以及何时、如何播放(融合<blend>和过渡<transition>)这些动画素材。

Animator Controller以状态机(State Machine)的方式维护一系列动画,且当隶属的角色发生特定事件时,切换播放的动画。

2.3.1 创建Animator Controller

在Project窗口中,创建Animator Controller,然后双击刚创建的Animator Controller可在Animator窗口中进行编辑。创建Animator Controller如下图所示:

2.3.2 编辑Animator Controller

2.3.2.1 创建状态节点

把Animation Clip从Project窗口中拖到Animator窗口,则自动创建了一个对应的状态节点,第一个拖入的Animation Clip为默认状态节点,如下图所示:

2.3.2.2 设置状态变换

状态变换:即从一个状态变换到另一个状态,如从IdleShort状态变换到Jump状态。

2.3.2.2.1 角色自动运动

简单且不用编程的状态变换,程序不能控制

从一个状态变换到另一个状态的带箭头的线表示:这些箭头线用于设置变换条件,如:在什么条件下才从IdleShort状态变换到Jump状态。

设置状态变换时,先选中箭头线,然后在Inspector中设置变换条件,如下图根据播放的百分比来设置变换条件。

当IdleShort状态播放到90%时,则切换到Run状态。

设置完之后,关闭Animator窗口中。至此,一个简单的且不用编程的Animator Controller已经设置完成。

2.3.2.2.2 程序控制角色运动

       1. 创建混合树

1) 若一个状态节点支持多种运动(如:Run支持RunDirect、RunLeft、RunRight),选中此节点点右键,然后点【Create new BlendTree in State】,则此状态节点的Motion为:Blend Tree

2) 创建BlendTree之后,双击此状态节点,则进入混合树的编辑。 

 3) 选中混合树,在其Inspector面板中,点按钮【+】然后点【Add Motion Field】增加3个Motion,然后并设置对应的Motion,其结果如下:

2. 创建控制参数并设置变换条件

1) 创建控制参数

2) 设置箭头线变换条件

首先选中箭头线,然后设置此箭头的变换条件。

3) 设置混合树变换条件

Direction:

-1: 播放动画RunLeft

0: 揪放动画Run

1:播放动画RunRight

Blend Type: 1D(表示一个参数控制混合树的动画播放)

2.3.2.3 动画合成

比如角色一边跑,一边挥剑,则需要把两个动画进行合成。要实现两个动画的合成,需要单独创建一个动画层。

Weight:动画层的权重值

Mask: 本层的动作影响身体的哪一部分(遮罩)

1) 创建Avatar Mask:在Project窗口中创建一个Avatar Mask

2) 点击不受影响的部位,使之变红,如下图只有右手的运动才参与计算,即只有右手的动作才发生作用,从而达到屏蔽身体其它部位的目的,从而提高了效率(IK:表示把风向动力学)

3) 把Avatar Mask应用于特定的动画层

4) 在脚本中设置状态变换条件,然后再把此脚本绑在角色身上。

总结:一个Animator Controller中可包含多个动画层,每个动画层按照其设定的状态机单独进行运行,然后根据其Weight把各动画层进行合成,后面的动画层(除Base Layer)只显示其Avatar Mask绿色的部分。

2.3.3 应用Animator Controller

1) 在Hieratchy窗口中选择需要Animator动画的角色

2) 把Project中的Animator Controller资源拖到角色对象的Animator组件的Controller输入框,或点旁边的按钮进行选择

3. Animator重定向功能

重定向功能:就是把应用在一个角色上的动作应用到另一个角色身上。

即同一个Animator Controller可用于不同的Animators。

4. Animator详细参数

Animator详细参数参见:http://docs.unity3d.com/ScriptReference/Animator.html

http://edu.china.unity3d.com/learning_document/getData?file=/Manual/MecanimAnimationSystem.html

5. 设置动画状态过渡代码

设置动画状态过渡代码例子(IdleRunJump.cs)如下:

using UnityEngine;
using System.Collections;public class IdleRunJump : MonoBehaviour {protected Animator animator;public float DirectionDampTime = .25f;public bool ApplyGravity = true; // Use this for initializationvoid Start () {animator = GetComponent<Animator>();if(animator.layerCount >= 2)animator.SetLayerWeight(1, 1);}// Update is called once per framevoid Update () {if (animator){AnimatorStateInfo stateInfo = animator.GetCurrentAnimatorStateInfo(0);          if (stateInfo.IsName("Base Layer.Run")){if (Input.GetButton("Fire1")) animator.SetBool("Jump", true);                }else{animator.SetBool("Jump", false);                }if(Input.GetButtonDown("Fire2")&&animator.layerCount >= 2 ){animator.SetBool("Hi", !animator.GetBool("Hi"));}float h = Input.GetAxis("Horizontal");float v = Input.GetAxis("Vertical");animator.SetFloat("Speed", h*h+v*v);animator.SetFloat("Direction", h, DirectionDampTime, Time.deltaTime);   }             }
}

6. 为Mecanim系统创建角色

为Mecanim系统创建角色主要包括以下三个阶段:

1) 建模

角色模型有合理的拓扑结构;模型导出设置;模型导入Unity3D;使角色处于T-Pose;去掉不需要的面、顶点及隐藏的面、顶点;

2) 骨骼设置

3) 蒙皮

把多边形的网格顶点绑定到骨骼上的过程。

7. 肌肉设置与身体遮罩的区别

1) 肌肉设置:是对Avatar进行设置,所以它修改了Avatar的输入设置,对所有动画有效。

2) 身体遮罩:是对动画进行设置(每个Animation Clip有一个Body Mask),只修改本动画的属性,即只对本动画有效。

Mecanim Animator使用详解相关推荐

  1. Unity中的Animator动画详解

    Unity中的Animator动画详解 Animator动画导入 Animator动画详解 动画类型选择 Rig面板属性 Mode面板属性 Animation面板属性 动画片段 控制使用 Animat ...

  2. Android Animator(动画)类 详解

    Android Animator动画类 详解 动画分为3种 ValueAnimator类 ObjectAnimator类 AnimatorSet类 Animator的addListener()方法(监 ...

  3. Unity动画系统详解6:如何做好角色的移动动画?(Root Motion详解)

    摘要:Root Transform是body transform在Y平面上的投影,并且是运行时计算的.每一帧Root Transform的变化实时计算.然后Transform的变化会被应用到GameO ...

  4. T4M插件放入unity后怎么找不到_Unity动画系统详解6:如何做好角色的移动动画?(Root Motion详解)

    摘要:Root Transform是body transform在Y平面上的投影,并且是运行时计算的.每一帧Root Transform的变化实时计算.然后Transform的变化会被应用到GameO ...

  5. Android中项目中各个文件夹的含义和用途详解

    1.src:存放所有的*.java源程序. 2.gen:为ADT插件自动生成的代码文件保存路径,里面的R.java将保存所有的资源ID. 3.assets:可以存放项目一些较大的资源文件,例如:图片. ...

  6. android仿知乎按钮动效,Android仿知乎客户端关注和取消关注的按钮点击特效实现思路详解...

    先说明一下,项目代码已上传至github,不想看长篇大论的也可以先去下代码,对照代码,哪里不懂点哪里. 代码在这https://github.com/zgzczzw/ZHFollowButton 前几 ...

  7. 《Android群英传》读书笔记 (5) 第十一章 搭建云端服务器 + 第十二章 Android 5.X新特性详解 + 第十三章 Android实例提高...

    第十一章 搭建云端服务器 该章主要介绍了移动后端服务的概念以及Bmob的使用,比较简单,所以略过不总结. 第十三章 Android实例提高 该章主要介绍了拼图游戏和2048的小项目实例,主要是代码,所 ...

  8. android动画详解

    转自:工匠若水 http://blog.csdn.net/yanbober 1 背景 不能只分析源码呀,分析的同时也要整理归纳基础知识,刚好有人微博私信让全面说说Android的动画,所以今天来一发A ...

  9. android的md动画,Android-notes/动画体系详解.md at master · drs0214/Android-notes · GitHub

    Android 动画详解:属性动画.View 动画和帧动画 在 Android 中,基本的动画共有三种类型: View 动画:也叫视图动画或者补间动画,主要是指 android.view.animat ...

最新文章

  1. Webclient UI view里Javascript的注释问题
  2. 211计算机实力末尾的学校,实力最弱的十所985大学是哪几所?选择末尾985好还是选211好?...
  3. unity3d 2D版本见缝插针demo
  4. 项目分层思路——管家婆
  5. 中国公司又称雄国际AI大赛,IARPA人脸识别挑战赛依图夺冠
  6. Spring中使用id和name的区别。
  7. linux下获取程序所在目录绝对路径
  8. 软件测试设计测试用例案例
  9. javaweb网上鞋店
  10. dedecms如何制作中英文切换的网站?
  11. EnableViewState=true
  12. 邮件无法发送信息已被服务器拒绝,邮件被服务器拒绝发不出去的原因
  13. android陀螺仪方向,获得陀螺仪传感器Android的输出
  14. 因为改 UOM conversion 导致库存数量和財务上的数据错误
  15. 强化网络互连设备安全配置脚本
  16. Python爬虫种类、法律、轮子,轮子们,你们辛苦了
  17. 华清远见嵌入式班结业总结
  18. common.io中Tailer类读取文件内容乱码问题解决
  19. VS 调试时“还没有为该文档加载任何符号”
  20. XXL-JOB配置笔记

热门文章

  1. 关于MFC程序中隐藏任务栏图标的问题
  2. DSP模型中FM FFM模型
  3. 这个在线文本编辑器的源代码
  4. 云计算ACP实验实操心得
  5. 超简单的方法完整保留原有所有样式拆分Excel表
  6. 用微积分证明泰勒公式
  7. 如何把IDEA中设置像eclipse默认铺开包层次结构
  8. sip协议呼叫流程详解
  9. Estimator::relativePose
  10. 变频器在恒压供水控制系统中的应用