该文章转自:http://www.cnblogs.com/RenderLife/archive/2013/07/04/3171645.html

Unity4的Mecanim动画很早以前就有体验过,迟迟没有加到项目中有两个原因,今天写这篇博客来记录我在做的过程中遇到的一些问题。

1.以前的代码代码量比较多,修改起来动的地方太多了。

2.使用Mecanim动画,还得需要美术的动画做配合才行。

在3.x中播放动画的时候使用Play()或CrossFade(),直接播放动画 或淡入淡出播放动画。

1 animation.Play("name");
2 animation.CrossFade("name");

也可以使用队列播放,让动画形成一个队列。

1 animation.Play("name");

2 animation.CrossFade("name");

我举一个我现在项目的例子。主角攻击敌人是一套连招,连招一共分为4套动画。也就是当玩家连续按下4次攻击键时这四套动画是连续播放的,假如玩家只连续按下2次攻击,可能只会播放前两套动画。代码中你需要判断其中某个动画是否播放完毕,只有播放完毕才能继续播放下一个动画。

1 if(animation.isPlaying)

2 {
3
4 }
5
6 if(animation.IsPlaying("attack1"))
7 {
8
9 }

大家在仔细想想这个命题,我们可以把动画分成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已经不建议大家继续使用以前的动画系统了。

01 using UnityEditor;
02
03 public class MyEditor : AssetPostprocessor
04 {
05 public void OnPreprocessModel()
06 {
07 ModelImporter modelImporter = (ModelImporter) assetImporter;
08 modelImporter.animationType = ModelImporterAnimationType.Legacy;
09 }
10 }

下面开始说说新的动画。在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动画的条件。

ft     Greater      5 表示 当ft的值大于5的时候触发。

it      Less           3 表示 当 it的值小于3的时候触发。

ib     true            表示 当ib的值等于true的时候触发。

只有上述三种条件全部达成时将A动画将切换播放B动画。否则将一直停留在播放A动画处。

那么ft it ib的这三个变量到底在那里设置呢?如下图所示,才记得前面我们创建的三个变量吗? 这三个变量对应的值就是右边的 0.0 0 false 。在编辑器中你可以通过修改这三个数值来满足播放动画的条件。可是在代码中怎么办呢?

在代码中你可以这样来设置或变更它们的条件。 如果说你需要在程序中判断当前动画的一些信息,可以使用 GetCurrentAnimatorStateInfo(0),我查了一下Animator不能直接拿到当前播放动画的名称, 只能拿到它对应的Has值,也就是说你需要将原始的动画名称转换成Hash来判断。

01 using UnityEngine;
02 using System.Collections;
03
04 public class NewBehaviourScript : MonoBehaviour {
05
06 private Animator animator ;
07 void Start()
08 {
09 //得到Animator对象
10 animator = GetComponent<Animator>();
11 }
12
13 void OnGUI()
14 {
15 if(GUILayout.Button("play",GUILayout.Width(50)))
16 {
17 //在这里设置变量的条件
18 animator.SetFloat("ft",6f);
19 animator.SetInteger("it",2);
20 animator.SetBool("ib",true);
21
22 }
23 }
24
25 void Update()
26 {
27 AnimatorStateInfo animatorState = animator.GetCurrentAnimatorStateInfo(0);
28
29 if(animatorState.IsName("Base Layer.Run_FastStop_Idle"))
30 {
31 Debug.Log("动画相等");
32 }else
33 {
34 Debug.Log("动画不等");
35 }
36
37 }
38 }

另外Mecanim还支持多个动画的混合。目前Mecanim还有一个最大的难题,也是文章最上面我说的需要美术配合的那部分。之前我们看到的动画都是应用于人型模型,也就是说它支持人形的骨骼, 举个例子我们的项目人和武器是两个骨骼,这样在用Mecanim就悲剧了。因为不同模型武器的骨骼不一样所以公用模型的话会出现武器位置不对的情况。最后我想到的办法就是美术将以前做的武器骨骼重新导出,每个人对应一套自己武器骨骼(或者一些特殊的骨骼)最后生成武器的动画 ,比如 站立动画、攻击动画、死亡动画等。当Mecanim播放动画的时候,同时在播放该模型对应的武器动画,我想这样就可以解决这个问题吧。

