unity animation 播放State和animationclip的区别

Unity&AnimationState&&动画状态&&&于飞
继承自“跟随引用”
将全面控制动画混合
在大多数情况下界面是完全可以满足基本使用。如果你需要全面控制动画混合任何播放过程,可以使用。
界面允许你修改速度,重力,时间和层,即便是动画正处于播放中。你也可以设置动画合成和(循环模式;Animation.wrapMode&循环模式&)
允许/禁止动画(是否启用动画)
动画的权重
动画的循环模式
动画的当前时间
格式化/规范化/标准化时间
动画格式化时间
动画的播放数度。“1”是正常播放速度
标准的播放速度
一秒内动画片段的长度
动画的层。当计算最后的混合权重时,动画中“高层(优先级高的层)”将会先取得权重
动画状态播放剪辑
应该使用那种混合模式
添加混合(转换)
应选一个动画加入(转换)。这允许你减少一定数量必要的创建(动画的创建)。
移除混合(转换)
应移除一个动画的(转换)
应该使用哪种混合模式?
设置动画为混合相加
剪辑是通过动画状态播放的
//输出动画剪辑的帧速率到控制台
启用/禁用动画
//允许“走”循环
动画的层。当计算最后的混合权重时,处于高层中的动画将会获得权限的优先分布
如果高图层没有用尽全部的混合权重,底图层动画只接受混合权重。
//将“走”和“跑”动画放入层1
用秒来计算动画的长度。
//输出“走”动画的长度(秒单位)
&标准(标准化)速度
标准播放速度
这个最常被用于同步播放速度,当两个动画之间混合时。在大多数情况下可以更容易更好的使用
//同步“跑”和“走”速度
&标准(标准化)时间
动画的标准化时间
动画结尾的值为1。动画中间的值为0.5。
//快进到动画的中部
动画的播放速度。“1”是正常的播放速度
负(即,负数)的播放速度将播放动画的倒放
//两倍步速
动画的当前时间
如果时间大于实际长度,它将会按照(循环模式)循环。这个值可以大于动画长度。在这种情况下播放模式将映射之前的时间采样。这个值通常从0到无穷(大)
//倒回步行动画
动画的权重
这是为了一个曲线计算混合权重
权重被分配以至于顶层获取任何一切。如果它没有使用全部权重以至于下一层获取其余权重的分配等等。一旦全部的权重通过顶层被使用,底层的Unity将没有权重可以用,这意味着,如果一个底层在已经消耗50%时还想(使用权重)消耗80%,这层将不会用尽全部的权重。反而将会消耗50%中的80%。
例如:上体受到和的影响,下体只受到和权重名的影响
混合权重会改变每一个动画的值由于混合。即使没有混合,有时曲线仅仅是没有定义。直到你想将混合权重增加到1。大多数时权重曲线之间是相似的。
//设置步行动画的混合权重为“0.5”
动画的循环模式
通过设置wrapMode(循环模式)的缺省值,设置(动画组件)为循环模式。
//设置步行动画的循环模式为loop(循环)
&添加混合(转换)
添加一个动画转换(这个转换应该为动画)。这是让你减少一定数量必要创建的动画。
例如,可能你有的挥手动画。可能你想去操纵挥手动画在一个闲置的角色或在一个正在步行的角色上。或者你不得不创建2个挥手动画,一个给闲置(角色),一个给正在步行的(角色)。通过使用混合挥手动画,将会完全控制臂膀。但是下肢(下体)将不会受到控制,并且继续在空闲或步行动画运动。因此你只需要一个挥手动画。
如果循环为真(true),全部的混合转化也将变为子动画。如果你没有调用,全部动画曲线将被使用。
///添加混合转换,使用另一种路径
另一个例子所使用的路径
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&于飞&翻译&unity脚本手册
于飞新浪微博
于飞 unity3d微信公共平台
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。Unity 动画系统获取Animator中动画的方法与区别 - 简书
Unity 动画系统获取Animator中动画的方法与区别
一般在Unity中动画的表示可以用state也可以用clip,state侧重于状态机,而clip侧重于动画片段。而我们在获取中一般常用的有三个方法。
AnimationClip an = ani.runtimeAnimatorController.animationClips[0];
//获取该animator的所有的clips,后边的下标可以获取指定索引值的clip,
下标是根据加入的前后顺序 去判断的,这个是不区分层级,不区分动画的状态
animator.GetCurrentAnimatorClipInfo(0);
//参数是表示层级,获取当前层级播放的动画,返回一个数组,
只有在获取到的是blendtree的时候数组长度才会是&1的(blendtree中正在播放的动画有几个这个长度就是几)
ani.GetCurrentAnimatorStateInfo(0);
//参数是表示层级,返回的当前层级正在播放的动画的状态机
上边的三个方法比较容易理解,在这里我就不做过多解释了,下边给大家提一个问题,当两个动画状态机之间有连线,当这个动画播放到两个动画的融合处的时候,那此时animator.GetCurrentAnimatorClipInfo(0)获得长度是1还是2呢?如下图这种情况
Paste_Image.png
Paste_Image.png
我也是偶然才涉及到了这个问题,因为我想在播放stand的时候把stand到rest之间的trigger设置为true,我把是否有退出时间也勾掉了,根据上边的Debug.Log("Times")刚开始以为会输出一次,但是经过测试却发现他输出了4次,郁闷好久,但是后来经过测试,发现其实ani.GetCurrentAnimatorStateInfo(0)的这个方法在动画播放到上图椭圆中的那个状态的时候用该方法获取的还是stand这个state,而animator.GetCurrentAnimatorClipInfo(0)这个方法在获取的长度一直为1,这其中就表明了在动画播放到椭圆的区域中时,用这两种方法获取的有且只有一个state,那就是上一个state,上边我写的那个方法在我们把trigger设置为true的时候他会立马进入到椭圆部分区域,而Times输入了四次这个其实是跟他们融合部分的长度有关
Paste_Image.png
此时的Times只输出了一次
Paste_Image.png
这里Times输出了3次,这个大家可以去测试。
而上边的问题怎么完美解决呢?这是我写的代码在里边加了一个开关。
if (ani.GetCurrentAnimatorStateInfo(0).IsName("stand"))
if (!IsSetRest)
ani.SetTrigger("Rest");
Debug.Log("Times");
IsSetRest =
除了这个办法我们还可以通过另外一种方式去设置ani.GetNextAnimatorStateInfo(0),我们当前状态机后边只连了一个动画的时候用IsName(string Name),如果后边跟了多个动画我们可以用IsTag(String Tag)这两个方式来进行判断,当然这种也是有限制的,比如当前状态机运行两个动画融合的部分才可以,否则ani.GetNextAnimatorStateInfo(0)为空,所以有的时候就需要我们去判断是否把Has Exit Time勾去掉,这里就不写代码了。
Paste_Image.png
这个就是写动画标签的地方。
个人只见,有些地方可能有BUG,欢迎大家指出。
在Unity3D的当前版本中,Animator Controller已经全面取代了原来(大概是4.x版本左右)的Animation系统。 从本质上来说,Animator Controller是一个内置在Unity3D中的,专门用于动画控制的“状态机”,所以学习Animato...
Unity3D 的 Mecanim 动画系统可以直接复用 3DS MAX 中制作的动画文件中的位移,这个就是通过 applyRootMotion 来达成的,我们只需要在使用 Animator 控制动画播放的同时,设置 Animator 的 applyRootMotion 字...
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/ 在手机上去实现一些动画效果算是件比较炫酷的事情,因此Android系统在一开始的时候就给我们提供了两种实现动画效果的方式,逐帧动画(frame...
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金相信有很多朋友...
Description Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. For example,If n = 4 and k = 2, a s...
嗯,是的,我是应届生,七月大学毕业,自从答辩那天结束后,就是小伙伴们陆陆续续的聚餐,喝酒,然后一个一个送走相处四年的同学,接着自己又被别人送走,回到了家后,呆坐在床上,手足无措,不知道该做什么,慢慢的,我开始慌了。 上一次这样的情景还是在我几年前高考结束之后,你懂的,&分分...
林花春红匆无痕 残垣断壁不见人 缘来一笑未留意 回首已是百年身
全文 2304 字 | 建议阅读 5 分钟 最近,要到国庆了,基本上游泳馆的人已经很少了,国庆完了,应该就会更少。 不过,这时,才是进阶的开始,正所谓秋冬游泳的人才是真爱游泳。 现在,大家有点过于强调创造力了,其实,为了能多一点创造力,增加更多的体同样重要。 换个角度,如果...Unity 模型动画导入时如何获得 AnimationClip? - 知乎有问题,上知乎。知乎作为中文互联网最大的知识分享平台,以「知识连接一切」为愿景,致力于构建一个人人都可以便捷接入的知识分享网络,让人们便捷地与世界分享知识、经验和见解,发现更大的世界。7被浏览<strong class="NumberBoard-itemValue" title="分享邀请回答1添加评论分享收藏感谢收起1添加评论分享收藏感谢收起写回答挨踢民工生涯
Unity中有两种Animation Clip
在Unity中,我们有两种方法创建Animation Clip。
一种(后面简称方法一)是选中挂载了Animation组件的GameObject,在Animation窗口中点击Create New Clip创建出来的Animation Clip。
另一种(后面简称方法二)是在Project窗口的空白地方右键单击,选择Create-&Animation创建出来的Animation Clip。
这两种方法创建出来的都是.anim文件,但是在使用上却有点不一样。
选中方法一创建的.anim文件,Inspector窗口只有一个Wrap Mode选项。
而方法二创建的.anim文件的Inspector却比较复杂。
如果将Inspector切换为Debug模式,
可以看到方法一的.anim文件的Animation Type是1,
而方法二的.anim文件的Animation Type是2。
两种.anim文件都可以拖拽进GameObject身上挂载的Animation组件中,
也都可以在Animation窗口中编辑。
但是如果将方法二的.anim文件拖拽进Animation组件,并作为组件的默认Clip的话,那么游戏运行的时候这个Clip其实是播不出来的,而且Console会报一条“The AnimationClip 'XXX' used by the Animation component 'XXX' must be marked as Legacy.”的警告信息,以及一条“Default clip could
not be found in attached animations list”的提示信息。也就是说方法二的.anim文件其实似乎不能直接用在Animation组件中。
但是方法二的.anim文件却可以拖拽进Animator窗口,作为Animator Controller的一个状态(需要先创建一个Animator Controller),当GameObject身上挂载着Animator,并且Animator引用了这个Animator Controller的时候,这个动画是可以正常播出的。
而方法一的.anim文件却无法拖拽进Animator的窗口。也就是说方法一的.anim文件似乎不能用在Animator中。
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!Unity3D游戏开发之详解 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.这样动画就会正常保持上一帧的采样直到你要停止播放动画。
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!

我要回帖

更多关于 unity animation.play 的文章

 

随机推荐