2015-09-14 13:13:52 tchenjiant 阅读数 1465
Mecanim动画系统
Unity3D动画系统分类:
   一:Unity3.5版本之前的旧的Legacy系统;
   二:Unity4.0版本新增加的Mecanim动画系统。


新动画系统的优点:
   1)可视化动画剪辑编辑;
  2)能够对动画信息进行复用;
   3)利用动画状态机(Animation State Machine)实现不同状态下动画剪辑的过渡。


人形角色动画制作与导入
Mecanim动画系统的强项之一:
     控制人形角色动画,它可以使得角色动画剪辑只制作一遍,即可以复用到不同的人形角色模型上。


 建立模型的一般注意事项:
1)注意模型的尺寸:一般在1.7-1.8之间;
2)在三维的建模软件中,使得角色的最底部与世界坐标的中心点对齐;
3)尽量把模型制作为T型姿势。


FBX文件中的Rig选项卡
(1)Animation Type(动画类型)
None:无动画类型
Legacy:旧版动画类型(使用Animation时使用)
Generic:非人形动画类型(无法使用Mecanim动画系统)
Humanoid:类人型动画类型(可以使用Mecanim动画系统)


(2)Humanoid类型下:
Avatar Definition(获得Avatar的方法):
Create From This Model:创建自身的Avatar
Copy From Other Avatar:使用其他模型的Avatar


FBX文件中的Rig选项卡
Generic类型下:
Root node(根节点):选择骨骼的根节点(动画类型为Humanoid时自动选择),其目的是为了使模型动画与世界坐标达到一个完美的融合。


FBX文件中的Animation选项卡
Import Animation:导入动画
Anim.Compression:动画压缩类型
Off:不进行压缩
Keyframe Reduction:关键帧压缩
Optimal:最佳压缩
Rotation Error:动画中旋转的误差值
Position Error:动画中位置的误差值
Scale  Error:动画中缩放的误差值


Animator组件
Controller:附加到此角色的动画器控制器
Avatar:此角色的Avatar
Apply Root Motion:应从动画本身还是从脚本控制角色的位置
Update Mode:动画器更新模式
Normal:动画器标准更新
Animate Physics:在物理循环期间更新动画器为了使动画系统与物理引擎同步
Unscaled Time:Time.timeScale外的动画器独立更新
Culling Mode:动画的剔除模式
Always Animate:始终播放动画,不剔除
Based on Renderers:渲染器不可见时,仅对根运动进行动画处理。当角色不可见时,所有其他身体部位保持静态


Animator编辑窗口
Aniamtor窗口打开路径:Window→Animator


在Aniamtor窗口中点击任意一个动画片段,观测Inspector面板:
Speed:默认动画速度
Motion:当前状态下的动画
Foot IK:该动画是否可以使用IK
Mirror:该动画是否使用镜像
Transitions:该状态下的转换列表
Solo:当自己满足转换条件时只播放自己的动画
Mute:动画状态转移是否被禁用:√(打钩):被禁用(红色)


在Animator窗口内空白处单击右键:
Empty:创建空动画剪辑
From Selected Clip:添加选择的动画片段
From New Blend Tree:添加新的混合树
Create Sub-State Machine:创建子动画状态机
Paste:粘贴
Copy current StateMachine:拷贝当前的动画状态机


在Animator窗口内选中动画片段,单击右键:
Make Transition:创建状态转移线
Set As Default :作为该模型的初始动画
Copy:拷贝动画
Create Sub-State Machine:创建子动画机
Create new BlendTree in State:以该动画片段创建新的混合树
Delete:删除该动画片段


创建Avatar
(1)在Project窗口中点击人物角色模型:U_Character_REF         
在Inspector窗口中选择Rig:
Animation Type:选择“Humanoid”;
Avatar Definition:选择“Create from This Model”;
设置后选择”Apply”进行确认。      
(2)打开映射配置界面:
   点击” Configure…”,进入” Mapping”设置界面,在Inspector窗口进行设置,在Scene窗口进行查看。
(3)点击Body、Head、Left Hand、Right Hand,分别进行身体、头部、左手、右手的设置,进行确认后点击“Apply”按钮。
(4)最后设置完成后,点击“Done”按钮。
(5)检查以上步骤,确认无误后,会看到在U_Character_REF模型中添加了一个Avator,如下图:


判断是否成功创建Avatar:
    如果没能成功创建该角色的Avatar, Configure…”按钮旁会显示一个叉号。
     如果能成功创建该角色的Avatar, Configure…”按钮旁会显示一个对号。


