Unity3D动画

分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

               

1. Unity3D老的动画系统Animation

1.1 基本概念

1.1.1 AnimationClip

     通过FBX导入的各个动画对象其实就是一个AnimationClip。此类以关键帧的形式记录了骨骼关节在各个时间点上的位置、旋转信息,根据帧率frameRate和播放模式wrapMode通过插值计算即可播放出连续的骨骼动画。


1.1.2 AnimationState

     每个AnimationState包含了一个AnimationClip,并记录这个动画片段的一些播放控制属性,实际上是一个AnimationClip的管理者。


     其中比较重要的参数有layer,weight, enabled, speed, blendMode这几项。这些参数的具体含义将在自定义混合动画控制中使用,在简单的动画控制时并不需要对AnimationState进行直接操作。


1.1.3 Animation

      Animation是Unity3D的动画播放控制组件,包含了一系列的AnimationState对象,提供各种动画播放及控制方法。常用方法有Play(), CrossFade(), Stop()。在脚本中通过animation即可直接引用同一物体上的Animation控件。


1.2 动画播放模式

1.2.1 简单动画播放控制

       所谓简单动画播放控制就是同一时间只有一个动作,比如Standard Assets中的那个水管工,静止idle,走walk,跑run,跳跃jump,攻击attack这些动作都是全身动作,同一时间只应该做一种动作,只有在动作切换时需要将两种切换动作进行混合以达到平滑过渡的效果,以上的操作使用Animation提供的CrossFade()方法即可达到。无论是CrossFade还是Play理论上都只需要在切换动画时调用一次即可,当然重复的调用并不会影响动画的播放,当Unity3D检测到当前播放的动画与函数调用使用的动画一样后会忽略该次调用。

1.2.2 自定义混合动画控制

1.2.2.1 多动画同时播放的需求

         在大多数情况下简单的动画播放控制已经足够,然而当游戏变得复杂时,单动画播放带来的问题就是美术工作量的急剧增加。

         最为典型的就是第三人称射击(动作)游戏,通常来说游戏中的人物会有各种上身动作如瞄准、射击、换子弹等,而下身则对应站立,行走(通常还是四个方向的行走动作)。这时候如果只能播放一个动作的话就需要美工制作大量的动作(站立瞄准、站立射击、跑步瞄准、跑步射击等等),其工作量可想而知。显然,最为效率的方式是美工分别做出上半身以及下半身的动作,然后由程序根据游戏角色的操作将两者动作混合起来同时播放。而这就涉及到了多动画同时播放的需求。此时简单的CrossFade()方法已经不能满足了,我们需要通过AnimationState来对动画播放进行自定义的控制。

1.2.2.2 使用AnimationState控制动画播放

      Unity3D的动画播放实际上都是通过AnimationState来进行控制的,Animation组件中提供的CrossFade,Play等方法其实就是将一系列对AnimationState参数进行设置的操作进行了封装。
      其中主要相关的参数有四个:
    
  1) layer: 该动画片段(AnimationClip)所在的播放层次。
      2) weight: 该动画片段在动画混合中所占的权重(0~1)
      3) enable: 该动画片段是否进行播放
      4) blendMode: 混合方式,有两种Blend和Additive
   

      默认初始化情况下Animation组件中的全部AnimationState的layer=0,weight=0, enable=false。Animation组件默认播放的AnimationState的layer=0, weight=1, enable=true。

1.2.3 局部动画

      要在同一个角色上同时播放两个不同的动作使用局部动画即可。

1.2.3.1 生成局部动画

      在Unity3D中有两种方式实现局部动画,一是使用AnimationState的AddMixingTransform方法,该方法传入一个骨骼节点的Transform,调用后该动画片段AnimationClip便只会影响该节点及其子骨骼,而对其他骨骼关节并不再影响。

      另一种方法是在动画模型制作时就只对局部的骨骼制作动画,其他骨骼在整个动画片段中都保持不变,这样生成的动画片段AnimationClip中就不会包括对那些不变骨骼的关键帧信息,也就不会对其他骨骼关节进行影响。

1.2.3.4 局部动画的混合

      局部动画的混合策略与前述Unity3D动画播放策略相同,只不过只是影响局部骨骼。这也就是说,上半身与下半身的动画无论谁所在的层更高,权重多少都不会影响另外半身的动画播放。但是上层的半身动画会覆盖下层的全身动画或与之混合,而全身动画中不包含在半身动画中的骨骼则完全不受影响。



2. Unity3D新的动画系统Mecanim

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

2.1 基本概念

2.1.1 Animation Clip(动画片断)

        动画片断包含了动画角色的动画数据,可以是一个简单的动画,如跑、走、静止等,它的类型属于子资源类型。