unity anim 组件的使用相关推荐

  1. 【Unity 3D 从入门到实战】Unity 3D 组件总结

    目录 一,前言 二,常用组件 1,Transform 组件 2,Mesh Filter 组件 3,Box Collider 组件 4,Rigidbody 组件 5,脚本组件 三,总结 一,前言 组件是 ...

  2. 关于Unity VideoPlayer组件 视频切换第一帧卡顿

    关于Unity VideoPlay组件 视频切换第一帧卡顿的问题 1.问题: 在做项目时,发现VideoPlayer组件在多个视频切换时,会在第一帧重复上个视频的结束时的画面. 2.原因: 因为Vid ...

  3. Unity3D课程系列上线--《unity 常用组件分析》

    本人录制的Unity3D系列课程上线了,这是第一套 <unity 常用组件分析> http://www.maiziedu.com/course/others/540-7381/

  4. Unity 常用组件使用总结

    Unity 常用组件使用总结 一.摄像机 Camera: 1.Clear Flag 清除标志:决定屏幕的那部分将被清除.当使用多个相机来描绘不同的游戏景象时,利用它是非常方便的. 2.Back gro ...

  5. Unity* 实体组件系统 (ECS)、C# 作业系统和突发编译器入门

    Unity* 中的全新 C# 作业系统和实体组件系统不仅可以让您轻松利用以前未使用的 CPU 资源,还可以帮助您更高效地运行所有游戏代码.然后,您可以使用这些额外的 CPU 资源来添加更多场景动态和沉 ...

  6. Unity自定义组件之序列帧播放组件

    我们知道在unity中播放序列帧动画有两种方式,第一种是利用Unity自带的animation组件来播放,我们只需要在工程目录中全选选中所有我们需要播放的图片,将其拖动到Hiercarchy上,Uni ...

  7. Unity VideoPlayer组件在5.6版本的坑

    Unity5.6版本可以使用Unity自带的VideoPlayer组件,VideoPlayer组件可以很简便地实现播放视频功能,但是对于一些要求稍微高点的视频播放需求存在坑.本人使用的Unity版本是 ...

  8. 学习笔记——使用Unity Network组件开发联机游戏

    文章目录 前言 一.创建玩家预制体 二.使用Network组件 总结 前言 使用unity中的Network组件开发一个简单的多人在线游戏 unity版本:2018.4.16 一.创建玩家预制体 1. ...

  9. Unity多组件脚本执行顺序控制

    Problem 当Unity项目中存在多个组件时,组件之间的执行顺序默认是随机的.当我们想要控制程序执行顺序时就会存在问题. Solution Unity中提供了脚本的优先级控制.官方说明 Scrip ...

最新文章

  1. Django静态文件一瞥
  2. 水平分库分表的关键步骤和技术难点,分库分表的几种常见玩法及如何解决跨库查询等问题...
  3. AI公开课:19.04.04李航—字节跳动AILab总监《深度学习与自然语言处理:评析与展望》课堂笔记以及个人感悟
  4. python怎么限制输出精度_谈谈关于Python里面小数点精度控制的问题
  5. caffe的python接口学习(8):caffemodel中的参数及特征的抽取
  6. 开发指南专题十八:Navicat 数据库转换操作
  7. cmd中输入net start mysql 提示:服务名无效或者MySQL正在启动 MySQL无法启动
  8. tcp段重组--suricata实现
  9. python中浮点型占几个字节_Python基本数据类型
  10. 解决爬取网站过程中遇到的HTTP Error 302错误和中文乱码问题
  11. [单刷APUE系列]第四章——文件和目录[1]
  12. 我的媒体播放器——多媒体编程
  13. JAVA处理字符串压缩以及文件压缩
  14. linux内核实时补丁的实现,Canonical释出用于Ubuntu 18.04 LTS和16.04 LTS的新Linux内核实时补丁...
  15. ogg怎么转mp3格式,ogg转mp3方法
  16. SpringBoot项目整合JasperReport报表生成PDF并下载
  17. Android中访问assets本地json文件
  18. 模2除法(计算CRC校验码)
  19. python爬虫学习之爬取169图片网站
  20. 04735数据库系统原理(笔记)(更新中)

热门文章

  1. python3 ftplib_python3从零学习-5.10.9、ftplib—FTP 协议客户端
  2. 3D旋转(CSS3)
  3. 盒子背景颜色(HTML、CSS)
  4. OpenCV adaptiveThreshold 自适应阈值
  5. 腾讯优图 ncnn AI 框架宣布加入 ONNX 开放生态系统
  6. 你不是编程挺厉害的吗?这都做不出来 | 硕士写给自己:努力应该适可而止
  7. SSH框架总结(框架分析+环境搭建+实例源码下载)
  8. mysql5.6.25及以上下载衔接
  9. 单片机和微型计算机异同,微机与单片机有什么主要的区别?
  10. matlab阶跃响应_状态空间模型及MATLAB指令计算