一个模型也可以引用其它模型的Avatar,步骤为:
(1)Avatar Definition选择: “ Copy From Other Avatar”
      Scource:  找到刚才创建的U_Character_REFAvatar
(2)点击“Apply”按钮


人形动画的重定向
人形动画的重定向是Mecanim系统中最强大的功能之一,这意味着用户可以通过简单的操作将一组动画应用到各种各样的人形角色模型上。特


别地,重定向只能应用于人形模型,在此情况下,为了保证模型间骨骼结构的对应关系,必须正确配置Avatar。
前提:U_Character_REF和Teddy都已经配置好各自的Avatar
重要操作:把创建好的AniController控制器分别赋予两个模型的Controller属性。


动画层( layer)
Unity使用“动画层”来管理身体不同部分的复杂状态机。比如:可以使用下半身(动画)层来管理走动/跑动;使用上半身(动画)层来控制


投掷/射击等动作。


身体遮罩(Avatar  Mask)
“Mask”选项用来指定该层使用的身体蒙皮。比如:如果你希望当角色走路时抱着物体,即手臂不会来回摆动。此时只需要在BodyMask中禁


止手臂的运动即可。
在Project列表窗口中创建“Avatar Mask”添加的新的身体动画蒙皮层窗口如下图所示。
将新创建的“Body Mask”拖动到新Layer的Mask窗口中,这样,该图层便只会播放手部的动画了。


逆向运动学(IK)
使用IK的前提条件:
首先将模型动画的Mask中需要使用IK的部分点绿(目前只可以在手部和脚部使用IK);
其次将Animator控制机中需要使用IK的Layer里的IK Pass打钩。


设置动画状态机
(1)在Project窗口,点击鼠标右键,创建AnimatorController,并进行重命名,比如:“AniControl”
(2)双击“AniControl”,打开Animator剪辑窗口,并将已经制作好的动画片段拖动到该视图中。
     橙色的动画片段“IdleShort”:为默认的动画状态。
(3)选择U_Character_REF模型的Animator组件,
     属性Controller:选择刚才创建的AniController
(4)各个动画片段之间没有转移的话,运行游戏,并打开Animator窗口,此时会播放默认的动画片段:“IdleShort”(会以蓝色进度条显  


     示)
Start、End:动画的起始、结束帧数
Loop Pose:循环姿势
Root Transform Rotation:骨骼根节点位置旋转
Root Transform Position Y:沿Y轴根节点位移
Root Transform Position XZ:沿XZ平面根节点位移
Mirror:动画是否镜像


给三个动画片段之间创建状态转移,如下图。
如果要通过代码方式控制动画的播放,需要在Animator窗口的下方的Parameters建立各种调整参数。


Float:浮点型(speed)
Int:整形(height)
Bool:布尔值(isRun)


Blend Tree(混合树)
利用差值技术,使多个动画进行混合,达到多个动画片段间的相互转换。


创建混合树:
Animator窗口右键点击From New Blend Tree


点击混合树,向其中添加需要混合的动画片段。


Blend Type:混合树类型
Parameter:变量类型
Motion:当前状态下的动画
Thresholc:该动画的临界值
     :该动画的默认速度
     :对该动画进行镜像处理
     :红线表示当前模型动画状态
2015-02-07 08:58:59 book_longssl 阅读数 3515


 

通过创建角色动画Avatar,在新的动画系统Mecanim中,Unity就设置了角色动画的骨架和蒙皮信息,从而就可以在Unity中实现角色动画了。

切换到动画(Animations)选项卡。选中导入动画(Import Animation)的选项。如果该文件中有动画数据,可以看到动画剪辑的列表(Clips)。

Tips:

Rig选项卡中动画类型(Animation Type)如果选则的是旧版(Legacy),Animations中的属性仍然是旧版的。


 


根节点的运动(Root Motion)。角色的位置和方向不要存放在骨骼中。角色原点在定义avatar的时候指定。Root Transform 的变化实时计算并传递到Game Object中,以使游戏物体运动。

Root Transform Rotation 根节点的旋转。

Bake into Pose:该动画播放期间,根的朝向不变。

开始帧和结束帧,比较相近时才启用这个选项。如果比较相近则显示绿点,否则显示红点。一般直线走或直线跑是可以选中该选项。

Root Transform Position (Y),和Root Transform Position (XZ) 分别锁定Y轴上的移动,和XZ平面上的移动。

遮罩 Avatar Body Mask

Create-> Avatar Body Mask.可以创建一个遮罩。Body Mask组件。身体遮罩资源可以在动画控制器中重用。通过身体遮罩可以对动画里面特定的身体部位进行激活或禁止。身体部位包括:头、左手臂、右手臂、左手、右手、左腿、右腿、Root (以脚的背面作为标志)。在身体遮罩界面,您可以给手或脚指定是否需要IK(反向运动学),由此可决定在动画混合里面是否包括IK曲线。

