
Unity3D的动画播放实际上都是通过AnimationState来进行控制的,Animation组件中提供的CrossFade,Play等方法其实就是将一系列对AnimationState参数进行设置的 *** 作进行了封装。
其中主要相关的参数有四个:
layer: 该动画片段(AnimationClip)所在的播放层次。
weight: 该动画片段在动画混合中所占的权重(0~1)
enable: 该动画片段是否进行播放
编,程,回,忆,录,之unity3d
blendMode: 混合方式,有两种Blend和Additive
默认初始化情况下Animation组件中的全部AnimationState的layer=0,weight=0, enable=false。Animation组件默认播放的AnimationState的layer=0, weight=1, enable=true。
我们可以使用Unity自带的资源来学习老版本的动画系统,新建Unity3D项目,选择菜单“Assets”->“Import Package”->“Character Controller”,导入的资源里的那个小人就是使用Legacy动画系统的模型,我们的学习可以基于他来进行。
在骨骼这一项中,我们发现动画类型的设置就是Legacy,说明这个模型使用的动画类型为老版本的动画系统。
我们再看看动画页:
动画页中,我们可以对动画剪辑进行编辑。
我们直接将FBX文件拖入场景,Unity会自动帮我们添加Transform和Animation两个组件(注意Mecanim动画系统使用的是Animator组件,Legacy动画系统使用的是Animation组件)。
Animation组件的设置还是比较简单的:
Animation:当前播放的动画。
Animations:所有可以播放的动画。
Play Automatically:是否自动播放。
Animate Physics:动画是否和物理世界进行交互。
Culling Type:动画在不可见时是否还继续播放,优化选项默认即可。
点击播放按钮就可以看见动画正常播放了。
animation组件用于播放动画;
如果想播放一个简单的动画,可以使用AnimationPlay;
如果想在动画之间交叉淡入,可以使用AnimationCrossFade;
如果想改变动画模式(循环,一次,乒乓),可以改变动画导入设置里面的动画帧的WrapMode,或者在运行时改变AnimationStatewrapMode的值;
AnimationState可以用于改变动画的层,修改播放速度,并且直接控制混合与合成。
下面我们来看看如何使用脚本控制动画的播放,我们将下面的脚本绑定到人物身上即可。
using UnityEngine;
using SystemCollections;
public class AnimationScript : MonoBehaviour
{
private Animation _animation;
void Start()
{
_animation = thisanimation;
}
void OnGUI()
{
//直接播放动画
if(GUIButton(new Rect(0, 0, 100, 30), "idle"))
{
_animationPlay("idle");
}
if(GUIButton(new Rect(100, 0, 100, 30), "walk"))
{
_animationPlay("walk");
}
if(GUIButton(new Rect(200, 0, 100, 30), "run"))
{
_animationPlay("run");
}
if(GUIButton(new Rect(300, 0, 100, 30), "jump_pose"))
{
_animationPlay("jump_pose");
}
//使用融合来播放动画
if(GUIButton(new Rect(0, 30, 100, 30), "idle"))
{
_animationCrossFade("idle");
}
if(GUIButton(new Rect(100, 30, 100, 30), "walk"))
{
_animationCrossFade("walk");
}
if(GUIButton(new Rect(200, 30, 100, 30), "run"))
{
_animationCrossFade("run");
}
if(GUIButton(new Rect(300, 30, 100, 30), "jump_pose"))
{
_animationCrossFade("jump_pose");
}
}
}
运行程序,会看见两排按钮,其中第一排按钮使用Play方法来切换动画,而第二排按钮则使用CrossFade来播放动画。
以从跑步切换到站立动画为例来看:
Play:直接切换动画,如果人物之前处于倾斜跑步状态,则会立即变成站立状态,表现上比较不真实,特别是当两个动画姿势差别较大时。
CrossFade:通过动画融合来切换动画,第二个参数可以指定融合的时间,如果人物之前处于倾斜跑步状态,则会在指定的融合时间内逐渐变成站立状态,表现上接近真实的人物动作切换效果。
但是当使用CrossFade播放跳跃动画时会出现问题,主要问题是跳跃动画不是循环播放且其持续时间小于动画融合的时间,我们修改为下面的脚本指定融合时间短一点就可以正常进行跳跃的融合播放了:
_animationCrossFade("jump_pose", 01f);
该方法可以指定当当前的动画播放完毕后接下来播放的动画,如下:
_animationPlayQueued("run", QueueModeCompleteOthers, PlayModeStopSameLayer);
Avatar 设置使用的骨骼节点映射。
_pply Root Motion 应用根节点运动。如果不启用,动画播放时根节点会保持在原地,需要通过脚本控制物体的移动。如果启用,如果动画中有运动,动画中的运动会换算到根节点中,根节点会发生运动。(通常用于人物/动物的运动动画)
_pdate Mode 设置Animator更新的时机以及timescale的设置。
_ormal Animator按正常的方式更新(随着Update调用更新,timescale减小时,动画播放也会减慢,timescale的具体含义和用法后续会详解)
_nimate Physics Animator会按照物理系统的频率更新(根据FixedUpdate调用更新,后续会详解),适用于物理交互,例如角色加上了物理属性可以推动周围的其他物体。
_nscaled Time 根据Update调用更新,无视timescale。一般用于UI界面,当你使用timescale暂停游戏时,界面保持正常动画。
Copyright © 1999-2020, CSDNNET, All Rights Reserved
Animation
打开APP
陈言必行
关注
Unity 动画系统—动画片段设置 原创
2017-08-24 11:47:27
1点赞
陈言必行
码龄5年
关注
动画片段设置
在Unity的Mecanim系统中可以对不同的动画片段进行动画融合和动画过渡等 *** 作,这就要求需要有循环质量比较高的动画片段来保障动画的效果。Mecanim提供了一些工具和属性,对于动画片段的循环进行监测和优化调整。
在Project面板中选中一个动画模型,在Inspector面板中的Animations标签下,可以选中一个动画片段。则在下面显示了针对此动画片段所对应的动画循环的属性监测。在此属性编辑器中,提供了一些显示,来描述其动画片段的各种循环质量的参数。如图所示。
分别有4个属性设置:
Loop Time,勾选这个选项之后,如果Animator处于播放这个动画状态时,在播放完第一遍这个动画片段之后,会自动循环从起始帧再次开始播放动画,如此循环往复。如果我们不勾选这个选项,例如Animator一直处于播放这个动画的状态,那么动画会定格在动画的结束帧,直到我们通过Animator切换这个Animator状态机的状态,切换到其他的动画
Loop Pose用于控制动画循环播放时,从结束帧切换到起始帧时,动画的动作可以无缝的衔接上,
Cycle Offset就是用于控制循环的时候起始帧偏移用的
Root Transform Rotation 根旋转变换
Root Transform Position (Y) 根位置变换(Y)根节点位移信息(Y轴)
Root Transform Position (XZ) 根位置变换(XZ) 根节点位移信息(水平面,XZ轴)
(注:Original是角色原始位置,Center of Mass为角色重心在y轴的投影位置)
以上4个属性分别匹配的非常好时(即动画的起始帧与结束帧比较吻合),右面对应的等会呈现绿色。
第一种方法:在动画结束帧后面加个动画事件,调用下含这个变量的函数接口不是可以了?
如图,找到动画的inspector面板,在里面有个Events下拉条,下拉后在想要的帧的位置添加事件函数,函数名字记得在使用这个动画的物体的脚本里面写好,否则会报错
第二种方法:试试animator上面那个 exit time
第三种方法:
//获取动画层 0 指Base Layer
AnimatorStateInfo stateinfo = animatorGetCurrentAnimatorStateInfo(0);
//如果正在播放walk动画
if(stateinfoIsName(;Base Layerwalk;))
{
}
你需要获取当前animator所处在的动画状态,即使它处于idel状态也应当播放idel动画,你可以获取当前动画控制器处于哪个动画状态,正在播放哪些动画剪辑Animatoranim;AnimationInfo[]AnimationInfoArr;voidGetCurrentAnimationName(){anim=GetComponentlt;Animator;();AnimationInfoArr=animGetCurrentAnimationClipState(0);foreach(AnimationInfoainAnimationInfoArr){DebugLog(aclipname);}}
先获取Animator 组件,该组件中有个方法Play("动画名");在外面套上一个 if 判断,判断按钮是否被点击。就OK了,如果你用的是过渡动画的话,在这个地方添加过渡条件就行了,
添加过渡条件之后依然要先获取Animator组件,然后setBool("条件名",true)。当然还有一些方法可以使用,希望以上的这两个方法可以帮到你
以上就是关于求帮忙unity全部的内容,包括:求帮忙unity、Unity中的Animation组件(一)、unity修改动画节点所在时间点等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)