Unity4新的动画系统Mecanim_寒冰骑士的博客-程序员宅基地

技术标签: unity  动画  Unity实用技术技巧  Mecanim动画  animation  

Unity4新的动画系统Mecanim

热度 6910 2014-7-4 22:54 |个人分类:Unity3D| 动画系统

Unity4.X中添加的新的动画系统取代了原来3.X的旧的动画系统,新动画系统Mecanim也是官方推荐的,使得我们写较少的代码来实现连续的动画效果。

效果图


Unity3.X中动画系统播放动画

使用播放play()或淡入淡出播放CrossFade()

例如:

[csharp]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. animation.Play("name");  
  2. animation.CrossFade("name");  
也可以做成队列动画,然后播放,例如:

[csharp]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. animation.PlayQueued("name");  
  2. animation.CrossFade("name1");  
代码实现倒序播放
[csharp]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. animation.Play(clip1);   
  2. animation[clip1].speed = animationspeed * -1.0;   

老的动画系统要实现一个连续的队列动画,是要通过代码来进行逻辑控制,而在新的动画系统中,要实现这一功能将非常方便。例如要根据玩家连续点击按钮的次数来实现一系列动作的组合动画。

例如:

站立动画->攻击1。。。攻击N->站立动画

这之间可以有N个连续动画的组合,可以根据用户点击按钮的频率来判断执行到第几个连续的动画。

如图,一般导入的动画模型都是原始模型没有动画,然后是动画模型,每一个动画模型都依赖原始模型,命名后面+@name,对应的状态动画。


unity4.X版本还保留了原始动画系统,将模型拖放到Hierarchy视图中没有Animation组件而是Animator组件。如果你还想用老的动画系统,就要切换动画的类型Rig->Animation Type->Legacy



Unity4.X中动画系统播放动画

如果我们要让模型改成新动画系统的类型,我们最好用工具,让程序来批量改变模型的类型,建议放在Editor下。

  1. using UnityEditor;  
  2.   
  3. public class MyEditor : AssetPostprocessor {  
  4.   
  5.     public void OnPreprocessModel()  
  6.     {  
  7.         ModelImporter modelImporter = (ModelImporter)assetImporter;  
  8.         modelImporter.animationType = ModelImporterAnimationType.Human;  
  9.     }  
  10. }  

然后将模型拖放Project下,会发现模型的类型会自动修改成Humanoid格式,这种格式一般是人物模型选择该格式。

创建模型的匹配骨骼文件,点击Configure可以预览骨骼。


节约资源起见,其他模型就由这个avatar copy一下即可。


创建动画控制器AnimatorController

Project->Create->AnimatiorController,然后讲模型的Animator下的Controller属性赋值这个动画控制器


然后打开菜单栏的Window->Animator,将动画文件拖放到Animator中,黄色箭头代表根动画,右击选择Set As Default可以设置为根动画,选择Make Transition可以连接下一个动画节点。

每一条连接线都是一个状态,可以通过左下角的Parameters面板添加Bool变量来控制连接线是否连通,从而来改变模型的动画。



设置连接线的连通条件,点击某一条线,然后在Inspector->Conditions选择Parameters里面的Bool值,(这里有一点需要说明:Parameters下面的各种动画状态之间的转换条件都是要手动添加的,最好取能看明白意思的名字,最好还能知道是什么类型的是bool还是int类型等)并且设置它的默认连通状态是ture还是false。

注意:  在Inspector->Conditions选择Parameters里面的Bool值,实际产生的效果是:若在此处设置WalkToRun变量为true;则条件满足时,即可由状态Walk改变到Run的动画状态了!


代码实现人物从等到状态、跑步状态、行走状态的两两状态切换:

