Unity在5.X以后,有一个旧版的动画系统和新版的动画系统。

新版的动画系统是使用Unity动画编辑器来调的,调动画和控制动画

旧版的动画系统是用其他的第三方软件调好后导出到一个FBX文件里面,就是一个FBX模型文件里面除了模型顶点,数据纹理以外,还有动画信息。美术会把所有与模型相关的动画全部做到一起。

旧版动画系统

1: 导入一个包含多个动画的模型文件;
2: 选中模型文件的Rig---->Animation Type---->Legacy模式
3: 根据美术给出的时间点,来分割动画;
4: Animation组件参数:
  (1)Animation 启用自动播放时,播放的默认动画;
  (2)Animations 可以从脚本的访问的动画列表;
  (3)Play Automatically: 是否自动播放
  (4)Animate Physics 动画是否与物理交互;
  (5)Culling Type 设置动画的剔除模型: Always Animate总是播放动画, Base On Renders 只有渲染在屏幕上的对象才会播放动画;

Animation组件不是动画,是播放动画的容器,真正的动画是Animation Clip,就是我们剪辑下来的子动画。在Animation组件的Animations属性里面。

代码控制动画的常用函数方法

1: Animation类的Play: 播放指定名称的动画;
2: Animation类的Stop: 停止播放指定名称的动画;
3: Animation类的CrossFade动画融合: 以融合模式来切换动画;
  (1) 动画融合能确保动画完美的过渡,两个动作之间不会有突然切换,比较柔和的切换;
  (2) 第一个参数下一个播放的名字, 切换的时间间隔, 淡入淡出的模式;
  (3)淡出的模式: PlayMode.StopSameLayer 淡入新动画时,只淡出与name同一层的动画,
           PlayMode.StopAll 淡入新动画时,淡出所有的动画;
4: 动画混合:
  动画混合能消减游戏创建动画数量,让一些动画只应用给身体的一部分,和其它的动画配合一起使用。一个挥手动画,空闲挥手,和行走挥手,如果没有动画混合,就要为这个挥手创建2个动画,一个是空闲的挥手,一个是行走的挥手。

  如果有动画混合,只要一个挥手的动画,然后把这个动画和空闲的状态混合,把这个动画和行走的状态混合,就可以得到两个动画。
  AddMixingTransform方法进行动画混合;

//例子
先说说Unity3D关于动画方便的东西,Animation Mixing (动画混合),什么是动画混合呢?举个简单的例子吧,一个模型现在又3种动作,分别是idle、walk、shoot,在Unity3D中一个Layer只能播放二种动画,shoot动作只影响左肩膀的骨骼,而不会影响腿部的动作,所有这里就可以把shoot和walk进行Mixing。

