Unity3D游戏开发之详解 Animation类和Animator类

发表于2017-10-19
评论0 3.5k浏览

Animation和Animator 虽然都是控制动画的播放,但是它们的用法和相关语法都却并不相同,为了让大家可以更好的分清楚Animation类和Animator类,下面就给大家详细介绍下。


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.这样动画就会正常保持上一帧的采样直到你要停止播放动画。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引