[csharp]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. using UnityEngine;  
  2. using System.Collections;  
  3. //Created By Aladdin    http://blog.csdn.net/dingxiaowei2013/article/details/36911203  
  4.   
  5.   
  6. public class AladdinScript : MonoBehaviour {  
  7.   
  8.     public Transform transform;  
  9.     //GUILabel  
  10.     public GUIContent[] GUIContents;  
  11.     //动画控制器  
  12.     private Animator animator;  
  13.     //当前状态  
  14.     private string currentState = "";  
  15.   
  16.     //获取动画控制器  
  17.     void Start () {  
  18.         animator = transform.GetComponent<Animator>();  
  19.     }  
  20.       
  21.     void OnGUI()  
  22.     {  
  23.         GUILayout.BeginVertical("box");  
  24.         for(int i = 0;i<GUIContents.Length;i++)  
  25.         {  
  26.             //如果点击了某个状态的按钮  
  27.             if (GUILayout.Button(GUIContents[i]))  
  28.             {  
  29.                 currentState = GUIContents[i].text;  
  30.             }  
  31.   
  32.             AnimatorStateInfo stateInfo = animator.GetCurrentAnimatorStateInfo(0);  
  33.             //从Wait->Walk  
  34.             if (stateInfo.IsName("Base Layer.wait") && currentState.Equals("Walk"))  
  35.             {  
  36.                 animator.SetBool("WaitToWalk"true);  
  37.             }  
  38.             //从Walk->Wait  
  39.             else if (stateInfo.IsName("Base Layer.walk") && currentState.Equals("Wait"))  
  40.             {  
  41.                 animator.SetBool("WaitToWalk"false);  
  42.             }  
  43.             //从Wait->Run  
  44.             else if (stateInfo.IsName("Base Layer.wait") && currentState.Equals("Run"))  
  45.             {  
  46.                 animator.SetBool("WaitToRun"true);  
  47.             }  
  48.             //从Run->Wait  
  49.             else if (stateInfo.IsName("Base Layer.run") && currentState.Equals("Wait"))  
  50.             {  
  51.                 animator.SetBool("WaitToRun"false);  
  52.             }  
  53.             //从Walk->Run  
  54.             else if (stateInfo.IsName("Base Layer.walk") && currentState.Equals("Run"))  
  55.             {  
  56.                 animator.SetBool("WalkToRun"true);  
  57.             }  
  58.             //从Run->Walk  
  59.             else if (stateInfo.IsName("Base Layer.run") && currentState.Equals("Walk"))  
  60.             {  
  61.                 animator.SetBool("WalkToRun"false);  
  62.             }  
  63.         }  
  64.     }  
  65. }  

运行效果图如上图所示。

欢迎关注我的微博  http://weibo.com/dingxiaowei2013

点击下载工程 http://download.csdn.net/detail/s10141303/7594549

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/chaixinke/article/details/40569965

智能推荐

android后台服务service全解析(下)--service远程通信_安卓server的远程通信-程序员宅基地

前面讲述了service的本地通信,也就是跟启动它的进程本身通信,而接下来还有介绍更为深入的内容,Service的远程通信,也就是跟其他进程的通信。首先我们来看下面一个问题,假设我们使用本地service,我们在onStartCommand()方法了执行了耗时操作,那么主线程将会阻塞,我们这时点击屏幕上的button的时候,就会出现ANR(Android Not Response)。但是假_安卓server的远程通信

作业:三个排序法时间比较-程序员宅基地

分治法数组最大最小差:# 基本子算法(子问题规模小于等于 2 时)def get_max(max_list): return max(max_list)def get_min(min_list): return min(min_list)# 分治法 最小元素def solve(init_list): n = len(i..._136 3296 9836

电商用户行为分析大数据平台相关系列7-spark安装-程序员宅基地

1、Spark安装1.1、下载、解压1.2、配置环境变量(/etc/profile或者~/.bashrc),环境变量生效1.3、配置spark-env.shspark-env.sh位于 $SPARK_HOME/confcp spark-env.sh.template spark-env.sh配置如下export JAVA_HOME=/usr/java/latestexport SCALA_

kafka-producer参数详解_kafkaproducer参数-程序员宅基地

producer参数主要介绍下kafka的producer配置参数,只取了其中的一部分常用的,后续的有时间,也会补充一些,更多的详细参数,可以参考《kafka官网连接》,参数的内容,主要是选取《apache kafka实战》书中的一些讲解和官网相互参看bootstrap.servers该参数指定了一组 host:port 对,用于创建向 Kafka broker 服务器的连接,比如 k..._kafkaproducer参数

