Unity Animation System(动画系统)


动画系统
支持:动画融合,混合,叠加动画,行走循环的时间同步,动画层,控制动画的各个方面(时间,速度,融合权重)
 
带有每顶点1、2或4骨骼的蒙皮网格,以及支持基于物理的布娃娃系统和程序动画。
 
简要介绍如下:  
 
 动画融合 Animation Blending    你不希望两个不同的动作之间突然跳转,想要动画平滑过渡  
        在Unity同一个角色可以拥有任意数量的动画,所有动画被融合或添加在一起,来产生最终动画。
 
         Animation Layers   动画层   
         Animation.CrossFade() 淡入淡出
         在Unity动画系统,可以在许多动画剪辑之间做期望的融合,
         可以指定手工融合权重或简单实用animation.CrossFade(),来自动动画处理权重。
         对权重的解释:
         比方说有一个行走循环和跑步循环,两者的权重都是1(100%)。当Unity生成最终动画会规格化权重,这意味着行走将占50%,跑步占50%权重。
 
 Animation Mixing 动画混合                                           附加动画  和   动画混合 的区别尚不清楚
        例如,有个一个挥手动画,想要在空闲角色或正行走的角色播放挥手动画。没有动画混合,您必须创建两个手挥舞着动画:一个用于空闲,一个用于行走。不过,如果你添加肩膀变换作为混合变换,来做挥手动画,那么挥手动画将从肩膀位置外受完全控制,身体的其余部分将不会受到它的影响,将继续播放空闲或行走动画。因此,只需要一个挥手动画。
 
 Additive Animation 叠加动画(也可以认为是附加动画)          代码部分原理尚未清楚:
  叠加动画和动画混合可以让你缩减为游戏制作的动画片断的数量,并且对面部动画(facial animations)来说非常重要.
叠加动画:就是让你在任意其他动画上面附加上动画效果。或者这样认为主运动不变,在其上面添加一些附加运动。
附加动画详解:
叠加型动画通过将两个动画彼此相减进行计算,并将其存储为两个动画的差值。实际上叠加型动画本身并没有什么用途,因为它需要添加到另一个动画上才能正常工作。使用叠加型动画实际目的是想找到可以应用到多个动画上的叠加姿势。这可以降低每个状态需要的动画数量。比如一个武器弹药装载动画可以制作成为叠加动画。现在可以把它添加到空闲动画、走步的动画集(前、后、左和右)上面,同样也可以添加到跑步的动画集上。所以不必制作向前走动过程中加载弹药的动画或者其他任何组合动画,只需要创建一个装载弹药的叠加动画,然后将其添加到向前走动、向后跑动等动画的上面即可。
但是使用时应该注意失真的影响。
 
Procedural Animation 程序动画
有时,想要程序动画角色骨骼。这样的话可以给指定骨骼写脚本,来控制骨骼的运动轨迹。
一件很重要的事情要知道的是动画系统更新变换在Update()函数之后并LateUpdate()函数被调用之前。因此想要调用LookAt()函数,应该在LateUpdate()中以确保已经真的重写动画。
     布娃娃系统Ragdolls 也是用同样的方法制作出来的. 你可以简单的把刚性物体(Rigidbodies), 角色关节(Character Joints)  胶囊碰撞体(Capsule Colliders)连接给不同的骨骼. 这样物理系统就可以作用于蒙皮角色(skinned character). (什么是布娃娃系统,当你在射击类游戏中打死对手时可以注意到当角色快接近地面时,他的四肢开始瘫软在地面上,这个不是动画师调出来的,而是布娃娃系统自动计算出来的。)
布娃娃系统的利弊:
由于计算机的各种技术限制,游戏开发者不能够使用完全仿真的布娃娃设计,而采用一种相对简单的模式。
  • 一些末端骨骼如手指能做出种类繁多的动作。
  • 利用骨骼联合点代替真实的骨骼肌来约束骨骼的移动,能取得较好的表现效果。
  • 通过布娃娃的碰撞检测可以让角色在游戏中的表现更为真实。不同的先前的将整个角色模型用来进行碰撞检测。

布娃娃系统最大的优势还是在于取代传统的角色动作系统

 

Animation Playback and Sampling 动画播放和取样
  动画剪辑通常以一个固定的帧速制作。例如,可以砸Maya中以每秒60帧(fps)的帧速率创建动画,当导入动画到Unity时,这个帧速率将由导入器读取,根据前面的情况,可以得知,导入的动画数据被取样也是60fps。
 提示:所以这个动画播放的取样速率是由3D制作软件(如Maya)来决定的。但是播放速率是由实际设备决定的。
 
然而,游戏运行通常运行在一个变化帧速率,有的电脑帧速快,有的电脑帧速慢,
即使是同一台电脑,前一秒和后一秒因为视角的不同帧速也会不一样。基本上当游戏开始运行时我们无法确定一个精确的帧速率。这意味着即使动画剪辑制作时是60fps,那它播放时也许是另外一个速率,例如56.72 fps 或 83.14 fps,它可能是任何一个。
读取动画播放的最后一帧
采用WrapMode.ClampForever模式    这样的话,动画将保持无限取样最后一帧,直到你停止动画。
 同样需要注意的是变化的帧速采样结果, 一个使用WrapMode.Once 模式重放的动画的采样不一定是精确的最后一帧( last frame).在游戏中很有可能是刚好结束前的某一帧, 在下一帧时间可能超过动画的长度, so it is disabled  not sampled further. 如果你需要动画的最后一帧采样精确,你可以使WrapMode.ClampForever. 如果是那样的话动画将不停的对最后一帧进行采样直到你自己停止动画. 
 
使用动画事件 using Animation Events
       动画剪辑中可以添加动画事件,使你在时间轴特定的帧调用脚本中的函数这里需要关注的就是在某一个时间点调用某一个函数。比如播放到动画事件显示在事件行上。通过双击事件行,或使用"事件"按钮,添加一个新的动画事件。
        对绝大多数应用场合 Unity对变化帧速的采样我们无需对其进行干预. 可是, 如果你的某个游戏逻辑所依赖的动画变化或道具(transforms or properties)结构十分特殊, 那你必须知道这一点 举例说, 如果你有一个动画是把一个物体30帧内从 0旋转到180, 你想从代码中得知什么时候动画完成一半, 你不能写一段条件语言来检查现在旋转值是不是90. 因为 Unity 依照游戏的变化速率来对动画采样, 它可能在旋转快到90度时进行采样, 或者是刚好过90度的时候采样. 如果你需要通报动画中一个特殊点到达时,你可以使用 AnimationEvent 来替代.
 
动画剪辑 Animation Clip      动画剪辑存储着所有可使用于角色动画或简单动画的动画数据。这些动画剪辑数据只有一个属性而且不能修改:采样率。(这是创建剪辑的采样率)
 
 
posted @ 2013-11-14 16:36 青春不再出发 阅读(...) 评论(...) 编辑 收藏