来自: http://blog.csdn.net/o_oxo_o/article/details/21325901

Unity中Mecanim里面动画状态的变化,是通过设置参数(Parameter)或者按照结束时间来转换的。但是如果当前状态处在两个状态的过度状态,单纯设置参数是实现不了动画的跳转的。今天上午我就碰到这种情况:

我想实现无论动画在Run状态还是RunJump状态都能通过玩家按Slide键使其转换到RunSlide(下滑)状态。

如上图所示(上图中RunJump到RunSlide通过参数Slide和Jump来控制,请注意Attack跟这两个状态是没有直接关系的)。角色当前处在从跑跳(RunJump)到跑(Run)的过渡状态(一般是角色跳起后下降到地面之后的那段时间),这个时候如果玩家想要Slide(应该执行RunSlide动画),会发现动作无法执行。

这也是为什么在处理动画跳转逻辑的时候我们往往加上(!theAnimator.IsInTransition(0)) 来回避这种状态。但这种方式应用在我今天碰到的情况是不行的,就像上面说的那样,这时候用户想Slide结果动画不能播放。更糟糕的情况是如果我们处理了玩家按Slide键时的碰撞体使其高度缩小(下滑状态的碰撞体高度应该缩小,这个在Unity Pro中是可以在Mecanim里面实现的,也就是说不需要我们另外在程序中手动修改碰撞体高度。Free版没有这个功能。),则玩家将看到角色碰到上方障碍物却没有结束游戏或者任何效果出现。

当然我们可以在处理碰撞体的高度的时候判断当前动画是否处在Transition状态,是的话我们不缩小高度。是的这样可以不至于让玩家看到碰到障碍物却没有任何影响的尴尬场景,但是还是没能解决玩家操作了角色使其下滑而角色却没有反应这个事实。

一个解决的方法就是当检测到用户按Slide键后,不论当前是否是Transition状态,在设置Slide=true后,我们通过Animator的Play函数强制让RunSlide动画执行起来,这样就可以实时响应玩家的下滑请求。

        thisAnimator.SetBool(eventName, true);
if(eventName == "Slide")// && thisAnimator.IsInTransition(0))
thisAnimator.Play("RunSlide");

这里我本来是判断是否是在过渡状态,是的话才强制运行下滑动画。但是我后来发现除了过渡状态时转换不到RunSlide状态外,RunJump状态中当角色着陆的一瞬间也经常不能通过知识设置Slide(Animator.SetBool)为true来转到下滑动画。所以我让程序只要当用户选择了下滑就播放下滑动画。

transition状态下Mecanim动画的跳转的更多相关文章

  1. Unity3D之Mecanim动画系统学习笔记(九):Blend Tree(混合树)

    认识Blend Tree 我们在Animator Controller中除了可以创建一个State外还可以创建一个Blend Tree,如下: 那么我们看下新创建的Blend Tree和State有什 ...

  2. Unity3D之Mecanim动画系统学习笔记(五):Animator Controller

    简介 Animator Controller在Unity中是作为一种单独的配置文件存在的文件类型,其后缀为controller,Animator Controller包含了以下几种功能: 可以对多个动 ...

  3. Unity3d Mecanim动画系统Animator学习笔记

    1. unity3d Mecanim学习  Unity3d新版动画系统网上的介绍很多,但多是流水笔记,外人很难看明白,后来我 终于找到介绍的比较明白的两个作者,特别感谢.一个是58开发网的乐天老师,课 ...

  4. u3d Mecanim动画

    作为Unity4.0的主要更新功能,Mecanim动画被寄予了很多的期望.系统有先进的地方,也有不足的地方.这些我们留到最后再来总结. 阿赵粗略的学习了一下,写下以下的教程.这篇教程简单的说明了Mec ...

  5. Unity Mecanim 动画系统

    1. Animator 组件 Controller:使用的Animator Controller文件. Avatar:使用的骨骼文件. Apply Root Motion:绑定该组件的GameObje ...

  6. Mecanim动画系统 - 在角色上使用Mask 叠加动画层

    http://www.narkii.com/club/thread-305706-1.html 2013-10-9 01:15 上传 下载附件 (78.65 KB) 导读:五分钟了解Mecanim角色 ...

  7. Unity3D之Mecanim动画系统学习笔记(八):Animator Layers(动画分层)

    解决什么问题? 动画分层可以用来解决什么样的问题呢?试想一下如果你要开发一款第三人称的射击游戏,那么肯定是希望身体的动画分为上下两部分,上方根据瞄准的位置和是否射击进行动画播放,下方根据移动播放动画. ...

  8. [Unity3D]Unity3D游戏开发之自己主动寻路与Mecanim动画系统的结合

    大家好,欢迎大家关注我的博客,我是秦元培,我的博客地址是blog.csdn.net/qinyuanpei. 这段时间博主将大部分的精力都放在了研究官方演示样例项目上,主要是希望能够从中挖掘出有价值的东 ...

  9. [Unity3D]Unity3D圣骑士当游戏开发商遭遇Mecanim动画系统

            大家好.我是秦培.欢迎关注我的博客.我的博客地址blog.csdn.net/qinyuanpei. 博主总算赶在这个月底写出了这篇文章.这个月由于期末考试一直没时间研究太多关于技术方面 ...