function Start ()
{ //增加一个动画剪辑片段 //
animation.AddClip(animation["shoot"].clip, "shootUpperBody");
animation["shootUpperBody"].AddMixingTransform(transform.Find("mover/gun"));
//@parm 路径
animation["shootUpperBody"].AddMixingTransform(transform.Find("mover/roothandle/spine1"));
//设置动画模式
animation.wrapMode = WrapMode.Loop; animation["jump"].wrapMode = WrapMode.Clamp;
animation["shoot"].wrapMode = WrapMode.Clamp;
animation["shootUpperBody"].wrapMode = WrapMode.Clamp; // Put idle and run in a lower layer. They will only animate if our action animations are not playing
animation["idle"].layer = -;
animation["run"].layer = -; animation.Stop();
} function Update () {
if (Mathf.Abs(Input.GetAxis("Vertical")) > 0.1)
{
animation.CrossFade("run");
animation["run"].speed = Mathf.Sign(Input.GetAxis("Vertical"));
}
else
animation.CrossFade("idle"); if (Input.GetButtonDown ("Jump"))
{
animation.CrossFade("jump", 0.3);
}
if (Input.GetButtonDown ("Fire1"))
{
if (animation["run"].weight > 0.5)
animation.CrossFadeQueued("shootUpperBody", 0.3, QueueMode.PlayNow);
else
animation.CrossFadeQueued("shoot", 0.3, QueueMode.PlayNow);
}

5:AnimationState类:可以用来打印当前播放的动画的参数,如动画的名字,长度,已经播放的时间。

6.AmimationEvent类:可以给子动画添加一个事件,就是在动画播放后多少时间time后再自动执行一个事件函数functionName。

播放和暂停

方法一:有些复杂

先播放动画:

animation.Play("Jump");

暂停跳跃动画:

pausetime=animation["Jump"].time;

animation["Jump"].Stop();

继续跳跃动画:

animation["Jump"].time=pausetime;

animation.Play("Jump");

方法二:很简单

先播放动画:

animation.Play("Jump");

暂停动画:

animation["Jump"].speed=0;

继续动画:

animation["Jump"].speed=1;

AnimationClip类

1: events animation clip所有的Animation Events .
2: frameRate Frame rate at which keyframes are sampled. (Read Only)
3: humanMotion Returns true if the animation contains curve that drives a humanoid rig.
4: legacy Set to true if the AnimationClip will be used with the Legacy Animation component ( instead of the Animator ).
5: length Animation length in seconds. (Read Only)
6: localBounds AABB of this Animation Clip in local space of Animation component that it is attached too.
7: wrapMode Sets the default wrap mode used in the animation state.

实例

1.创建Unity工程和文件目录

2.导入资源文件夹player,里面包含FBX文件(里面包含做好的动画信息)和PNG纹理贴图

3.进入Materials文件夹,选择材质球的shader为Mobile---->Diffuse,关联纹理贴图,再把材质球拖进模型中关联

4.查看做好的动画,点击FBX文件,在Animations栏,可以查看动画信息,美术把所有的动画都连在一起,做成一个长动画,是做到同一个轴上的,这个轴上包含了所以帧,可以播放。

5.点击FBX文件,在Rig栏,选择旧版动画模式Rig---->Animation Type---->Legacy模式---->Apply

6.剪辑动画,就是把整个的动画拆分成可以用的子动画,美术会告诉我们哪个动画是从哪一帧开始到哪一帧结束。点击"+",创建新的子动画,“-”删除子动画。

 还可以设置播放的次数,是循环播放还是只播放一次---->Wrap Mode---->Loop---->Apply。

7.把模型拖进场景中,会自带一个Animation组件,里面有相应的参数设置,Animation属性里面的内容表示的是启用自动播放时,播放的默认动画。

8.去掉勾选Play Automatically,使用代码来控制动画播放,创建一个脚本anim_test挂载在模型People节点下

打开anim_test

using UnityEngine;
using System.Collections; public class anim_test : MonoBehaviour {
private Animation anim;
// Use this for initialization
void Start () {
this.anim = this.GetComponent<Animation>();
this.anim.Play("idle");//播放idle动画 AnimationState anim_state = this.anim["run"];//AnimationState就是动画的状态
Debug.Log(anim_state.name + " " + anim_state.length + " " + anim_state.time);//打印出当前子动画的名字,长度和已经播放的时间
this.Invoke("stop_anim", 3.0f);//3秒后停止播放动画
} public void stop_anim() {
Debug.Log("stop_anim");
this.anim.Stop();//停止播放动画
}
// Update is called once per frame
void Update () {
if (Input.GetKeyDown(KeyCode.Space)) {//当空格按下的时候执行if中的语句
this.anim.CrossFade("run", 0.5f);//切换当前动画变成run,切换的时间是0.5秒
}
}
}

9.运行,3秒后停止播放动画,期间如果按空格键会切换动画

注意:

动画一般都是设置为循环播放,然后在Update()里面去播放,播放或者切换动画的时候一般都是持续调用Update的满足里面if条件的播放动画的语句,才使得动画可以一直持续循环播放,一旦不满足if条件,就停止播放。

如果是只播放一次的动画,必须要让它成为最后一个要播放的动画,其他动画要想再播放,就必须再满足某个条件。有的时候点击播放一次某个动画,发现只播放到前几帧就停下来或者变成另外一个动画,有可能是因为Update里面设置了默认动画状态的代码。

关于Unity中旧版动画系统的使用的更多相关文章

  1. Unity 4.0 中的新动画系统——MecAnim

    分享一个文档资料,关于动画系统的,版本应该很老了,但是有借鉴意义的: Unity 4.0 已于 2012 年 11 月 15 日正式发布,Unity 每一次版本的提升,都给游戏开发者带来惊喜,这一次也 ...

  2. 如何在unity中使用龙骨动画

    龙骨 龙骨是Egret公司的一个用来做动画的软件,本文分享一下如何在Unity2D中使用龙骨导出的2D动画 导出动画 在龙骨中文件->导出,导出动画数据和纹理到Unity的项目中,如果打包了的话 ...

  3. 在Unity中创建攻击Slot系统

    http://www.manew.com/thread-109310-1-1.html 马上注册,结交更多好友,享用更多功能,让你轻松玩转社区. 您需要 登录 才可以下载或查看,没有帐号?注册帐号  ...

  4. Unity Animation System(动画系统)

    动画系统: 支持:动画融合,混合,叠加动画,行走循环的时间同步,动画层,控制动画的各个方面(时间,速度,融合权重)   带有每顶点1.2或4骨骼的蒙皮网格,以及支持基于物理的布娃娃系统和程序动画.   ...

  5. 关于Unity中的帧动画组件的编写

    一.帧动画 1: 美术准备好一个连续动作的离散图片;2: 程序在准确的时间来切换这个图片;3: 优点: 简单,速度快; 缺点:资源占用相对过大; 二.frame_anim组件编写 1: 代码里面强制要 ...

  6. 关于Unity中新版动画系统的使用

    Mecanim动画 1:旧版动画系统只能通过代码来控制动画播放,随着动画种类变多,代码复杂度也会增加,同时动画过渡也需要非常繁琐的代码控制,为了让有经验的动画师开发动画,unity推出了针对人物角色的 ...

  7. 解决Unity3d 4.3 动画系统带来的烦恼

    近期有非常多同学问我关于unity3d 4.3更新之后动画系统和曾经不一样了,并且之前用的非常熟练的创建动画和修修改画非常多操作都不好用了,那么在这里和大家分享一下三杀的个人经验,方便大家使用unit ...

  8. 【Unity】第10章 Mecanim动画系统

    分类:Unity.C#.VS2015 创建日期:2016-05-02 一.简介 Unity提供了两种动画系统:一种是早期版本提供的旧版(Legacy)动画系统,旧版本(Legacy)以后将逐步被淘汰掉 ...

  9. 关于Unity中Mecanim动画的重定向与动画混合

    应用 一个RPG游戏,里面有100种怪物,每种怪物其实都差不多的,行走,跳跃,攻击,难道动画师要调100次动画吗?其实不需要 Unity抽象出人形动画系统,用Unity简化版的骨骼来进行统一的管理,只 ...

随机推荐

  1. AlloyTouch全屏滚动插件搞定顺滑H5页

    使用姿势 在设计全屏滚动插件的时候,希望开发者几乎: 不用写任何脚本快速生成精致H5 支持PC滚轮和移动触摸 酷炫的转场动效 灵活的时间轴管理 一切皆可配置 但是不写脚本肯定没有灵活性咯?!不是的.这 ...

  2. layer-list:Android中layer-list使用详解

    使用layer-list可以将多个drawable按照顺序层叠在一起显示,默认情况下,所有的item中的drawable都会自动根据它附上view的大小而进行缩放, layer-list中的item是 ...

  3. Quantum Computation and Quantum Information

    https://www.amazon.com/Quantum-Computation-Information-10th-Anniversary/dp/1107002176/ref=asap_bc?ie ...

  4. slack机器人运维

    这里有一篇文章,够详细了:http://colobu.com/2015/11/04/create-a-slack-bot-with-golang/ 另外:这个py的库,test了一下,挺好使:http ...

  5. vue 的事件冒泡

    一.事件冒泡 方法一.使用event.cancelBubble = true来组织冒泡 <div @click="show2()"> <input type=&q ...

  6. django 利用PIL 保存图片

    在使用django时不知道怎么保存图片,又不想用它的form ,在网上找了许久,终于找到个解决方案,利用PIL.image 将POST上来的图片保存到media目录下,然后再修改models from ...

  7. 再论FreeRTOS中的configTOTAL_HEAP_SIZE

    关于任务栈和系统栈的基础知识,可以参考之前的随笔.(点击这里) 这里再次说明:#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 17 * 1024 ) ) 这个 ...

  8. Python与操作系统有关的模块

    Os模块 Python的标准库中的os模块主要涉及普遍的操作系统功能.可以在Linux和Windows下运行,与平台无关.os.sep 可以取代操作系统特定的路径分割符.os.name字符串指示你正在 ...

  9. Silverlight跨域访问wcf

    添加文件名为“clientaccesspolicy.xml”的文件 内容: <?xml version="1.0" encoding="utf-8"?&g ...

  10. 1. 感知机原理(Perceptron)

    1. 感知机原理(Perceptron) 2. 感知机(Perceptron)基本形式和对偶形式实现 3. 支持向量机(SVM)拉格朗日对偶性(KKT) 4. 支持向量机(SVM)原理 5. 支持向量 ...