[Unity3d]unity中新老动画系统

简介: Unity4的Mecanim动画很早以前就有体验过,迟迟没有加到项目中有两个原因,今天写这篇博客来记录我在做的过程中遇到的一些问题。 1.以前的代码代码量比较多,修改起来动的地方太多了。

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来表示。 这样的做法使用起来非常方便,但是由于每一个动画都会依赖原始模型所以文件会非常大。

屏幕快照 2013-04-16 下午2.14.57

Unity4已经将默认模型与动态导入的类型做了修改,你会发现你的模型拖拽入Hierarchy视图中没有Animation组件而是Animator组件。如果你还是想在Unity4中使用以前的动画系统。你需要把每个模型和动画的类型改成 Rig-> Animation Type -> Legacy,如下图所示。

屏幕快照 2013-04-16 下午2.19.04

手动的改起来会非常的累。建议你将下面这条脚本放在项目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可以预览你的骨骼。

屏幕快照 2013-04-16 下午2.13.32

让美术修改一下以前的动画,将动画中的原始模型去掉,这样还可以减少文件的大小。然后在Porject视图中找一个原始模型拖拽入右侧Preview中,可以看到这个模型已经播放奔跑动画。

屏幕快照 2013-04-16 下午2.33.35

此时换一个模型拖入同样可以预览奔跑效果。

屏幕快照 2013-04-16 下午2.36.51

如下图所示,在动画的.fbx中 因为动画需要用刚刚生成的骨骼。所以这里Avatar Definition中你需要选择Copy From Other Avatar 。在Source中选择刚刚生成的Avatar 以后所有动画都需要这样来设置。。

屏幕快照 2013-04-16 下午4.38.57

下面我们来让这个女模型和男模型共用男模型的那一套动画,在游戏视图中播放。在Project视图中选择Crate->AnimatorController。然后把Project中男模型和女模型都拖拽入Hierarchy视图中。 将刚刚创建的AnimatorController放置在Controller处。

屏幕快照 2013-04-16 下午2.41.31

此时在Unity导航菜单栏中选择Window -》 Animator。 将动画文件拖入Animator窗口中,你会发现两个模型都开始发生运动。如下图所示,黄颜色表示它为原始动画,也就是根动画。用箭头将它们一一前后相连,箭头实际上就是动画播放的条件。请注意看图中两个蓝色的箭头,A播放完后将会播放B动画,可是B却对应了两个箭头,也就是说B播放完后可以播放C也可以回过头来播放A。

屏幕快照 2013-04-16 下午3.00.59

那么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箭头上的小就可以。。 其它的播放虚列原理类似。

屏幕快照 2013-04-16 下午3.09.50

接着还有问题了,用时间来做动画切换的条件是不是有点太限制了。Animator还支持自定义条件,在Animator窗口的左下角处,点击“+”按钮就可以添加变量。这里我添加三组变量, float 、int、bool。

屏幕快照 2013-04-16 下午3.17.50

变量添加完毕后,继续点击箭头的条件,箭头上可以有一个条件 或者多个条件。如果是多个条件需要多个条件同时满足才可以。 Conditons左键是变量名称,中间是变量条件,右边是变量值。

Greater 表示左边变量大于右边时触发

Less 表示左边变量小于右边时触发

Equals 表示左边变量等于右边时触发

NotEquals表示左边变量不等于右边时触发。

int 变量上述四种都有,float变量只有Greater 和Less, bool变量只有true和false。

屏幕快照 2013-04-16 下午3.20.38

此时我们在加深一下理解。选择AB的箭头,也就设置A动画切换B动画的条件。

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

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

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

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

屏幕快照 2013-04-16 下午3.26.38

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

屏幕快照 2013-04-16 下午3.17.50

在代码中你可以这样来设置或变更它们的条件。 如果说你需要在程序中判断当前动画的一些信息,可以使用 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播放动画的时候,同时在播放该模型对应的武器动画,我想这样就可以解决这个问题吧。

相关文章
|
移动开发 前端开发 C#
在Unity3D中实现热力图、风向图、温度图效果(Unity3D)
因一个任务要完成如何在Unity上面实现热力图的效果,所以百度了很久,发现资料很少,现在就把我总结的如何在Unity上面基于Canvas实现热力图效果的实现过程分享出来, 此前转载了一篇主要讲的是如何根据数据值,在Canvas上重新绘制RGBA的值,完成热力图的绘制,不过用的是H5写的,我修改了一下,用C#重写的
|
4月前
|
图形学
【Unity3D开发小游戏】Unity3D零基础一步一步教你制作跑酷类游戏
【Unity3D开发小游戏】Unity3D零基础一步一步教你制作跑酷类游戏
|
4月前
|
设计模式 存储 前端开发
【Unity3D日常开发】Unity3d中使用MVC框架
【Unity3D日常开发】Unity3d中使用MVC框架
|
7月前
|
数据采集 物联网 Linux
Unity3D下实现Linux平台RTMP推流(以采集Unity窗体和声音为例)
随着物联网等行业的崛起,越来越多的传统行业如虚拟仿真、航天工业、工业仿真、城市规划等,对Linux下的生态构建,有了更大的期望,Linux平台下,可选的直播推拉流解决方案相对Windows和移动端,非常少,基于Unity的Linux推送方案,更是几无参考。本文以Unity3d环境下Linux平台推送Unity窗体和Unity采集的音频,然后编码推送到RTMP服务器为例,大概说下实现过程。
134 0
|
Java Android开发 图形学
Unity3D与Android的交互通信(Unity3D)
这篇文章主要讲的是如何使用Android Studio与Unity的交互通信。主要内容有如何在Android Studio创建工程,如何设置,以及如何导出。以及在Unity调用Android的方法。
|
存储 C# 图形学
从零开始做一款Unity3D游戏<一>——亲自上手使用Unity(二)
从零开始做一款Unity3D游戏<一>——亲自上手使用Unity
从零开始做一款Unity3D游戏<一>——亲自上手使用Unity(二)
|
编解码 JavaScript C#
从零开始做一款Unity3D游戏<一>——亲自上手使用Unity(一)
从零开始做一款Unity3D游戏<一>——亲自上手使用Unity
从零开始做一款Unity3D游戏<一>——亲自上手使用Unity(一)
|
小程序 定位技术 API
Unity3D-开发工具选择与Unity安装
本笔记基于windows平台,使用Unity软件ARFoundation开发工具开发安卓系统 开发工具版本: Windows11 Unity Hub 2.5.5 Unity2020.3.25f1c1(LTS)
694 0
Unity3D-开发工具选择与Unity安装
|
图形学 数据安全/隐私保护
在Unity3D中如何画线,LineRender组件你一定要会(Unity3D)
发现网上很多教程都是如何用LineRender组件画线,但是这个组件还有很多其他的功能属性也是很有趣的,下面就让我们来看看吧
|
设计模式 存储 前端开发
在Unity3d中如何使用MVC框架(Unity3D)
MVC是一种比较常见的设计框架,是一种将代码的功能进行划分的一种设计框架,主要原理就是将软件用户界面和业务逻辑分离,以使代码可扩展性、可复用性、可维护性、灵活性加强。 MVC在桌面应用程序,以及网页架构上面用的比较多,那么怎么应用到Unity3d中呢,下面就带大家去了解这个设计框架,以及如何在Unity中应用。