动画状态机Animator

unity的新动画系统叫Mecanim,使用Animator来取代旧系统Animation。

模型的基本知识:

    1.创建动画的一个基本步骤是设置一个可理解的简化后的骨骼到骨架中实际骨骼的映射;在Mecanim的术语中,这个映射称为Avatar,即avatar是骨骼到骨架的映射。

  (图片来自网)

  Avatar主要用于类人骨骼模型,可以实现角色之间的重定向(Retargeting)。非类人模型可以认为骨架就是骨骼。

    

    2.构建模型的基本步骤:

  modelling->rigging->skinning(建模->构建骨架->蒙皮)

  1.modelling 建模:

    1.Observe a sensible topology(遵循合理的拓扑结构),一个合理的标准是动画带动的网格变形是漂亮的;

    2.注意网格的缩放比例。最好做一下各个建模软件模型的导入测试,来设置好正确的缩放比例(不同建模软件导入比例不一样)

    3.安放角色使得角色的脚站在坐标原点或者模型的“锚点”。角色通常是竖直地走在地面上,如果角色的锚点(也就是他的变换中心)在地面上会更容易控制。

    4.如果是类人模型,则尽量使用T字姿态建模(Unity为类人模型提供了许多功能和优化)

    5.整理你的模型,去掉垃圾。只要可能的话,覆盖孔洞,焊接顶点并且移除隐藏的面,这会对蒙皮有帮助,特别是自动蒙皮过程。

  2.Rigging 搭骨架:创建骨架上的关节来控制你的模型进行运动。

    非类人模型的话,可以认为没有骨架,只有骨骼,骨骼直接控制动画,类人模型是骨架控制动画。步骤1中的模型已经有脚,手,头,武器等骨骼,还有受击骨骼等,这些可以用来控制模型或者悬挂额外物件。

  3.Skinning 蒙皮:给骨架附加网格。

    1.把网格中的顶点绑定到骨骼,包括硬绑定(一个顶点指定一个骨骼,不是一一对应,可能多个顶点指定的是一个骨骼)和软绑定(一个顶点指定多个骨骼,每个骨骼有一定权重)
    2.蒙皮的实操步骤:先自动蒙皮,接着用一个测试动画看看蒙皮效果并根据此效果慢慢改啊改。

    3.每个顶点最多绑定4个骨骼,这是U3D的上限

3.动画文件导入unity后,我们对它的处理和设置,这些在Inspector面板:Animation Importing settings

  

  分3个页签:

    Model:这里的参数基本由美术来定,其他的使用默认就好了,这里只提4个参数:

      1.scale factor 模型缩放比例,不同建模软件导入比例不一样,unity的物理单位是1m,这个根据不同建模软件设置

      2.readable/writeable和UITexture一样,如果开了unity就必须拷一份到内存,尽量不开。
      3.Generate Colliders一般用于生成场景的mesh collider,其他地方就不要打开了。
      4.Normals&Tangents是导入时对顶点和切线的处理,比如是否导入模型的顶点等,可限制模型精度和影响后续渲染等,比如vfshader就需要用到模型的 normal。

      

    Rig:这里Animation Type包括(Generic/Humanoid/Legacy/None)

      Generic 用于非类人模型;Humanoid用于类人模型

      Avatar Definition:可以使用现有的avatar,也可以create from this model,一般地,模型网格文件选create,这个时候,Avatar子资产被增加到模型资产的下面,即Avatar是unity根据网格文件生成的,对Humanoid类型,还会自动匹配骨骼到骨架,不符合会报错;而动画文件使用copy,使用已有资源。

    

Animations:对一个Animation Clip动画片段进行设置

    

      勾选该选项可以对动画进行切割

      动画资源也分两种情况:
            1. 各个动画部分都是独立的
            2. 所有的动画集成在一个动画片段中。

            注:第2种情况,需要在导入资源之后手动分解成不同功能的动画片段。



1.AnimationEvent

  给动画添加事件Event:(如果一个动画的属性是Read—Only,那么复制该动画然后进行修改)

    这个在animation中可以给clip加帧事件,即播到某帧时触发某个事件:

           

    1.给clip的某些帧上加event,这个Function就是事件的名字,其他的是这个函数的参数

    2.定义一个脚本来接受这个事件,比如这个图需要定义一个脚本,并且脚本里定义了void ani(xxx){}函数

    3.参数的处理:根据脚本的函数定义格式传参数,比如void ani(int a),则传Int那个参数,ani(Object a)则传Object那个参数,ani(float a, string b)则传Float和String这2个参数,而,ani(AnimationnEvent a)则传整个event进去(包括所有参数和当前event对应的clip的信息)

    ps:添加了event的clip的animator物体必须挂上定义了该事件名Function的函数的脚本,否则会报错

    

  Unity Script部分:可查看class AnimationEvent,主要是获得该event所在clip的一些信息:与此event相关的stateinfo,clipinfo,和该event本身的信息:event调用的函数名functionName、函数调用的参数:float/int/string/Object(采用哪个看函数定义式)、time(事件的触发时间)

  实际应用:这个event机制可以在播到某些帧执行一些事件。那么我们可以,在某个点播某个特效,在某个点播某个声音,在某个点进行一些画面特效,在某个点进行对敌人“击退”“击飞”“击浮空”,非常有利于实现各种节奏效果!还可以加入技能打断机制:当播到某2个帧之间可以被打断:比如我远扑某个玩家,结果我在空中被打断,我就被弹回来。这种效果一定很爽吧。读者可以在一个专门的脚本中定义各种接受事件的函数,并进行相应处理来进行使用此event机制。



猜你喜欢

转载自blog.csdn.net/caojianhua1993/article/details/80930024
今日推荐