通过身体遮罩可以对动画里面特定的身体部位进行激活或禁止。在网格导入观察器和动画层的动画标签里面可以设置身体遮罩。身体遮罩让您能根据角色需求精确的裁剪动画。例如,您有一个常见的行走动画,包括手臂和腿的动作,但是如果现在一个角色的双手举着巨大的物体,您当然不会希望她在行走的时候手臂来回摆动。当然,您可以通过身体遮罩的切换,继续使用常规的行走动画。

Mecanim动画系统中,Animations 标签选项卡下,每一个动作剪辑Clips都有自带的Body Mask组件。

Curves 曲线

 


曲线控制动画绑定的一个值(如移动速度),动画原地播放的情况下,用脚本获取该值,精确控制移动。



 

2015-02-10 14:22:13 book_longssl 阅读数 2837

 

     动画混合

  状态机之中的状态不仅可以是单个剪辑,也可以是一个混合树。构建和编辑复杂的状态机和混合树,以便完全控制的角色如何运动。Unity编辑器提供强大的工具,用于分割、创建循环和从导入的动画文件中提取轨迹。然后可以把这些动画短片用作一个多层混合树的叶子,或者作为分层状态机中的一种状态。混合树让您只使用几个动画剪辑就能创建各种各样的运动。在混合树编辑器中,您可以定义混合参数并在3D视图中预览混合动画。混合树和动画剪辑一样,可以用作分层状态机中的状态。

  动画工具用于创建多层分层状态机。控制器可以定义任意数量的层。每一层可以使用自己的状态机,也可以与主层共享状态机。层可被覆盖或添加,使用身体遮罩可以定义身体受影响的部分。最后,您可以使用分层状态机把复杂的控制器分解成更小的可重复使用的模块。

  


 

  Mecanim的混合树


动画重定向

  将创建的sa_ctl控制器拖到到模型的controller变量中。这样模型就可以播放动作了,也可以将这个控制器拖到给其他模型文件实现动画重定向。



  Tips;


     注意:此Animator组件中的Apply Root Motion选项如果我们勾选了的话,当播放动画时是通过动画运动的幅度来改变角色的Transform的,如果我们不勾选,我们就可以用脚本设定此角色的Tranform。

  如果在Animator中我们勾选了Apply Root Motion,我们不必修改角色的Transform,依靠角色的动作本身的设计就能改变角色的Transform。但是如果我们没有勾选它,那我们就只能依靠程序来动态的改变其Transform,就像老式的动画系统一样。



2015-02-12 08:28:07 book_longssl 阅读数 10779



Animation类
animation组件用于播放动画。可以指定动画剪辑到动画组件并从脚本控制动画播放。在的动画系统基于权重并且支持动画融合,叠加动画,动画混合,标签和完全控制动画播放的各个方面。
如果想播放一个简单的动画,可以使用Animation.Play;如果想在动画之间交叉淡入,可以使用Animation.CrossFade;如果想改变动画模式(循环,一次,乒乓),可以改变动画导入设置里面的动画帧的WrapMode,或者在运行时改变AnimationState.wrapMode的值; AnimationState可以用于改变动画的层,修改播放速度,并且直接控制融合与混合。动画也支持枚举,所以你可以像这样在AnimationStates之间循环:

 

 

// 使这个角色的所有动画的播放速度降为一半

 

for (var state : AnimationState in animation) {

 

state.speed = 0.5;

 

}


