(转) Unity3D中角色的动画脚本的编写(三)
在上一篇,我们具体的讲解了有关动画的融合,也提到了有关动画状态的权重问题。那么这次,我来以一个例子的形式来向大家讲解动画的叠加,或许会涉及到多方面的知识,我力求一次讲清。好了,我们开始吧!
首先我们必须新建一个工程,我取名为:AnimaitonTestTuriol。我们需要一个模型,这里我刚好从从官方的
CharacterAnimation这个工程中抠出了一个:Soldier。然后我将其导入到了次工程文件夹下面的,然后简单的错了一个场景,取名为:AnimationAdditive,下图就是我们的工程预览:

然后我们新建一个名为CustomScripts的文件夹,用于存放我们接下来要建立的脚本文件。
我们此次的目的是要能够在脚本中熟练运用动画的叠加方法。那么什么是动画的叠加呢?所谓动画的叠加,就是指我们可以在任意动画上面来叠加动画效果。这就非常棒了,因为这项功能可以削减美术为游戏角色创建的动画片段的数量,既减小了工程所占用空间的大小,又对简化了我们的代码编写。官方举了一个例子,大体上是这样的:加入我们有一个角色,具备基本的“站立”,“跑步”,“左倾”,“右倾”的动画,我们还想让其在跑步图中转身时有一种倾斜的效果,比如左转弯时不只是播放跑步的动画,而且还叠加了一个左倾的(或者右倾的)动画。如果我们不用叠加,那么我们势必会多创建两个动画效果:“跑步时左倾”,“跑步时右倾”。一旦有了动画的叠加,我们根本就不需要去做这两个动画片段,厉害吧!那么我们该怎么去实现这个呢?
我们首先要知道怎么去叠加动画,为此,我们必须了解一下这个属性:AnimationState.blendMode,即混合模式。此属性的返回值类型为AnimationBlendMode ,我们看文档:
这里只有两个变量:Blend和Additive。在默认状态下,Animation组件所管理的每个动画状态的混合模式都是:
AnimationBlendMode.Blend,即融合模式,我们只有在程序中才能对其进行相应的修改。如果你将此动画模式修改成了Additive,那么你的这个动画状态就具备叠加到其他动画上的功能了,此时你只需动态的调节这两个动画状态之间的权重就可以产生相应的叠加动画了。下面我来编写一个试验性的脚本来证明我们的猜想,我为这个脚本取名为:
AdditiveAnimaitonTest1,代码如下:
using UnityEngine;
using System.Collections;
public class AdditiveAnimaitonTest1 : MonoBehaviour {
private AnimationState***n;
private AnimationState leanLeft;
void Start () {
animation.wrapMode = WrapMode.Loop;//声明各动画状态的播放方式为循环模式
***n = animation["***nSlow"];//实例化成员变量
leanLeft = animation["leanLeft"];
if ***n)
{
***n.weight = 1f;//设定动画状***n的混合权重为1
***n.layer = 10;//让这个动画状态的layer为最高层10
***n.enabled = ***e;//启用此动画状态
}
if (leanLeft)
{
leanLeft.weight = 1f;
leanLeft.layer = 10;//让此动画状态***n为同一层,又由于此动画状体的混合权重也为1,那么其获得动画混合权重的几率***n一样
leanLeft.enabled = ***e;//启用此动画状态
leanLeft.blendMode = AnimationBlendMode.Additive;//将此动画状态设定为叠加模式
}
}
void OnGUI()
{
GUILayout.BeginHorizontal();//利用拖动条来控制每种动画状体的权重
***n.weight = GUILayout.VerticalSlider***n.weight,1.0f,0.0f);
leanLeft.weight = GUILayout.VerticalSlider(leanLeft.weight, 1.0f, 0.0f);
GUILayout.EndHorizontal();
}
}
上面的代码比较少,可是里面所涉及到的内容却并不那么容易理解。因为这次我们不是靠明显代码来播放动画,而是依靠调节权重来实现的。为了理解这个方法的原理,我们必须明白一个结论:假如一个动画状态被激活了,例如:animation["idle"].enable = ***e ,那么此动画就会处于播放状态(此时没有执行类似:
animation.Play或者animation.CrossFade之类的语句)。不信的话你可以在上面的Start()函数中写下以下语句:
if(animation.IsPlaying("idle")){
Debug.Log("idle is***nning!");
}
if(animation.IsPlaying("leanLeft ")){
Debug.Log(" leanLeft is***nning!");
}
我相信第二个if语句中的Debug会被打印出来,而第一个则不会,不信你试试。
好了,我们运行一下游戏吧!
我们试着调节一下Game视图中的垂直滚动条,可以发现,动画的效果改变了:

