unity 什么时候用到unity 二维物体变形动画混合树

&多维混合树与脸部动画
多维混合树与脸部动画
开通极客学院VIP会员,免费观看全部会员课程
最低 21.6 元 / 月
VIP会员尊享特权
观看全部会员课程
720P高清视频下载
已有会员账号,请
视频太卡?试试切换线路
本课时主要介绍了BlendTree动画混合树的概念以及讲解了如何在Inspector检视窗口对混合树进行配置
本课时主要讲解了一维混合树的使用方式,结合实例的方式,用“多层一维混合树”开发了一个人物走跑转弯的混合控制系统
本课时主要讲解了二维混合树的使用方式,结合实例的方式,用“二维混合树”重新开发了一个人物走跑转弯的混合控制系统
本课时主要讲解了Unity5.0所新推出的Direct BlendTree 多维混合树的使用,并且通过创建一个脸部动画控制器的方式,为大家详细讲解了它的作用与用法。
只有成为VIP会员才能提问&回复,快吧!如果你还没有账号你可以一个账号。
添加新技术问题
课程 [多维混合树与脸部动画]
中已存在问题
添加新技术问题
问题描述越详细,被解答的速度越快
有新回答时请邮件提醒我
着急,拜托快点
不急,慢慢解决
关联课程 [多维混合树与脸部动画]
服务热线:400-678-8266扫一扫,访问微社区
后使用快捷导航没有帐号?
签到成功!您今天第{todayrank}个签到,签到排名竞争激烈,记得每天都来签到哦!已连续签到:{constant}天,累计签到:{days}天
关注:1509
当前位置: &
__________________________________________________________________________________
开发者干货区版块规则:
  1、文章必须是图文形式。(至少2幅图)