2.1.2 Avatar (阿凡达)

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

2.1.3 Retargeting(重定向)

    Retargeting是一种操作,它可把Mecanim所识别的骨骼结构及包含的动画应用到其它的骨骼中。

2.1.4 Rig(骨骼绑定)

   主要是在外部软件中根据角色的模型来设定。  

2.2 模型文件资源的制作和导出

     创建人体模型(humanoid character)的过程包括以下三步:
     1)建模(制作蒙皮网格)
           建模过程中注意以下几点:

         (1)注意建模软件和unity的缩放比,可以将模型导入unity后和一个标准cube(1m)进行大小对照
         (2)尽量将角色的根节点放置在脚下
         (3)导出模型的时候,检查并删除一些隐藏的点和面
     2)搭建骨骼
         对于人体模型(humanoid character),至少保证有15根骨骼
     3)蒙皮(将网格、骨骼进行绑定)
           在软绑定的时候,每个顶点最多受4根骨骼影响,因为这是Unity支持的上限。

2.3 动作文件的导入方式

    1)模型中自带动作,即将模型和动作一起导出成为一个fbx文件,这种情况下,如果自带了多个动作,可以在unity中对animation进行分割命名;
    2)将模型和动作分开导出,并放在同一目录下,遵循“模型名@动作名”的命名规则;

    3)制作Mecanim动画


  第1步:

            动画素材(Animation clips)从外部导入或在Unity中创建。

  第2步:

            把Animation clips按要求放在Animator Controller的状态中,Animator Controller一个动画窗口中显示其完整视图。在此视图中,状态作为一个节点,且由线连起来。Animator Controller作为Project Window中的一个资产。

  第3步:
             已设定骨骼的角色模型(如上图中的宇航员“Astrella”)有一个具体的骨骼配置,且此骨骼配置被映射到Unity通用的Avatar格式。被映射的“Avatar资产”作为导入角色模型的一部分,且显示在Project Window中。
  第4步:
            当对角色模型进行动画时,它必须有一个Animator组件。在Animator组件时,需要设置Animator Controller和Avatar。仅当制作人类角色动画时,才需要Avatar,对于其类型的动画,仅仅需要Animator Controller。

2.4 使用人形角色动画

    Mecanim动画系统特别适合人形角色动画的制作。人形骨架是在游戏中普遍采用的一种骨架结构,Unity为其提供了一个特别的工作流和一整套扩展的工具集。由于人形骨骼结构的相似性,用户可以实现将动画效果从一个人形骨架映射到另外一个人形骨架上去,从而实现动画重定向功能。除极少数情况之外,人形模型均具有相同的基本结构,即头部、躯干、四肢等。Mecanim正是充分利用了这一特点来简化了骨骼绑定和动画控制过程。
    创建动画的一个基本步骤就是建立一个从Mecanim系统的简化人形骨架结构到用户实际提供的骨架结构的映射,这种映射关系称为Avatar

2.4.1 创建Avatar

       在导入一个模型(如FBX文件)之后,可以在Model Importer面板的Rig(骨骼绑定)选项卡中指定它的Animation Type(可选:Humanoid、Generic和Legacy三种)。
      对于人形骨架,在Animation Type右侧的下拉菜单中选择Humanoid,然后单击Apply按钮,Mecanim系统就会尝试将用所提供的骨架结构与Mecanim系统内嵌的骨架结构进行匹配。在多数情况下,这一步可以由Mecanim系统通过分析  骨架的关联性而自动完成。如果匹配成功,用户会看到在Configure...复选框被选中。
    在匹配成功的情况下,在Project视图,有一个Avatar子资源将被添加到模型资源中。 
  

2.4.2 配置Avatar    

      Avatar是Mecanim系统中极为重要的模块,因此为模型资源正确地设置Avatar也就变得至关重要。不管Avatar的自动创建是否成功,用户都需要进入到Configure Avatar界面中去确认Avatar的有效性,即确认用户提供的骨骼结构与Mecanim预定义的骨骼结构已经正确匹配起来,并且模型已经处于T形姿态。
      实线圆圈:骨骼是必须匹配的
     虚线圆圈:骨骼是可选匹配的
      可选匹配骨骼的运动会根据必须匹配骨骼的状态来自动插值计算。为了方便Mecanim进行骨骼匹配,用户提供的骨架中应包含所有必须匹配的骨骼。为了提高匹配的几率,应尽量通过骨骼代表的部位给骨骼命名(如:左手命名为LeftArm)。

2.4.3 设置Muscle参数

     Mecanim使用肌肉(Muscle)来限制不同骨骼的运动范围。一旦Avatar配置完成,Mecanim就能解析其骨骼结构,进而用户可以在Avatar面板的Muscles选项卡中调节相关参数。在此可以调整角色的运动范围,以确保骨骼运动起来真实、自然。
    

