我们可以使用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);
主要有关节动画、单一网格模型动画(关键帧动画)、骨骼动画。 关节动画把角色分成若干独立部分,一个部分对应一个网格模型,部分的动画连接成一个整体的动画,角色比较灵活Quake2中使用了这种动画; 单一网络模型动画由一个完整的网格模型构成,在动画序列的关键帧里记录各个顶点的原位置及其改变量,然后插值运算实现动画效果,角色动画较真实。 骨骼动画,广泛应用的动画方式,集成了以上两个方式的优点,骨骼按角色特点组成一定的层次结构,由关节相连,可做相对运动,皮肤作为单一网格蒙在骨骼之外,决定角色的外观。皮肤网格每一个顶点都会受到骨骼的影响,从而实现完美的动画
骨骼动画有很多种 最有名的是spine live2d Unity商店里也有很多类似的骨骼插件 你要先找到这个游戏到底是用什么方法做的骨骼 再去查相关的文件
每一家基本上都那几样东西 一个json记录了骨骼的位置信息 一个png图集 上面有所有的相关 但是具体怎么还原到工程里 还是要看用什么软件制作的
之前的代码也繁琐了。
animation本来就可以通过transformanimation 来访问。如果是在脚本代码中,可以直接用animation来访问animation组件。 默认的基础类都是这个特性,比如rigidbody、renderer等等这些一样,你既可以通过rigidbodytransform来访问其transform,也可以通过transformrigidbody来访问rigidbody,前提是确实该组件,否则为null。
现在的版本animation 一样可以使用,比较重大的改变是不再具备通过动画编辑窗口来添加材质方面的动画,比如color 方面的动画,无法直接给material的相关参数添加关键帧建立动画曲线。
你只能通过给一个脚本的变量添加动画曲线,然后再在脚本中通过代码去关联该变量和color,间接做材质color动画 :
var a:float; //在动画编辑器中添加曲线改变alpha值
function Update(){
renderermaterialcolora = a;
}
unity4x版本保留了animation作为旧版本的动画组件,同时加入了Animator,也就是mecanim动画系统,这个系统是专门设计来应付生物属性的角色动画的,有更紧密、更复杂的混合系统,其编辑模式跟animation 截然不同!你需要通过animator动画状态可视化编辑器来搭建动画层级和状态图,再通过animator来播放预定义的状态,从而达到动画播放效果。也就是说,动画不再基于clip剪辑,而是state状态。
你可以去查看animator的官方脚本参考,你就知道他是怎么用的了。其实也差不多,原理不同,不能再用animation["clip name"] 来简单粗暴的 *** 作clip的参数了,现在改变播放速度、时间轴等 *** 作你都必须通过animator来调整相应state的播放属性,而不是像旧版直接去改变clip的参数。基本的播放也是用Play()、Stop()等,参数不同, 而且你要play的动画状态必须预先在编辑面板正确设置好!
如果你想继续使用旧版的animation做为导入动画剪辑,那你应该在导入的动画模型选项中选择使用旧版legacy animation,具体怎么写的记不得了,应该可以找到的。
以上就是关于Unity中的Animation组件(一)全部的内容,包括:Unity中的Animation组件(一)、unity3d播放动画有几种方法,各有什么特点、unity2D出包的游戏中骨骼动画包含哪几个文件如何提取和导入等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)