Variables变量
clip 默认的动画剪辑。
playAutomatically 是否在开始的时候自动播放默认的动画
wrapMode 动画剪辑播放完成之后,应该如何操作
isPlaying 是否在播放任何动画?
this [string name] 返回名称为name的动画状态。
animatePhysics 如果打开这个选项,动画会在物理循环过程中被执行。这个选项只有在结合运动学刚体的时候才有用。
animateOnlyIfVisible 如果打开这个选项,Unity可能在它认为用户不会看到当前动画的时候停止播放。
cullingType 控制动画组件的消隐。
localBounds 在本地坐标空间这个动画的动画组件的AABB。
Functions函数
Stop 停止所有当前Animation正在播放的动画。
Rewind 倒播名称为name的动画。
Sample 在当前状态对动画进行采样。
IsPlaying 名为name的动画正在播放吗?
Play 没有任何混合的播放动画。
CrossFade 在一定时间内淡入名称为name的动画并且淡出其他动画。
Blend 在接下来的几秒内混合名称为name的动画直到targetWeight
CrossFadeQueued 在前一个动画播放完成之后淡入淡出下一个动画。
PlayQueued 在前一个动画播放完成之后直接播放下一个动画。
AddClip 给动画添加一个名称为newName的动画剪辑。
RemoveClip 从动画列表移除剪辑。
GetClipCount 取得当前动画的动画剪辑数量。
SyncLayer 同步某层的动画的播放速度。
Animator 类
Mecanim动画系统中,通过Animator组件来控制动画的播放,设置和获取动画中的参数。
变量
isHuman 是否为人形动画。Humanoid则返回true。Generic 则返回false。
humanScale 人形动画Avatar缩放倍数。 (generic默认返回 1)
deltaPosition相对于上一帧Avatar位置变化量。
deltaRotation相对于上一帧Avatar旋转(朝向)变化量。
rootPosition 根节点(gameObject)位置。
rootRotation根节点(gameObject)朝向。
applyRootMotion 根节点受动画(animations)控制。
animatePhysics  如果为true,动画在物理循环中播放. 仅用来和动力学刚体(kinematic
rigidbodies)交互。
gravityWeight 重力值,取决于当前播放的动画。
bodyPosition 重心位置。
bodyRotation 重心方向。
stabilizeFeet 动画切换和混合时自动对齐脚
layerCount 动画控制器( AnimatorController)层数。
feetPivotActive脚底轴心权值. 为 0% 表示轴心在重心,为 100% 轴心在脚底。
pivotWeight 轴心权值;
pivotPosition 轴心当前位置。
isMatchingTarget 是否自动匹配。
speed播放速度。( 1表示未缩放)。
targetPosition 目标点位置通过 SetTarget()函数设置。
targetRotation 目标点方向.通过SetTarget()设置。
cullingMode 裁剪模式.
avatar 获取和设置当前Avatar。
layersAffectMassCenter 附加层,影响重心。
函数
GetFloat 获取一个浮点数类型的参数。
SetFloat设置一个浮点数类型的参数。
GetBool获取一个布尔类型的参数。
SetBool 设置一个布尔类型的参数。
GetInteger获取一整数类型的参数。
SetInteger设置一个整数类型的参数。
GetVector获取一个向量类型的参数。
SetVector设置一个 向量类型的参数。
GetQuaternion获取一个四元数类型的参数。
SetQuaternion设置一个四元数类型的参数。
IsParameterControlledByCurve 参数是否通过曲线控制。
GetIKPosition 得到反向动力学的目标点位置。
SetIKPosition 设置反向动力学的目标点位置。
GetIKRotation 获取反向动力学目标点的方向。
SetIKRotation设置反向动力学的目标点方向。
GetIKPositionWeight 得到反向动力学位移权重。(0表示原始位置。1表示反向动力学
目标位置)
SetIKPositionWeight设置反向动力学位移权重。
GetIKRotationWeight 得到反向动力学方向权重。
SetIKRotationWeight 设置反向动力学方向权重。
SetLookAtPosition 设置观察方向(z轴正方向)。
SetLookAtWeight 设观察点方向权重。
GetLayerName 得到层的名称。
GetLayerWeight 得到层的当前权重。
SetLayerWeight 设置层的当前权重。
GetCurrentAnimatorStateInfo 获取当前动画控制器当前状态信息。
GetNextAnimatorStateInfo 得到当前动画控制器的下一个状态信息。
GetAnimatorTransitionInfo 得到指定动画控制器层上的转换信息。
GetCurrentAnimationClipState得到当前动画剪辑的状态信息。
GetNextAnimationClipState 获取下一个动画剪辑状态信息。
IsInTransition 是否正在进行状态切换
MatchTarget 自动对齐到目标位置和方向。
InterruptMatchTarget 中断自动对齐操作。
ForceStateNormalizedTime 设置归一化时间(到达目标点的时间)。
SetTarget 设置目标位置。
IsControlled transform属性是否受Animator控制。
GetBoneTransform 返回骨骼的Transform 属性。
动画播放和取样
在3ds Max或者Maya中创建了一个每秒60帧的动画后,当导入进Unity,同样也是60帧的动画。然而游戏在运行的时候,帧率却不是恒定不变的。在一些速度较快的PC上帧率会更快,帧率也会每一秒在摄像机与给出的任意一点上所看到复杂度不同。基本上这意味着我们可以不用当游戏运行的时候去假设确切的帧率。如果有一个60帧的动画,它应该是可以从不同的帧率上回放回来,比如56.18 fps,或者87.61fps,可以是任何的点。
在不同帧率上的的采样动画,并不是它们真正的帧率。但是很幸运,3D电脑图形上的动画不是由分离的帧所组成的,而是连续的曲线。这些曲线对任何点的采样都是很适合的,不是光只是在时间轴上原始帧的那些点。这意味着游戏在运行的时候,在比较高的帧率上,动画效果看起来会更平滑和流畅。
在大多数练习的情况下,事实上采样动画在这些可变的帧率上并不是你想像中还需要去做连接的。然而,如果你有一个在游戏逻辑上要去判断控制动画的坐标属性,那就得注意了。举个例子,如果你有一个30帧的动画是来旋转一个对象从0-180度,你想知道当代码何时进行到当动画进行到一半的时候即90度,不应该去添加一个条件语句来判断现在对象的旋转是不是已经进行到了90度。因为Unity的动画采样是依照游戏不同的帧率来进行的,当旋转在90度以下的时候就该判断了,等到90度的时候就刚好。如果你需要知道何时动画中一个指定点的时候,应该去用AnimationEvent代替。
要注意在可变帧率上的因果关系,一个回放动画要用WrapMode.Once是不可能为一个上一帧的准确时间来采样的。在游戏的动画帧上可以在动画播放后去采样,在下一个帧上的时间上就有多余动画长度,所以就关闭也不会去采样。如果你真的需要上一帧的动画去做采样,就需要WrapMode.ClampForever.这样动画就会正常保持上一帧的采样直到你要停止播放动画。