linux ubuntu系统忘记root密码的解决办法-程序员宅基地

ubuntu 忘记密码,忘记root密码的解决办法开机选中高级选项 然后按enter键进入菜单选项。选中 recovery mode这一行 按e键进行编辑。找到关键的一行,更改参数,把ro recovery nomodeset 改成rw single init=/bin/bash修改前修改后进入界面以后输入passwd 用户名 更改密码即可,更改完重启就可以了。修改好啦!留下你的足迹,点个赞吧。以下是参考链接 https://www.cnblogs.com/relaxgirl/p_ubuntu系统忘记root密码

通过非暴力推广国产操作系统的可行性分析-程序员宅基地

通过非暴力推广国产操作系统的可行性分析最近有人说用暴力推广国产操作系统是不可能的,也不会成功,我翻来覆去想了,觉得非暴力推广国产操作系统也不一定会成功。暴力推广就是使用国家权力强制推广,有点简单除暴,而非暴力就是用自由市场的没有行政干预的市场手段去推广,比如广告营销,口碑营销等。到底哪种方式会成功,或者都成功,或者都不会成功,我们来细细分析。国产操作系统有哪些目前国内国产操作系

随便推点

QList中元素去除_qlist移除-程序员宅基地

用removeAT或者takeAt_qlist移除

TV 按键_安卓电视按键绑定app配置文件-程序员宅基地

android后台input命令模拟按键$adb shell input keyevent 4 //模拟返回键(BACK)最近做TV开发,最开始一直用#define KEY_ENTER 28做测试,木有问题,后边外接遥控器的ok按键始终未能映射上来,最终研究发现linux配置文件key 353 DPAD_CENTER java映射_安卓电视按键绑定app配置文件

oracle 快照表找回数据,oralce恢复误删除的表中的数据(闪回、闪回查询)-程序员宅基地

今天,有个朋友和我说,他有个同事误操作将oracle中一个表误删除了,一开始我以为是drop掉了,于是建议闪回表,但是回收站里找不到;后来才知道是delete了所有数据,于是建议回滚或者用闪回查询的办法将数据找回来,但是遇到快照太旧的问题,信息被覆盖了,只能找回部分记录了;得知有备份,于是建议用备份在测试机上尝试恢复;下面做个简单的实验:SQL> desc test名称 是否为空?类型---..._ora 38305

避免最常见的 10 大 JNI 编程错误的技巧和工具_getobjectclass failed to get java thread with thre-程序员宅基地

避免最常见的 10 大 JNI 编程错误的技巧和工具Java 本机接口(Java Native Interface,JNI)是一个标准的 Java API,它支持将 Java 代码与使用其他编程语言编写的代码相集成。如果您希望利用已有的代码资源,那么可以使用 JNI 作为您工具包中的关键组件 —— 比如在面向服务架构(SOA)和基于云的系统中。但是,如果在使用时未注意某些事项,则 JNI 会..._getobjectclass failed to get java thread with thread name: pthread-js-jni

html在线上传,KindEditor 实现图文上传方法介绍-程序员宅基地

KindEditor编辑是一款不错的网页编辑器,它现在可实现从复制word文件档把图片上传到服务器了,下面我们来看看配置KindEditor图文上传方法。1.官网下载ckeditor,解压后去掉不需要的部分,仅需保留plugin,lang,theme文件夹,这三个文件夹中用不到的东西可以删除,比如lang文件下存放所有语言文件js,仅仅保留en.js和zh_CN.js即可,保留jsp文件夹下的js..._kindeditor上传html

let暂时性死区(js面试)-程序员宅基地

var xye = 1;(function () { console.log(xye) xye = 2 let xye = 4 console.log(this.xye) console.log(xye)})()图中输出什么?结果:因为let定义的变量,不能在初始化之前就使用它(console)。所以会抛出一个Uncaught ReferenceErrorps:自执行函数里面的this指向windowvar xye = 1;(function