转 [教程] Unity3D中角色的动画脚本的编写(二)
在上一篇,我们介绍了有关Animation这个类中的部分方法,我后来想了想,这么介绍也不是个办法(其实有些方法我自己也没用过),该介绍点实际的东西了,毕竟我们是要做东西出来的。那好,我们就开始吧。
首先我们要介绍的主题是:Animation Blending ,即动画融合。我们来看官方文档上的描述: 用我自己的理解就是:在现今的游戏中,动画融合是一个必不可少的特性用以让你的的角色能够产生平滑的动画。动画设计师首先为角色创建了一些个动画片段,例如一个行走循环,跑步循环,还有站立或射击的。在你运行游戏期间,你需要从站立的动画状态转换到行走的动画状态并且看上去要足够平滑,不能突然跳转。 此时我们就需要 有一种处理方式来完成我们所想要实现的效果。这就是“动画融合”的用处。在Unity中,一个角色可以有多种不同的动画片段,Unity可以将这些动画片段融合起来并以一种组件的形式(即Animation)进行管理,并根据具体情形来比如脚本来生成最终的动画。看来我们其实一直在运用“动画的融合”。 using UnityEngine; public class SuperMarioAnimation : MonoBehaviour { AnimationState jump = animation["jump"];//暂存“jump”的动画状态,记住,是暂存。仅仅只是用于下面三行代码中的动画设置。 jump.layer = 1 ;//设置动画状态jump的动画层值为1,相对于默认层级值要高,为的是有更多的优先级取得动画权重。 jump.enabled = false;//暂停该动画的播放,这个我会在后面进行相应的讲解,因为它有其独特的应用情景。 jump.wrapMode = WrapMode.Clamp;//设置动画状态jump的循环模式为Once(单次,上一篇已经证明了)循环。 float currentSpeed = marioController.GetSpeed(); public void DidLand()//SendMessage方法调用的,在goober着地时执行 注意,要想理解好这段代码,我们必须结合另外一个加在goober上的脚本:SuperMarioController。这个例子里面出现了我们之前提到的一个非常重要的类:AnimationState,即动画状态,还涉及到了动画层的概念。所谓动画层,即AnimationState.layer,AnimationState这个类中的一个很重要的属性。在Unity的动画体系中,默认情况下,所有动画状态的layer值为0,你可以在脚本中动态的调节该动画状态的layer值。如上代码,我们在unity3d中点击运行按钮,我们什么都不做时,由于此时获得的currentSpeed的值肯定是小于0.1的,那么此时goober就会播放idle(站立)动画,见: 但是当我们按下了空格键,此时就会立即播放跳跃动画。假如我们将不设置jump的layer值为1,即注释掉这行: 我们再运行工程,此时我们还是按下空格键,效果如下: 错误定位到了: 出错了,为什么呢?由于此时没有设置跳跃动画的layer,导致跳跃动画的layer与idle的layer的值都为0,拥有同样的播放优先级,所以按下空格键时准备播放跳跃动画,但是在下一帧时程序发现此时从marioController 脚本组件中得到的currentSpeed变量的值小于0.1,所以又转为播放idle动画,可是此时在此动画脚本中执行到了上面蓝先的这一行,发现lastJump此时是空的(因为此时没有播放跳跃动画嘛),于是才提示空引用错误。所以工程此时就会暂停,我们可以从上面这张图中得以发现,看,goober此时是不是停在半空中,程序是不是暂停运行了?总结一下:如果某个动画状态的layer越高,执行起来就会比layer值较低的动画状态优先,且只有此动画状态被Stop或暂停时才有可能执行其他动画状态。官方的一个说明是: Lower layer animations only receive blend weights if the higher layers didn't use up all blend weights. |
转 [教程] Unity3D中角色的动画脚本的编写(二)的更多相关文章
- (转) [教程] Unity3D中角色的动画脚本的编写(一)
ps: 这两天研究unity3d,对动画处理特别迷糊,不知FBX导入以后,接下来应该怎么操作,看到这篇文章,感觉非常好,讲解的很详细. 已有好些天没写什么了,今天想起来该写点东西了.这次我所介绍的内容 ...
- (转) Unity3D中角色的动画脚本的编写(三)
在上一篇,我们具体的讲解了有关动画的融合,也提到了有关动画状态的权重问题.那么这次,我来以一个例子的形式来向大家讲解动画的叠加,或许会涉及到多方面的知识,我力求一次讲清.好了,我们开始吧! 首先我们必 ...
- Unity3D Player角色移动控制脚本
1. 简介 在Unity3D中,有多种方式可以改变物体的坐标,实现移动的目的,其本质是每帧修改物体的position.之前写过类似的文章,这次增加了平时常用API的脚本,每个脚本均手打测试可用. 2. ...
- Unity3D研究院之Machine动画脚本自动生成AnimatorController(七十一)
以前的项目一直不敢用Machine动画,因为当时立项的时候Machine动画还不成熟,最近项目做得差不多了我能有点时间学习,我就想在研究学习学习Machine.用Machine动画的时候需要创建一个A ...
- Unity3D研究院之Machine动画脚本自动生成AnimatorController
原地址: http://www.xuanyusong.com/archives/2811 以前的项目一直不敢用Machine动画,因为当时立项的时候Machine动画还不成熟,最近项目做得差不多了我能 ...
- Unity3D中通过Animator动画状态机获取任意animation clip的准确播放持续时长
Unity3d 4及之前的版本中动画的播放用的animation,可直接获取其播放持续长度.但5.x及以后的版本中都是用animator来播放动画了. https://docs.unity3d.com ...
- unity3d中给GameObject绑定脚本的代码
一.获取GameObject 1.GameObject.Find() 通过场景里面的名子或者一个路径直接获取游戏对象. GameObject root = GameObject.Find(“Ga ...
- Unity3d中如何查找一个脚本被挂在那些预设上面?
用一个脚本函数可以获取到选择的脚本文件被哪些预设和场景引用 [MenuItem("Assets/Tool/GetReference")] static void GetRefere ...
- 关于Unity中的帧动画组件的编写
一.帧动画 1: 美术准备好一个连续动作的离散图片;2: 程序在准确的时间来切换这个图片;3: 优点: 简单,速度快; 缺点:资源占用相对过大; 二.frame_anim组件编写 1: 代码里面强制要 ...
随机推荐
- Oracle 用户(user)和模式(schema)的区别
概述: (一)什么Oracle叫用户(user): A user is a name defined in the database that can connect to and access ob ...
- JavaScript_数组
/** * 数组本身也是对象 * js中数组类似于java里的map容器 长度可随意改变 ,元素类型任意 * */ // var arr = new Array(); // var arr = [1, ...
- MPICH2在两台Ubuntu上安装(用mpd做进程管理)
本文在经过大量的实验终于不负众望成功的在两台Ubuntu 12.04上部署MPI的一个小型集群,MPICH2所用版本为mpich2-1.4.1,下载地址:http://www.mcs.anl.gov/ ...
- int, NSInteger, NSUInteger, NSNumber的区别
新手在接触iOS或者Mac开发的时候,看到int和NSInteger,一般不清楚应该用哪个比较合适.我们先来查看下NSInteger的定义 #if __LP64__ || (TARGET_OS_EMB ...
- ExtJS智能提示工具spket安装与破解
用myeclipse写java程序,最怕的是什么呢,写javascript代码,原因很简单,没有智能提示,ExtJS是完全js代码的界面库,写起来就更痛苦了,幸好有人做了spket插件,此文采用傻瓜式 ...
- 136 Single Number(找唯一数Medium)
题目意思:一个int数组,有一个数只出现一次,其他数均出现两次,找到这个唯一数 知识普及:~:非运算,单目运算符1为0,0为1; &:与运算,都为1则为1,否则为0 |:或运算,全为0则为 ...
- javascript权威指南学习笔记2
Javascript语言核心(2~12章) 第三章:类型.值.变量 1.数字: overflow(Infinity, -Infinity).underflow(+0,-0) 非数字值:它和任何值都不相 ...
- MongoDB-启动的时候出现了问题
之前MongoDB启动的时候是正常的,不知道后来启动报错了,就把粘贴出来查询了.最后才知道是由于自己不正常的关闭导致的这个情况. --摘录:MongoDB非正常关闭后修复记录 mongod没有后台执行 ...
- Delphi笔记(GL_Scene四轴飞行器模型)
有了前的一篇做铺垫,已经简单的说了GL_Scene的下载安装和一个简单的实例制作.现在就要开始制作一个3D的模型了,具体的步骤就不再这里多说了,直接上图和代码吧! [第一版]先看一下最开始的版本吧,比 ...
- C# 取小数点
1.Math.Round(0.333333,2);//按照四舍五入的国际标准2. double dbdata=0.335333; string str1=String.Format("{0: ...