2016-09-12 16:43:45 ios_song 阅读数 4541

Unity进阶 - 动画系统 - 人形动画的导入

本节课程我们来学习人形动画的导入,我们会按照正常的制作动画的过程一步步来学习Unity中新版的动画系统。一般来说我们正常制作动画的会导入模型和动画,然后要设置模型的动画类型,还要设置Avatar,设置动画剪辑……在这些都设置完之后,我们就可以在状态机中使用这些动画剪辑了。


本节课的学习重点是模型的导入和设置,Unity支持很多模型文件,我们常用的就.FBX文件,可以在3D建模软件中导出来,可以在导出时进行导出设置,我们不要的数据就可以不必导出来。

首先我们导入动画系统第1课时使用的资源包,然后我们看一下Animations文件夹,文件夹里面的文件,选中之后可以看到都是.FBX文件,是.FBX格式的模型。Animations文件夹有很多模型,但是里面的模型都是同一个人物的模型。不同之处就在于不同的资源文件里面保存的动画不同。如果我们看到这个模型的文件名是xx@xx,@符号之前就表示我们这个模型的名字,后面表示保存的动画名字,这些模型文件并不是让我们来使用的,而是来使用里面的动画的。

打开Characters文件夹,我们会找到Crossbow模型,但是在这个文件夹中并没有动画,这个就是我们真正要使用的模型资源了,我们可以把这个模型拖拽到场景中。

导入Crossbow模型——展开游戏对象——游戏对象有三个子物体


Crossbow和Mesh_Crossbow都是用于渲染的,分别是选择游戏模型和游戏对象手上的武器的,我们可以找到Materials找到材质球,渲染一下颜色。


Motion这个对象是一个空对象,我们展开之后,还有很多空对象,但是这些对象是按照一定曾经排列的,这些空对象就表示我们这个人物模型的骨骼系统了。包括手,胳膊,头,脚趾等这些骨骼的位置和选择。

我们回到我们的角色模型资源上,选择模型,我们会看到右侧的导入设置,导入设置有Model(模型设置)用来设置模型的大小,比例,网格等……

Rig选项卡(表示绑定)包括Animation type、 Avatar等设置

Animation(模型中包含动画的)在之后的课程中会学习


我们回到Rig中,接下来我们重点讲解Rig选项卡:

Animation type:

1、none(不使用动画)

2、Legacy(旧版动画系统,不能使用状态机的,在3.-4.中使用,在5.以上使用新版动画系统,保留Legacy为了方便之处以前制作的动画)

3、Generic:表示新版动画系统的通用动画(除人形动画)

4、Humanoid:表示新版动画系统的人形动画(模型长的像人,具有人形的骨骼)

使用Humanoid需要做一些设置

Avatar Definition

1、 Create Form This Model :从当前模型创建

2、 Copy Form Other Avatar :从其他的拷贝出一个Avatar

Optimize Game Object :优化游戏对象

 

未完待续……

推荐文章阅读:

Unity 进阶 - 动画系统 - Mecanim动画系统:http://blog.csdn.net/ios_song/article/details/52313736
Unity进阶 - 动画系统 - 给人物角色制作动画:http://blog.csdn.net/ios_song/article/details/52367210


没有更多推荐了,返回首页