随机推荐

  1. background-clip,origin属性

    background-clip是新增属性之一,其作用是确定背景的裁剪区域. background-clip语法: background-clip:margin-box | padding-box | ...

  2. docker从零开始网络(一)概述

    概述 预计阅读时间: 4分钟 Docker容器和服务如此强大的原因之一是您可以将它们连接在一起,或者将它们连接到非Docker工作负载.Docker容器和服务甚至不需要知道它们部署在Docker上,或 ...

  3. Nginx-Primary script unknown的报错的解决方法

    配置nginx时一直报错:file not found 错误日志: [error] 12691#0: *6 FastCGI sent in stderr: "Primary script u ...

  4. C#实现DES加密解密,AES加密解密

    DES算法描述简介: DES是Data Encryption Standard(数据加密标准)的缩写.它是由IBM公司研制的一种加密算法,美国国家标准局于1977年公布把它作为非机要部门使用的数据加密 ...

  5. Opencv利用Mat访问像素值

    如果是采用Mat形式存储,想要访问灰度图像的灰度值,可以采用如下方法: 如果是彩色图像,采用如下方法: 说明: 其中gray_value中存放灰度值,image是读入的图像,i表示行,j表示列: co ...

  6. 如何用java有选择的输入多行文本

    java如何有选择的输入多行文本 今天在做作业的时候碰到了一个问题:要用java做词频统计,但是这就犯难了,java如何有选择性的进行文件输入输出呢? 查阅文档可知,inputStream类和outp ...

  7. Codeforces 891B - Gluttony

    891B - Gluttony 题意 给出一个数字集合 \(a\),要求构造一个数组 \(b\) 为 \(a\) 的某个排列,且满足对于所有下标集合的子集 \(S=\{x_1,x_2,...,x_k\ ...

  8. 树链剖分【p4116】Qtree3 - Query on a tree

    Description 给出N个点的一棵树(N-1条边),节点有白有黑,初始全为白 有两种操作: 0 i : 改变某点的颜色(原来是黑的变白,原来是白的变黑) 1 v : 询问1到v的路径上的第一个黑 ...

  9. Floyd【p1841】[JSOI2007]重要的城市

    Description 参加jsoi冬令营的同学最近发现,由于南航校内修路截断了原来通向计算中心的路,导致去的路程比原先增加了近一公里.而食堂门前施工虽然也截断了原来通向计算中心的路,却没有使路程增加 ...

  10. Codeforces Round #209 (Div. 2) D. Pair of Numbers (模拟)

    D. Pair of Numbers time limit per test 2 seconds memory limit per test 256 megabytes input standard ...