2.4.4 Avatar身体遮罩(Body Mask)

    Unity可以通过身体遮罩来选择性地控制身体的某一部分是否受动画的影响,用户可以在Model Import Inspector的Animation选项卡中,选中一个Clip,然后下面的Mask->Humanoid,在此Humanoid选择哪些部分不受动画影响(红色部分不受身体影响)。这样就可以控制动画的局部更新,从而满足一些特殊需求。
    使用Body Mask的一个好处是减少内存开销,这是因为不受动画影响的身体部分就不需要计算与其相关联的动画曲线;同时,在动画回放时也无须重新计算无用的动画曲线,进而减少动画的CPU和GPU开销。

2.4.5 人形动画的重定向

   人形动画的重定向是Mecanim系统中最强大的功能之一,这意味着用户可以通过简单的操作将一组动画应用到各种各样的人形角色模型上。特别地,重定向只能应用于人形型,在此情况下,为了保证模型间骨骼结构的对应关系,必须正确配置Avatar。

2.4.6 逆向(IK:Inverse Kinematics)运动学功能(Pro Only)

      大多数角色动画都是通过将骨骼的关节角度旋转到预定值来实现的。一个子关节的位置是由其父节点的旋转角度决定的,这样,处于节点链末端的节点位置是由此链条上的各个节点的旋转角和相对位移来决定的。可以将这种决定骨骼位置的方法称为前向运动学。
      但是,在实际应用中,上述过程的逆过程却非常实用,即给定末端节点的位置,从而逆向推出节点链上所有其他节点的合理位置。这种方法被称为逆向运动学(IK),在Mecanim系统中,任何正确设置了Avatar的人形角色都支持IK功能。
      为了给角色模型设置IK,需要知道可能与之进行交互的周边物体,进而设置IK脚本,常用的Animator函数包括:
      1) SetIKPosition:设置IK目标位置
      2) SetIKPositionWeight:设置平移权重(0 = at the original animation before IK, 1 = at the goal).
      3) SetIKRotation:设置IK目标的旋转
      4) SetIKRotationWeight:设置IK目标旋转权重(0 = rotation before IK, 1 = rotation at the IK goal).     
      5) SetLookAtPosition:设置查看位置
      6) SetLookAtWeight:设置查看权重
      7) bodyPosition:身体中心位置
      8) bodyRotation:身体中心旋转

2.5 非人形角色动画

     除了人形动画,Mecanim系统也支持非人形动画,只不过在非人形动画中无法使用Avatar系统和其它一些相关功能。在Mecanim系统中,非人形动画被称为一般动画(Generic Animation)。
   一般动画的启用方法:
     1) 在Project视图中选中FBX资源
     2) 在Inspector视图中选择Rig标签页
     3) 设置Animation Type为Generic

2.6 Animator组件

      任何一个拥有Avatar的GameObject都同时需要有一个Animator组件,该组件是关联角色及其行为的纽带。
      Animator组件:引用了一个Animator Controller,它被用于为角色设置行为,这里所说的行为包括状态机(StateMachines)、混合树(Blend Trees)以及通过脚本控制的事件(Events),具体包括:
      1) Controller:关联到该角色的animator控制器
      2) Avatar:该角色的Avatar
      3) Apply Root Motion:是使用动画本身还是使用脚本来控制角色的位置
      4) Animate Physics: 动画是否与物理交互
      5) Culling Mode: 动画的裁剪模式
           - Always animate: 总是启用动画,不进行裁剪
           - Based on Renderers: 当看不见角色时只有根节点运动,身体的其它部分保持静止

2.7 动画状态机

   通过脚本控制运动状态的切换和过渡是一项非常复杂的工作,Mecanim系统借用了计算机科学中的状态机概念来简化对角色动画的控制。
   1) Mecanim状态机
        Mecanim的动画状态机提供了一种纵览角色所有动画片断的方法,并且允许通过游戏中的各种事件(如用户输入)来触发不同的动画效果。动画状态机可以通过Animator Controller视图来创建。一般而言,动画状态机包括:
        (1) 动画状态 (Animation State)
        (2) 动画过渡 (Animation Transition)
        (3) 动画事件
        (4) 子状态机(复杂的状态机可包含简单的子状态机)







        


参考:http://blog.csdn.net/sparrowfc/article/details/8240165

            http://docs.unity3d.com/Manual/AnimationOverview.html

            http://www.narkii.com/club/thread-305414-1.html

           

分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

猜你喜欢

转载自blog.csdn.net/hddghhfd/article/details/87891656