unityunity3d animationnState和animationclip的区别

程序写累了,就来玩玩酷跑小游戏吧,嘿嘿。
雨松MOMO送你一首歌曲,嘿嘿。
Unity3D研究院之在项目中使用Unity4新Mecanim动画(五十三)
Unity3D研究院之在项目中使用Unity4新Mecanim动画(五十三)
围观101858次
编辑日期: 字体:
Unity4的Mecanim动画很早以前就有体验过,迟迟没有加到项目中有两个原因,今天写这篇博客来记录我在做的过程中遇到的一些问题。
1.以前的代码代码量比较多,修改起来动的地方太多了。
2.使用Mecanim动画,还得需要美术的动画做配合才行。
在3.x中播放动画的时候使用Play()或CrossFade(),直接播放动画 或淡入淡出播放动画。
animation.Play("name"); animation.CrossFade("name");
也可以使用队列播放,让动画形成一个队列。
animation.PlayQueued("name"); animation.CrossFade("name1");
我举一个我现在项目的例子。主角攻击敌人是一套连招,连招一共分为4套动画。也就是当玩家连续按下4次攻击键时这四套动画是连续播放的,假如玩家只连续按下2次攻击,可能只会播放前两套动画。代码中你需要判断其中某个动画是否播放完毕,只有播放完毕才能继续播放下一个动画。
if(animation.isPlaying)
if(animation.IsPlaying("attack1"))
大家在仔细想想这个命题,我们可以把动画分成4中可能的队列,也只可能分为这几种队列。
站立动画- 》攻击动画0 -》站立动画
站立动画- 》攻击动画0 -》攻击动画1 -》站立动画
站立动画- 》攻击动画0 -》攻击动画1 -》攻击动画2-》站立动画
站立动画- 》攻击动画0 -》攻击动画1 -》攻击动画2-》攻击动画3-》站立动画
此时如果用unity3以前的动画方式,无非就是上面这几种方法加上一些逻辑判断完成。现在Unity4加入了Mecanim动画,可以很好的帮我们解决这个问题。详细的动画使用教程我就不多说了,网上已经有很多人写过了。
如下图所示,以前我们在使用模型的时候。一个原始模型,原始模型中没有动画。然后是动画模型,每一个动画都会依赖原始模型。动画的名称末尾用 名称 + @name来表示。 这样的做法使用起来非常方便,但是由于每一个动画都会依赖原始模型所以文件会非常大。
Unity4已经将默认模型与动态导入的类型做了修改,你会发现你的模型拖拽入Hierarchy视图中没有Animation组件而是Animator组件。如果你还是想在Unity4中使用以前的动画系统。你需要把每个模型和动画的类型改成 Rig-& Animation Type -& Legacy,如下图所示。
手动的改起来会非常的累。建议你将下面这条脚本放在项目Editor文件夹下(没有创建一个)。这样当你将模型或动画拖入Project视图中,程序会自动帮你修改它的类型,显然Unity已经不建议大家继续使用以前的动画系统了。
12345678910
using UnityEditor;&public class MyEditor : AssetPostprocessor{&&&&public void OnPreprocessModel()&&&&{&&&&&&&&ModelImporter modelImporter = (ModelImporter) assetImporter;&&&&&&&&
modelImporter.animationType = ModelImporterAnimationType.Legacy;&&&&}&& }
下面开始说说新的动画。在Animations选项卡中先勾掉Import Animation 点击Apply。如下图所示,在Rig选项卡中修改Animation Type的类型为Humanoid。 如果你希望现在选择的这个模型做为标准模型的话,在Avatar Definition中选择Create From This Model。点击下方的Configure可以预览你的骨骼。
让美术修改一下以前的动画,将动画中的原始模型去掉,这样还可以减少文件的大小。然后在Porject视图中找一个原始模型拖拽入右侧Preview中,可以看到这个模型已经播放奔跑动画。
此时换一个模型拖入同样可以预览奔跑效果。
如下图所示,在动画的.fbx中 因为动画需要用刚刚生成的骨骼。所以这里Avatar Definition中你需要选择Copy From Other Avatar 。在Source中选择刚刚生成的Avatar 以后所有动画都需要这样来设置。。
下面我们来让这个女模型和男模型共用男模型的那一套动画,在游戏视图中播放。在Project视图中选择Crate-&AnimatorController。然后把Project中男模型和女模型都拖拽入Hierarchy视图中。 将刚刚创建的AnimatorController放置在Controller处。
此时在Unity导航菜单栏中选择Window -》 Animator。 将动画文件拖入Animator窗口中,你会发现两个模型都开始发生运动。如下图所示,黄颜色表示它为原始动画,也就是根动画。用箭头将它们一一前后相连,箭头实际上就是动画播放的条件。请注意看图中两个蓝色的箭头,A播放完后将会播放B动画,可是B却对应了两个箭头,也就是说B播放完后可以播放C也可以回过头来播放A。
那么B播放完到底是播放C还是播放A呢?用鼠标点击一下箭头,看看这这两个箭头的条件吧。分别点开BA 和BC的两个箭头,在右侧监测面板视图中你都会发现Conditions下有一个Exit Time的条件。根据动画的不同对应数值也会不同,我的数值是0.94。也就是当B动画播放0.94s后将播放下一个动画。默认BA和BC的动画时间是一样的,Unity会有限选择下一个动画,也就是A -》 B-》-》C-》D-》A这样循环播放下去。假设我现在需要动画是 A-》B-》A这样循环播放,只需要修改一下BA箭头的条件,将Exit Time改小一点只要比BC箭头上的小就可以。。 其它的播放虚列原理类似。。
接着还有问题了,用时间来做动画切换的条件是不是有点太限制了。Animator还支持自定义条件,在Animator窗口的左下角处,点击“+”按钮就可以添加变量。这里我添加三组变量, float 、int、bool。
变量添加完毕后,继续点击箭头的条件,箭头上可以有一个条件 或者多个条件。如果是多个条件需要多个条件同时满足才可以。 Conditons左键是变量名称,中间是变量条件,右边是变量值。
Greater 表示左边变量大于右边时触发
Less 表示左边变量小于右边时触发
Equals 表示左边变量等于右边时触发
NotEquals表示左边变量不等于右边时触发。
int 变量上述四种都有,float变量只有Greater 和Less, bool变量只有true和false。
此时我们在加深一下理解。选择AB的箭头,也就设置A动画切换B动画的条件。
5 表示 当ft的值大于5的时候触发。
3 表示 当 it的值小于3的时候触发。
表示 当ib的值等于true的时候触发。
只有上述三种条件全部达成时将A动画将切换播放B动画。否则将一直停留在播放A动画处。
那么ft it ib的这三个变量到底在那里设置呢?如下图所示,才记得前面我们创建的三个变量吗? 这三个变量对应的值就是右边的 0.0 0 false 。在编辑器中你可以通过修改这三个数值来满足播放动画的条件。可是在代码中怎么办呢?
在代码中你可以这样来设置或变更它们的条件。 如果说你需要在程序中判断当前动画的一些信息,可以使用 GetCurrentAnimatorStateInfo(0),我查了一下Animator不能直接拿到当前播放动画的名称, 只能拿到它对应的Has值,也就是说你需要将原始的动画名称转换成Hash来判断。
1234567891011121314151617181920212223242526272829303132333435363738
using UnityEngine;using System.Collections;&public class NewBehaviourScript : MonoBehaviour {& private Animator animator ; void&&Start() {
//得到Animator对象
animator = GetComponent&Animator&(); }& void OnGUI() {
if(GUILayout.Button("play",GUILayout.Width(50)))
&&&&//在这里设置变量的条件
animator.SetFloat("ft",6f);
animator.SetInteger("it",2);
&&&&animator.SetBool("ib",true);&
} }& void Update() {
AnimatorStateInfo animatorState = animator.GetCurrentAnimatorStateInfo(0);&
if(animatorState.IsName("Base Layer.Run_FastStop_Idle"))
Debug.Log("动画相等");
Debug.Log("动画不等");
另外Mecanim还支持多个动画的混合。目前Mecanim还有一个最大的难题,也是文章最上面我说的需要美术配合的那部分。之前我们看到的动画都是应用于人型模型,也就是说它支持人形的骨骼, 举个例子我们的项目人和武器是两个骨骼,这样在用Mecanim就悲剧了。因为不同模型武器的骨骼不一样所以公用模型的话会出现武器位置不对的情况。最后我想到的办法就是美术将以前做的武器骨骼重新导出,每个人对应一套自己武器骨骼(或者一些特殊的骨骼)最后生成武器的动画 ,比如 站立动画、攻击动画、死亡动画等。当Mecanim播放动画的时候,同时在播放该模型对应的武器动画,我想这样就可以解决这个问题吧。。
最后欢迎大家一起讨论。。
今天有朋友QQ上问了我已下,是不是非人形动画还得使用老的动画系统?如下图所示,当你把模型导入Unity的时候,这里可以选择它的类型。
legacy:是老的动画系统,这里就多说了。
Generic:是新的动画系统,它就是支持非人形的动画,建议使用它。但是它不能向Humanoid重定向动画。
Humanoid:就是新的人形重定向动画系统。
本文固定链接:
转载请注明:
雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。
您可能还会对这些文章感兴趣!
Pingback 引用通告:
Pingback 引用通告:
Pingback 引用通告:
Pingback 引用通告:
Pingback 引用通告:
Pingback 引用通告:
Pingback 引用通告:24405人阅读
Unity3D(6)
游戏开发(10)
原文链接:
用Unity3D也算是好久了,但是每次做项目总还是能学到新的东西。这次做一个TPS的项目就遇到了这样一个问题,如何同时在上下半身播放不同的动画?解决方法其实是很简单,但由于对于动画资源的了解不足导致问题不断,最后是彻彻底底的研究了一遍Unity3D的动画系统(Legacy),虽然4.0出了新的动画控制系统,使用了一下功能相比原来确实强大不少,但还是将这次对于原先的动画系统的学习总结记录下来,毕竟这些动画的概念与策略是通用的,而且因为4.0在mac上目前貌似还没有破解所以项目还是得在3.5上做。相信对于深入理解新的动画系统也会很有帮助。
一、Unity3D动画系统相关类
1.1 AnimationClip
AnimationClip是Unity3D中播放动画的最基本对象,通过FBX导入的各个动画对象其实就是一个AnimationClip。这个类已关键帧的形式记录了骨骼关节在各个时间节点上的位置、旋转信息,根据帧频率frameRate结合播放模式wrapMode通过插值计算即可播放出连续的骨骼动画。
1.2 AnimationState
每个AnimationState包含了一个AnimationClip,并记录这个动画片段的一些播放控制属性,实际上是一个AnimationClip的包装器。
其中比较重要的参数有layer,weight, enabled, speed, blendMode这几项。这些参数的具体含义将在自定义混合动画控制中详细解释,在简单的动画控制时并不需要对AnimationState进行直接操作。
1.3 Animation
Animation是Unity3D的动画播放控制组件,包含了一系列的AnimationState对象,提供各种动画播放及控制方法。常用方法有Play(), CrossFade(), Stop()。在脚本中通过animation即可直接引用同一物体上的Animation控件。
二、简单动画播放控制
所谓简单动画播放控制就是同一时间只有一个动作,比如Standard Assets中的那个水管工,静止idle,走walk,跑run,跳跃jump,攻击attack这些动作都是全身动作,同一时间只应该做一种动作,只有在动作切换时需要将两种切换动作进行混合以达到平滑过渡的效果,以上的操作使用Animation提供的CrossFade()方法即可达到。无论是CrossFade还是Play理论上都只需要在切换动画时调用一次即可,当然重复的调用并不会影响动画的播放,当Unity3D检测到当前播放的动画与函数调用使用的动画一样后会忽略该次调用。
三、自定义混合动画控制
3.1 多动画同时播放的需求
在大多数情况下简单的动画播放控制已经足够,然而当游戏变得复杂时,单动画播放带来的问题就是美术工作量的急剧增加。
最为典型的就是第三人称射击(动作)游戏,通常来说游戏中的人物会有各种上身动作如瞄准、射击、换子弹等,而下身则对应站立,行走(通常还是四个方向的行走动作)。这时候如果只能播放一个动作的话就需要美工制作大量的动作(站立瞄准、站立射击、跑步瞄准、跑步射击等等),其工作量可想而知。显然,最为效率的方式是美工分别做出上半身以及下半身的动作,然后由程序根据游戏角色的操作将两者动作混合起来同时播放。而这就涉及到了多动画同时播放的需求。此时简单的CrossFade()方法已经不能满足了,我们需要通过AnimationState来对动画播放进行自定义的控制。
3.2 使用AnimationState控制动画播放
Unity3D的动画播放实际上都是通过AnimationState来进行控制的,Animation组件中提供的CrossFade,Play等方法其实就是将一系列对AnimationState参数进行设置的操作进行了封装。
其中主要相关的参数有四个:
layer: 该动画片段(AnimationClip)所在的播放层次。
weight: 该动画片段在动画混合中所占的权重(0~1)
enable: 该动画片段是否进行播放
blendMode: 混合方式,有两种Blend和Additive
默认初始化情况下Animation组件中的全部AnimationState的layer=0,weight=0, enable=false。Animation组件默认播放的AnimationState的layer=0, weight=1, enable=true。
一、Unity3D动画播放策略
Unity3D在进行动画播放时按照下面的策略进行:
1.找到最高一层的全部AnimationState
2.将其中enable为true且weight & 0的AnimationState中的clip加入混合池(虚构的一个概念)
3.如果当前混合池中全部blendMode为Blend的clip的权重相加少于1,则找到下一层的全部AnimationState。重复2.
4.对混合池中的全部clip进行混合操作,生成最终的动作。
在进行最终混合时所有clip的实际权重会进行归一化处理,即相加为1,处理时根据blendMode的不同结果也会有所差异,下面的例子会进一步说明。
二、使用AnimationState控制播放的实例
举几个实际的例子对Unity3D的动画混合策略进行说明。对于AnimationState的设置全部放在Start或Awake中进行。并且注意把Animation组件中的默认播放动画设为None,取消选中Player Automatically,原因正如前文所述,默认播放的AnimationState参数初始值与其他State不同,会对实验造成影响。
1. 同一层动画的混合播放
AnimationState right= animation[“run_right”];
AnimationState idle= animation[“idle”];
right.layer = 1;right.weight = 1; right.enable =
idle = 1; idle.weight= 1; idle.enable =
&运行结果是角色动画介于行走与静止之间,体现两个动画1:1的混合效果
2. 高层动画覆盖下层动画
&right.layer = 1; right.weight = 1;right.enable =
idle = 0; idle.weight = 1; idle.enable =
&运行结果是角色行走
3. 高层动画与下层动画混合
right.layer = 1; right.weight = 0.5f; right.enable =
idle = 0; idle.weight = 1; idle.enable =
运行结果与1相同,idle的实际weight为1 * (1 – 0.5f)
4. 使用Additive混合不同层动画
right.layer = 1; right.weight = 1; right.enable =
right.blendMode = BlendMode.A
idle = 0; idle.weight = 1; idle.enable =
&运行结果与1相同,idle的实际weight为1/(1+1)
三、其他的动画播放控制参数
speed: 控制动画播放速度,比如调整射击速度就是将该值提高
time: 当前动画所在时间点
warpMode: 动画循环方式,有一次、循环、镜像循环PingPong
3.3 自定义动画过渡
动画过渡实际上就是两种动画混合权重的过渡,前一种动画的权重由1渐变为0,后一种由0变为1,由此实现动画的平滑过渡。在实际操作时,并不需要过渡时在Update()中每帧去调整两种动画AnimationState的权重weight。Animation控件提供了Blend()方法帮助在后台自动计算这种过渡,其使用方法与CrossFade类似,详见Unity3D的script手册。
3.4 Play(), CrossFade()背后的操作
了解这些基本方法背后进行的操作在同时使用AnimationState对动作进行控制时十分有用。
首先是Play(stringanimationName)(Play() = Play(default Animation name))这个方法实际上是将animationName所在层的全部其他AnimationState的weight置为0,enable置为false,将animationName的weight置为1, enable置为true。
CrossFade()与Play()大致相同,只不过他并不直接将其他的AnimationState的weight置为0,而是调用Blend()方法将其向0进行渐变,一旦该AnimationState的weight变为0再将其enable设置为false。
由此可见,当你设置了多层AnimationState后,仅仅调用这两个方法很可能并不能达到你想要的动画控制效果。当然,这两个方法最后有一个默认参数PlayMode来调整执行策略(区别就在于操作对象仅仅在该层还是全部AnimationState对象),总之这一节通过阐述Play与CrossFade背后的操作,希望使我们在使用AnimationState进行混合动画控制编程时能够正确的使用这两个方法以达到期望的效果。
3.5 局部动画
以上所介绍的AnimationState操作只是多动画的手动播放及混合控制,还并没有涉及到如何向开头所讲的上下半身播放不同的动画。要在同一个角色上同时播放两个不同的动作使用局部动画即可。
一、生成局部动画
在Unity3D中有两种方式实现局部动画,一是使用AnimationState的AddMixingTransform方法,该方法传入一个骨骼节点的Transform,调用后该动画片段AnimationClip便只会影响该节点及其子骨骼,而对其他骨骼关节并不再影响。
另一种方法是在动画模型制作时就只对局部的骨骼制作动画,其他骨骼在整个动画片段中都保持不变,这样生成的动画片段AnimationClip中就不会包括对那些不变骨骼的关键帧信息,也就不会对其他骨骼关节进行影响。(这是我根据动画播放的实际控制结果进行的推测,在Unity3D的官方文档中好像并没有直接说明,仍需查证)
了解第二种方法十分重要,虽然还只是推测。因为在与美术沟通前你可能并不知道导入的是一个局部动画,而将其当成全身动画,使得在进行动画混合控制时产生了意想不到的结果。我在一次项目中发现明明角色应该进入idle状态,但是双腿仍然在跑动,为此花了两天时间查证,也是直接促成了这篇文章的诞生,最终发现原来美术给的idle只有上半身有动画,下半身没有,因此虽然idle比跑动高一层,但下半身并不能覆盖。
二、局部动画的混合
局部动画的混合策略与前述Unity3D动画播放策略相同,只不过只是影响局部骨骼。这也就是说,上半身与下半身的动画无论谁所在的层更高,权重多少都不会影响另外半身的动画播放。但是上层的半身动画会覆盖下层的全身动画或与之混合,而全身动画中不包含在半身动画中的骨骼则完全不受影响。
四、射击类游戏应用
参考Unity3.5的官方例子Angry Robot。在这个例子中很好的实现了上下半身的独立旋转,射击动作与跑步动作的半身分离。这一节以此作为样例进行分析。
动作资源:
run_forward,fun_backward, run_left, run_right。四方向的跑动,全身动作,全部置于第1层。
Idle。静止,全身动作,位于第2层。
Attack。攻击,半身动作,位于第4层。混合方式Additive
操作控制:
初始化,全部动作的weight置为1,Attack的enable置为false,其余为true。这样初始状态下Attack不播放,Idle覆盖跑动动作,角色表现为静止站立动作。
移动时将Idle的weight根据速度向0渐变,开放跑动动作。使用CrossFade()在四个跑动动作中选择合适的动作进行播放。停止时再将Idle的weight逐渐置为1,重新覆盖跑动动作。
攻击时将Attack的enable置为true,停止攻击时置为false。由于Attack动作在最高层,且混合模式为Additive,因此站立攻击时Attack动作与行走动作上半身进行混合,跑动攻击时Attack动作与跑动动作上半身进行混合。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:301870次
积分:4133
积分:4133
排名:第8729名
原创:112篇
转载:58篇
评论:72条
(2)(1)(1)(1)(1)(5)(10)(3)(1)(3)(2)(3)(1)(10)(6)(17)(6)(3)(2)(1)(11)(3)(6)(10)(6)(9)(4)(3)(5)(2)(7)(1)(2)(6)(6)(6)(2)(2)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'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微信公共平台
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。关于AnimationClip.AddEvent的问题【unity3d吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:77,209贴子:
关于AnimationClip.AddEvent的问题收藏
API里面的说明看不懂自己试验了一下,假如WrapMode是Once的话是不会触发AnimationEvent的方法的,改成Loop的话在跳回到第一帧的时候会触发现在我想做的效果是某个动画播放完毕以后执行某段代码应该怎么写呢谢谢各位大神!
江苏盘锦天燃气模温机,一台省得让你怀疑人生的燃气锅炉
帮你顶起~lz志向远大,可惜我帮不了你。。。。
public class example : MonoBehaviour { public IEnumerator Awake() {
animation.Play();
yield return new WaitForSeconds(animation.clip.length); }}animation.Play();// 等待动画完成
登录百度帐号推荐应用关于unity的animation的人物简单控制脚步
我的图书馆
关于unity的animation的人物简单控制脚步
Unity3D中Animation的常见属性及方法
[Actionscript3] 纯文本查看 复制代码12function Play (mode : PlayMode = PlayMode.StopSameLayer) : boolfunction Play (animation : string, mode : PlayMode = PlayMode.StopSameLayer) : bool
Play()将开始播放名称为animation的动画,或者播放默认动画。动画会突然开始播放而没有任何混合。如果模式是PlayMode.StopSameLayer,那么所有在同一个层的动画将停止播放。如果模式是PlayMode.StopAll,那么所有当前在播放的动画将停止播放。
如果动画已经在播放过程中,别的动画将停止但是动画不会回退到开始位置。
如果动画没有被设置成循环模式,它将停止并且回退到开始位置
如果动画不能被播放(没有动画剪辑或者没有默认动画),Play()将返回false。
[Actionscript3] 纯文本查看 复制代码1234567// 播放默认动画。animation.Play();// Plays the walk animation - stops all other animations in the same layer// 播放walk动画 - 停止同一层的其他动画。animation.Play("walk");// Plays the walk animation - stops all other animations// 播放walk动画 - 停止其他动画。animation.Play("walk", PlayMode.StopAll);
Animation.CrossFade淡入淡出
function CrossFade (animation : string, fadeLength : float = 0.3F, mode : PlayMode = PlayMode.StopSameLayer) : void
在一定时间内淡入名称为name的动画并且淡出其他动画。如果模式是PlayMode.StopSameLayer,在同一层的动画将在动画淡入的时候淡出。如果模式是PlayMode.StopAll,所有动画将在淡入的时候淡出。如果动画没有被设置成循环,它将停止并且在播放完成之后倒带至开始。
[Actionscript3] 纯文本查看 复制代码0102030405060708091011121314// Fade the walk cycle in and fade all other animations in the same layer out.// 淡入walk循环并且淡出同一层的所有其他动画。// Complete the fade within 0.2 seconds.// 在0.2秒之内完成淡入淡出。animation.CrossFade("Walk", 0.2);// Makes a character contains a Run and Idle animation// fade between them when the player wants to move// 让一个角色包含Run和Idle动画,并且在玩家想移动的时候在他们之间淡入淡出。function Update () {if (Mathf.Abs(Input.GetAxis("Vertical")) & 0.1)animation.CrossFade("Run");elseanimation.CrossFade("Idle");}
这里列出的最常见的播放动画的两种方法,还有其他方法属性大家自觉的去查下API吧。下面我放出自己写的人物简单控制脚步,包括上下左右移动。j,k攻击。
RoleScriptContorl.cs
[Actionscript3] 纯文本查看 复制代码001002003004005006007008009010011012013014015016017018019020021022023024025026027028029030031032033034035036037038039040041042043044045046047048049050051052053054055056057058059060061062063064065066067068069070071072073074075076077078079080081082083084085086087088089090091092093094095096097098099100101102103104105using UnityEusing System.C&&public class PlayerControl : MonoBehaviour {&&&&public static PlayerC&&&&private AnimationClip animationC&&&&private CharacterC&&&&public float runSpeed = 5;&&&&private float moveSpeed = 3;//走路速度&&&&private string currentState="";&&&&&&private GameO&&&&&&&&&&void Awake()&&&&{&&&&&&&&instance = this;&&&&}&&&&&&void Start ()&&&&{&&&&&&&&controller = GetComponent&CharacterController&();&&&&&&&&print(transform.forward);&&&&}&&&&&&&&&&&&void Update ()&&&&{&&&&&&&&KeyboardControl();&&&&}&&&&&&void KeyboardControl()&&&&{&&&&&&&&&&&&&&&&&&Vector3 forward = transform.TransformDirection(Vector3.forward);//从自身坐标转换为世界坐标&&&&&&&&&&&&&&&&&&&&&&if(Input.GetKey(KeyCode.W))&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&&&&&&if(Input.GetKey(KeyCode.LeftShift))&&&&&&&&&&&&{&&&&&&&&&&&&&&&&currentState = RoleAnimationState.RUN;//改变人物动画状态&&&&&&&&&&&&&&&&PlayAnimation(currentState);//播放动画&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&controller.SimpleMove(forward * runSpeed * Time.deltaTime*100);&&&&&&&&&&&&}&&&&&&&&&&&&else&&&&&&&&&&&&{&&&&&&&&&&&&&&&&currentState = RoleAnimationState.WALK;&&&&&&&&&&&&&&&&PlayAnimation(currentState);&&&&&&&&&&&&&&&&&&controller.SimpleMove(forward * moveSpeed * Time.deltaTime * 100);&&&&&&&&&&&&}&&&&&&&&}&&&&&&&&&&&&&&&&&&if (Input.GetKey(KeyCode.S))&&&&&&&&{&&&&&&&&&&&&Vector3 back = transform.TransformDirection(Vector3.back);&&&&&&&&&&&&currentState = RoleAnimationState.WALK;&&&&&&&&&&&&PlayAnimation(currentState);&&&&&&&&&&&&controller.SimpleMove(back * moveSpeed * Time.deltaTime * 100);&&&&&&&&}&&&&&&&&if (Input.GetKey(KeyCode.A))&&&&&&&&{&&&&&&&&&&&&Vector3 up = transform.TransformDirection(Vector3.up);&&&&&&&&&&&&transform.Rotate(Vector3.up * -50 * Time.deltaTime);&&&&&&&&}&&&&&&&&if (Input.GetKey(KeyCode.D))&&&&&&&&{&&&&&&&&&&&&Vector3 up = transform.TransformDirection(Vector3.up);&&&&&&&&&&&&transform.Rotate(Vector3.up * 50 * Time.deltaTime);&&&&&&&&}&&&&&&&&if (Input.GetKey(KeyCode.J))&&&&&&&&{&&&&&&&&&&&&currentState = RoleAnimationState.ATTACK;&&&&&&&&&&&&PlayAnimation(RoleAnimationState.ATTACK);&&&&&&&&}&&&&&&&&if (Input.GetKey(KeyCode.K))&&&&&&&&{&&&&&&&&&&&&currentState = RoleAnimationState.ATTACK01;&&&&&&&&&&&&PlayAnimation(RoleAnimationState.ATTACK01);&&&&&&&&}&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&if(currentState!=RoleAnimationState.IDLE && !animation.IsPlaying(currentState))&&&&&&&&{&&&&&&&&&&&&PlayAnimation(RoleAnimationState.IDLE);&&&&&&&&}&&&&&&&&&&&&&&&&}&&&&&&void PlayAnimation(string name)&&&&{&&&&&&&&currentState =&&&&&&&&animationClip = animation[name].&&&&&&&&gameObject.animation.CrossFade(animationClip.name);&&&&&&}&&&&&&&&&&}
下面是动画状态的一个脚本类
[Actionscript3] 纯文本查看 复制代码010203040506070809101112using UnityEusing System.C&&public class RoleAnimationState : MonoBehaviour {&&&&public const string IDLE="Idle";&&&&public const string WALK = "Walk";&&&&public const string RUN = "Run";&&&&public const string ATTACK = "Attack";&&&&public const string ATTACK01 = "Attack01";&&&&&&&&&&
TA的推荐TA的最新馆藏[转]&
喜欢该文的人也喜欢

我要回帖

更多关于 unity animation 教程 的文章

 

随机推荐