& && &2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
& && &3、本版块只支持在游戏蛮牛原创首发,不支持转载。
& && &4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
& && &5、......
__________________________________________________________________________________
查看: 2640|回复: 0
Unity3D研究院之在项目中使用Unity4新Mecanim动画(五十三)
本帖为抢楼帖,欢迎抢楼!&
9排名<font color="#FF昨日变化主题帖子积分
蛮牛币4837
在线时间64 小时
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
才可以下载或查看,没有帐号?
本帖最后由 雨松MOMO 于
10:37 编辑
& && &&&4的Mecanim动画很早以前就有体验过,迟迟没有加到项目中有两个原因,今天写这篇博客来记录我在做的过程中遇到的一些。1.以前的代码代码量比较多,修改起来动的地方太多了。2.使用Mecanim动画,还得需要美术的动画做配合才行。& && &&&在3.x中播放动画的时候使用Play()或CrossFade(),直接播放动画 或淡入淡出播放动画。[AppleScript] 纯文本查看 复制代码animation.Play(&name&);
animation.CrossFade(&name&);
& && &&&也可以使用队列播放,让动画形成一个队列。[AppleScript] 纯文本查看 复制代码
animation.PlayQueued(&name&);
animation.CrossFade(&name1&);
& && &&&我举一个我现在项目的例子。主角攻击敌人是一套连招,连招一共分为4套动画。也就是当玩家连续按下4次攻击键时这四套动画是连续播放的,假如玩家只连续按下2次攻击,可能只会播放前两套动画。代码中你需要判断其中某个动画是否播放完毕,只有播放完毕才能继续播放下一个动画。[AppleScript] 纯文本查看 复制代码
if(animation.isPlaying)
if(animation.IsPlaying(&attack1&))
& && &&&大家在仔细想想这个命题,我们可以把动画分成4中可能的队列,也只可能分为这几种队列。站立动画- 》攻击动画0 -》站立动画站立动画- 》攻击动画0 -》攻击动画1 -》站立动画站立动画- 》攻击动画0 -》攻击动画1 -》攻击动画2-》站立动画站立动画- 》攻击动画0 -》攻击动画1 -》攻击动画2-》攻击动画3-》站立动画此时如果用3以前的动画方式,无非就是上面这几种方法加上一些逻辑判断完成。现在Unity4加入了Mecanim动画,可以很好的帮我们解决这个问题。详细的动画使用教程我就不多说了,网上已经有很多人写过了。如下图所示,以前我们在使用模型的时候。一个原始模型,原始模型中没有动画。然后是动画模型,每一个动画都会依赖原始模型。动画的名称末尾用 名称 + @name来表示。 这样的做法使用起来非常方便,但是由于每一个动画都会依赖原始模型所以文件会非常大。
15:08 上传
& && & Unity4已经将默认模型与动态导入的类型做了修改,你会发现你的模型拖拽入Hierarchy视图中没有Animation组件而是Animator组件。如果你还是想在Unity4中使用以前的动画系统。你需要把每个模型和动画的类型改成 Rig-& Animation Type -& Legacy,如下图所示。
15:08 上传
& && & 手动的改起来会非常的累。建议你将下面这条脚本放在项目Editor文件夹下(没有创建一个)。这样当你将模型或动画拖入Project视图中,程序会自动帮你修改它的类型,显然Unity已经不建议大家继续使用以前的动画系统了。[AppleScript] 纯文本查看 复制代码using UnityE
public class MyEditor : AssetPostprocessor
public void OnPreprocessModel()
ModelImporter modelImporter = (ModelImporter) assetI
modelImporter.animationType = ModelImporterAnimationType.L
& && && &下面开始说说新的动画。在Animations选项卡中先勾掉Import Animation 点击Apply。如下图所示,在Rig选项卡中修改Animation Type的类型为Humanoid。 如果你希望现在选择的这个模型做为标准模型的话,在Avatar Definition中选择Create From This Model。点击下方的Configure可以预览你的骨骼。
15:10 上传
& && &&&让美术修改一下以前的动画,将动画中的原始模型去掉,这样还可以减少文件的大小。然后在Porject视图中找一个原始模型拖拽入右侧Preview中,可以看到这个模型已经播放奔跑动画。
15:10 上传
& && &&&此时换一个模型拖入同样可以预览奔跑效果。
15:10 上传
& && & 如下图所示,在动画的.fbx中 因为动画需要用刚刚生成的骨骼。所以这里Avatar Definition中你需要选择Copy From Other Avatar 。在Source中选择刚刚生成的Avatar 以后所有动画都需要这样来设置。。
15:10 上传
& && &&&下面我们来让这个女模型和男模型共用男模型的那一套动画,在游戏视图中播放。在Project视图中选择Crate-&AnimatorController。然后把Project中男模型和女模型都拖拽入Hierarchy视图中。 将刚刚创建的AnimatorController放置在Controller处。
15:10 上传
此时在Unity导航菜单栏中选择Window -》 Animator。 将动画文件拖入Animator窗口中,你会发现两个模型都开始发生运动。如下图所示,黄颜色表示它为原始动画,也就是根动画。用箭头将它们一一前后相连,箭头实际上就是动画播放的条件。请注意看图中两个蓝色的箭头,A播放完后将会播放B动画,可是B却对应了两个箭头,也就是说B播放完后可以播放C也可以回过头来播放A。
15:10 上传
& && && &那么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箭头上的小就可以。。 其它的播放虚列原理类似。。
15:10 上传
& && &&&接着还有问题了,用时间来做动画切换的条件是不是有点太限制了。Animator还支持自定义条件,在Animator窗口的左下角处,点击“+”按钮就可以添加变量。这里我添加三组变量, float 、int、bool。
15:10 上传
& && && &变量添加完毕后,继续点击箭头的条件,箭头上可以有一个条件 或者多个条件。如果是多个条件需要多个条件同时满足才可以。 Conditons左键是变量名称,中间是变量条件,右边是变量值。Greater 表示左边变量大于右边时触发Less 表示左边变量小于右边时触发Equals 表示左边变量等于右边时触发NotEquals表示左边变量不等于右边时触发。& && & int 变量上述四种都有,float变量只有Greater 和Less, bool变量只有true和false。
15:10 上传
& && &&&此时我们在加深一下理解。选择AB的箭头,也就设置A动画切换B动画的条件。 ft& &&&Greater& && &5 表示 当ft的值大于5的时候触发。it& && &Less& && && &&&3 表示 当 it的值小于3的时候触发。ib& &&&true& && && && &表示 当ib的值等于true的时候触发。& && &&&只有上述三种条件全部达成时将A动画将切换播放B动画。否则将一直停留在播放A动画处。
15:10 上传
& && &&&那么ft it ib的这三个变量到底在那里设置呢?如下图所示,才记得前面我们创建的三个变量吗? 这三个变量对应的值就是右边的 0.0 0 false 。在编辑器中你可以通过修改这三个数值来满足播放动画的条件。可是在代码中怎么办呢?& && &&&在代码中你可以这样来设置或变更它们的条件。 如果说你需要在程序中判断当前动画的一些信息,可以使用 GetCurrentAnimatorStateInfo(0),我查了一下Animator不能直接拿到当前播放动画的名称, 只能拿到它对应的Has值,也就是说你需要将原始的动画名称转换成Hash来判断。[AppleScript] 纯文本查看 复制代码using UnityE
using System.C
public class NewBehaviourScript : MonoBehaviour {
//得到Animator对象
animator = GetComponent&Animator&();
void OnGUI()
if(GUILayout.Button(&play&,GUILayout.Width(50)))
//在这里设置变量的条件
animator.SetFloat(&ft&,6f);
animator.SetInteger(&it&,2);
animator.SetBool(&ib&,true);
void Update()
AnimatorStateInfo animatorState = animator.GetCurrentAnimatorStateInfo(0);
if(animatorState.IsName(&Base Layer.Run_FastStop_Idle&))
Debug.Log(&动画相等&);
Debug.Log(&动画不等&);
& && &&&另外Mecanim还支持多个动画的混合。目前Mecanim还有一个最大的难题,也是文章最上面我说的需要美术配合的那部分。之前我们看到的动画都是应用于人型模型,也就是说它支持人形的骨骼, 举个例子我们的项目人和武器是两个骨骼,这样在用Mecanim就悲剧了。因为不同模型武器的骨骼不一样所以公用模型的话会出现武器位置不对的情况。最后我想到的办法就是美术将以前做的武器骨骼重新导出,每个人对应一套自己武器骨骼(或者一些特殊的骨骼)最后生成武器的动画 ,比如 站立动画、攻击动画、死亡动画等。当Mecanim播放动画的时候,同时在播放该模型对应的武器动画,我想这样就可以解决这个问题吧。。& && & 最后欢迎大家一起讨论。。今天有朋友QQ上问了我已下,是不是非人形动画还得使用老的动画系统?如下图所示,当你把模型导入Unity的时候,这里可以选择它的类型。legacy:是老的动画系统,这里就多说了。Generic:是新的动画系统,它就是支持非人形的动画,建议使用它。但是它不能向Humanoid重定向动画。Humanoid:就是新的人形重定向动画系统。
unity动画混合原理;unity的动画重定向;avatar unity 动画;动画混合原理unity动画重定向;unity动画avatar
每日推荐:
游戏蛮牛给予质量较高、影响力较大的unity相关技术开发者的荣誉称号Unity(33)
工业仿真(7)
Unity Mecanim动画的实现(十):动画混合树、子状态机和状态行为
1.动画混合树
&&&&&&&&混合树表示多个状态的混合调用,一般根据某些参数来实现这些动画状态之间的混合与切换,根据参数的个数可以分为1D混合、2D混合和直接混合。比如在之前的案例中,我们通过控制Float参数Speed实现了Idle、Run、Walk之间的过渡,我们这里也可以通过混合树来实现。1D混合如下图所示。
设定混合类型为1D
添加混合参数Speed
添加Motion,并设定Motion在的门坎值。
我们通过一个混合树就实现了之前通过三个状态并设定过渡条件实现的功能。
&&&&&&&&除了1D混合,我们还可以2D混合,2D混合有三种不同类型:
2D simple Directional,表示在二维每个空间方向只能有一个动作;
2D Freedom Directional,表示在二维每个空间方向可以有两个动作,但是必须一个是Idle。
2D Freedom Cartesian,表示在笛卡尔二维空间中各个方向可以随便设定动作。这个是最常用的。
下面我们在1D的基础上,增加三个动作,后退、左转和右转,那么1D混合满足不了需求了,我们需要用2D混合类型,通过2D类型控制了6个Motion的切换。
2.子状态机
&&&&&&&&子状态相当于在目前层的状态机下面建立一个自状态集合,可以将类似的动画装填结合在一起,简化动画逻辑。典型的子状态机如下所示(Attack是子状态机):
3.状态行为
&&&&&&&&状态行为即为状态机中的状态添加脚本,在状态进入、更新事件、IK、根动画时进行一些脚本控制。
状态行为脚本继承的类是StateMachineBehaviour,包括五个回调函数。他们的回调时机可以从Unity提供的注释得知:
using UnityE
using System.C
public class Test : StateMachineBehaviour {
状态行为可以用于添加状态发生时的音效、控制碰撞检测代码等。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:6774次
排名:千里之外
原创:32篇4701人阅读
Unity3D(7)
这几天电脑坏了,今天来测试一下控制角色,这样在上次人物动作的基础上让角色可以在场景里面跑起来。
首先为角色增加一个CharacterController。
然后设定一些变量控制角色的速度
var speed = 3.0;
var rotatationSpeed = 200.0;
private var curSpeed = 0.0;
function Update () {
// Rotate around y-axis
var newRotation = Input.GetAxis(&Horizontal&) * rotatationS
transform.Rotate(0, newRotation * Time.deltaTime, 0);
// Calculate speed
var newSpeed = Input.GetAxis(&Vertical&) *
if (Input.GetKey(&left shift&))
newSpeed *= 1.5;
// Move the controller
var controller : CharacterController = GetComponent (CharacterController);
var forward = transform.TransformDirection(Vector3.forward);
controller.SimpleMove(forward * newSpeed);
在Update函数里,我们根据输入计算出运行的速度和旋转的速度。最后通过控制器,让这个角色跑起来。
不过到目前为止这个角色跑起来开清动作就变得怪怪的,当按下开枪按钮的时候,这个人就开始滑行了,为了让这个人能够“边跑边打”,我们就要去混合刚才开枪和跑步的动作。
&& 写了一半,电脑又坏了!~非常痛恨中关村里面的修理笔记本的!各位兄弟们千万别去了!实在不行一定要找个熟悉的人带着。
&& 言归正传,要让我们控制的机器人可以一边跑一边射击,那么就必须要用到Unity中一个非常重要的动画技术 “动画混合Animation Mixing”。
&& 找个动画文件来看看:robot@idle2shoot.fbx这个动画。在这套动画文件中,包含了很多的动画动作。我们的每一个动画都包含了好多的动作,其中包括了 手上的动作和腿脚的动作。通常情况下我们播放动画就是直接播放一个动作就可以了,但是遇到需要动作融合的时候,就不能直接的调用动画,而是要选用其中的一部分有用的动画。
&& &现在我们要对Run这个动作和Shoot两个动作进行混合。先来看看Shoot的动作序列:在这个动作中基本上只包含了两个上身持枪和动作,下身基本上没动。这个动作融合主要是针对shoot的上半身。
首先,利用Shoot动画片段,生成一个新的动画片段&shootUpperBody&。
&animation.AddClip(animation[&shoot&].clip, &shootUpperBody&);
&&animation[&shootUpperBody&].AddMixingTransform(transform.Find(&mover/roothandle/spine1&));
&&animation[&shootUpperBody&].AddMixingTransform(transform.Find(&mover/gun&));
增加两个混合矩阵,让动作融合。这个动画角色的动作骨骼矩阵包含四部分,我们选择的spine1是上身的动作矩阵的根矩阵:
然后在运动的代码中调用
animation.CrossFadeQueued(&shootUpperBody&, 0.3, QueueMode.PlayNow);
然后跑起来的的角色,就有shoot和run混合的效果。
function Update () {
if (Mathf.Abs(Input.GetAxis(&Vertical&)) & 0.1 || Mathf.Abs(Input.GetAxis(&Horizontal&)) & 0.1)
animation.CrossFade(&run&);
animation[&run&].speed = Mathf.Sign(Input.GetAxis(&Vertical&));
animation.CrossFade(&idle&);
// Play the cross fade animation
if (Input.GetButtonDown (&Jump&))
animation.CrossFade(&jump&, 0.3);
if (Input.GetButtonDown (&Fire1&))
// We are running so play it only on the upper body
if (animation[&run&].weight & 0.5)
animation.CrossFadeQueued(&shootUpperBody&, 0.3, QueueMode.PlayNow);
// We are in idle so play it on the fully body
animation.CrossFadeQueued(&shoot&, 0.3, QueueMode.PlayNow);
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:113673次
积分:1699
积分:1699
排名:第18936名
原创:47篇
评论:41条
(1)(2)(1)(1)(2)(2)(2)(4)(4)(1)(5)(1)(2)(1)(2)(7)(14)(3)(1)

我要回帖

更多关于 unity 二维数组 的文章

 

随机推荐