我想读者一定按捺不住现在的心情了。我们成功的将左倾动画与跑步动画给叠加起来了,虽然例子很简单,但是我想我们应该可以叠加更多的动画了。希望读者能够认真体会。还有一点,官方CharacterAnimation工程中的第四个场景中的代码完整的展现了动画叠加的精髓,我的这个Solider就是从这个场景中抠出来的,感兴趣的读者不妨分析一下里面的代码,保证获益颇丰。如对本篇难以理解的不让留个言,或者加qq:1597725465,本人一定亲囊相受。下一篇,我准备介绍一下“动画混合”,他是可以将某个动画片段加到角色的某个部位的,非常神奇,但也有一些限制因素。敬请期待我的下一篇文章!
(转) Unity3D中角色的动画脚本的编写(三)的更多相关文章
- 转 [教程] Unity3D中角色的动画脚本的编写(二)
在上一篇,我们介绍了有关Animation这个类中的部分方法,我后来想了想,这么介绍也不是个办法(其实有些方法我自己也没用过),该介绍点实际的东西了,毕竟我们是要做东西出来的.那好 ...
- (转) [教程] Unity3D中角色的动画脚本的编写(一)
ps: 这两天研究unity3d,对动画处理特别迷糊,不知FBX导入以后,接下来应该怎么操作,看到这篇文章,感觉非常好,讲解的很详细. 已有好些天没写什么了,今天想起来该写点东西了.这次我所介绍的内容 ...
- 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: 代码里面强制要 ...
随机推荐
- HTML5的Server-Sent Events (SSE)
HTML5有一个Server-Sent Events(SSE)功能,允许服务端推送数据到客户端.(通常叫数据推送).我们来看下,传统的WEB应用程序通信时的简单时序图: 现在Web App中,大都有A ...
- C#应用程序获取项目路径的方法总结
一.非Web程序 //基目录,由程序集冲突解决程序用来探测程序集 1.AppDomain.CurrentDomain.BaseDirectory //当前工作目录的完全限定路径2.Envi ...
- YII 验证功能
YII 表单的验证可以在module目录下的xxx.php里面定义验证方法,设定需要验证的字段就行 //用户表单验证,在模型里面设置一个方法,具体表单验证规则 public functi ...
- ubuntu install opengrok
总结: 1. 安装jdk和tomcat 2. 安装ctags 3. 解压opengrok.tar.gz包, 然后将source.war复制到tomcat/webapp下面 sudo cp -R ope ...
- 一次性安装src.rpm编译所依赖的软件包
yum-builddep SRPMS/fcitx-4.2.8.4-4.1.cgdl21.src.rpm NAME yum-builddep - install missing depend ...
- day11基础代码——函数指针
// // main.m // Demo11 // // Created by scjy on 15/10/29. // Copyright © 2015年 lizhipeng. All ri ...
- 最新选择Godaddy主机方案美国数据中心教程指导
随着Godaddy官方管理层的变动之后,主营重心已经从当初的域名开始转向到域名和主机产品上.这点我们从其发布域名优惠信息的频率也可以看到,而且我们可以看到常年的主机半价优惠,以及针对主机销售年付方案赠 ...
- 快速替换图片的组合-AE-样片!
模板下载网址:http://pan.baidu.com/s/1hqCbErM
- Infinite Scroll–无限分页
一.前言 现在有很多网站都有这样的交互 1.当你往下浏览页面时,页面会自动去异步加载数据. 无限分页效果 infinite scroll 效果图 –ifxoxo.com 2.在页面下方有一个“点击加载 ...
- [BZOJ 1303] [CQOI2009] 中位数图 【0.0】
题目链接:BZOJ - 1303 题目分析 首先,找到 b 的位置 Pos, 然后将数列中小于 b 的值赋为 -1 ,大于 b 的值赋为 1 . 从 b 向左扩展,不断算 Sum[i, b - 1] ...