第三十二章 Unity Mecanim动画系统(上)
在上一章节中,我们介绍了Unity的旧版动画系统,本章节来介绍新版的Mecanim动画系统。新版的Mecanim动画系统实际是对旧版动画系统的升级。新版的Mecanim动画系统仍然是建立在动画片段的基础上的,只不过它给我们提供了一个可视化的窗口来编辑动画片段之间的切换逻辑。接下来,我们重新创建一个新的场景“SampleScene2.unity”。为了能够做区分,我们重新复制一份新的Elf的FBX文件到当前工程来。

 
接下来,我们选中“Elf2”里面的FBX文件,查看Inspector检视视图,

这里我们选择默认的“Generic”即可使用新版的Mecanim动画系统。然后我们再去“Animation”中重新分割四个动画片段,这个过程不再详细介绍了。

分割完毕,为了不混淆,我们给动画片段起了新的名字。接下来,我们将Elf2下的FBX文件拖拽到新场景中来。

我们上一个章节中介绍了,旧版动画系统使用的是“Animation”组件,而新版的动画系统使用的是“Animator”组件。因此,我们给“Elf”游戏对象添加这个组件,如下

关于这个Animator组件,我们简单介绍一下。
首先介绍一下“Apply Root Motion”勾选项,如果勾选的话,行走动画的播放会同步调整Transform组件。如果不勾选的话,播放行走动画的时候,需要我们使用代码来控制Transform组件。动画片段中本身就是移动,旋转和缩放矩阵,因此使用动画片段播放的同时,是可以根据片段中的矩阵来同步Transform组件中的移动,旋转和缩放的。
然后再说一下Update Mode这个选项。Normal表示动画使用update方法进行更新。这个应该是默认吧。Animate Physics表示使用FixUpdate方法进行更新,一般用于和物体有交互的情况下。UnScaleTime表示无视timeScale进行更新,一般用于UI动画。
最后再说一下Culling model,它用来控制角色在场景中动画显示方式。默认值Always Animate表示角色总是会执行动画,即使角色不在摄像机范围内也执行动画。BaseOnRender表示当角色不在摄像机范围内时,角色仅仅播放自身带有Root Motion,而身体中的其他动画就不播放。
接下来,我们介绍“Animator”组件的第一个参数就是“Controller”,也就是动画控制器。它本质是一个文件,但是需要我们使用“Animator”窗口来编辑。请注意哦,一个是“Animator”组件,一个是“Animator”窗口,两者是不一样的。首先,我们在Asset资源面板中创建一个动画控制器,右击Asset资源面板空白处,选择“Create”->“Animator Controller”,我们将其重命名为“GenericAnimatorController”,它的文件类型后缀为“.controller”,我们也可以到工程目录的Asset文件夹下看到这个文件。

创建该文件完毕后,我们双击打开它,Unity会自动启动“Animator”窗口来打开它。

如上图所示,这个“Animator”窗口分为左右两部分,左边是动画层和动画参数编辑区域,右边是动画剪辑编辑区域。右边的区域可以使用鼠标滚轮进行缩放,也可以按下鼠标滚轮来拖动。我们首先介绍右边的区域,里面可以看到三个不同颜色的圆角矩形块,我们称之为“动画状态机”,其实可以简单理解为一个动画片段(两者概念相似)。“Any State”代表任意一个动画状态(动画片段),其作用是指向的动画片段在任意时刻都可以切换过去的状态,当然也包含自己切换自己。“Entry”表示进入“动画状态机”的默认动画状态(动画片段),该状态连接的动画片段就是进入状态机后要执行的第一个播放的动画片段。而“Exit”则表示离开“动画状态机”的动画状态(动画片段)。如果一个动画片段指向该出口,表示可以通过该状态退出当前动画状态机。既然是编辑动画片段,我们就先将动画片段拖拽进来吧。

我们选中“idle2”,“walk2”,“run2”和“dead2”四个动画片段,然后拖拽到“Animator”窗口右边的编辑区域。

拖拽进来之后,我们发现Unity自动会将“Entry”的状态机连接到其中某一个动画片段,例如“dead2”这个动画片段。它代表的意思就是默认动画(橙色表示默认动画),回想一下我们使用“Animation”组件的时候,同样也设置过默认动画,道理是一样的。很显然,死亡动画是不对的,应该是待机动画“idle2”,如何修改呢?非常简单,我们只需要在“idle2”上右击,然后选择里面的“Set as Layer Default State”即可,如下所示:

 
因为默认动画只有一个,因此,当我们设置idle2为默认动画的时候,之前的dead2就不是默认动画了,它从橙色变回了灰色。既然有了默认动画,那我们就看看如何播放它吧。回到我们的Scene视图,将我们的动画控制器“GenericAnimatorController.controller”文件拖拽到Elf游戏对象的Animator组件下的Controller项目下,

接下来,我们就可以运行工程,查看效果了。

我们的默认动画“idle2”已经可以播放了。那么问题来了,如何播放其他动画呢?我们还需要回到“Animator”窗口中继续编辑我们的“GenericAnimatorController.controller”文件。在大部分的游戏中,基本上游戏角色默认都是待机状态,然后从待机状态切换到走路或者跑步状态。因此,我们可以从待机“idle2”向走路“walk2”和跑步“run2”分别做两个“Transiton”,翻译过来就是“过渡”的意思。其实,我们仔细想想,动画播放的本质就是从一个动画片段“过渡”到另一个动画片段。动画逻辑的复杂度也就在于此了,大量的“过渡”就会造成我们的动画播放逻辑非常的混乱。如何创建“idle2”到“walk2”的“Transiton”呢?我们在“idle2”上面右击,选择其中的“Make Transiton”,如下所示:

点击“Make Transiton”之后,我们移动鼠标,就会出现一条带箭头的线,

我们将线放置到“walk2”上面后鼠标点击完成,这样就完成了idle2到walk2的连接。我们继续右击idle2选择“Make Transiton”,将线放置到run2上面后鼠标点击完成。这样,我们就建立了两条“过渡”线了。

默认情况下,线是白色的,如果我们点击其中一条线的话,就会以蓝色显示。如果我们创建错的线,可以选择该线(蓝色显示)后按“delete”键删除即可。现在,我们已经创建了idle2到walk2和run2的过渡了,那么什么情况下回执行idle2到walk2的过渡呢?又会在什么情况下执行idle2到run2的过渡呢?这时候,我们需要继续设置“过渡条件”。这条线相当于一座桥,连同两个动画片段,而“过渡条件”就是“通行证”,有了对应的“通行证”,才能决定是idle2切换到walk2,还是idle2切换到run2。如何设置这个“过渡条件”呢?由于该部分内容太多了,我们下个章节继续介绍。
本课程涉及的内容已经共享到百度网盘:https://pan.baidu.com/s/1e1jClK3MnN66GlxBmqoJWA?pwd=b2id
相关文章:
 
第三十二章 Unity Mecanim动画系统(上)
在上一章节中,我们介绍了Unity的旧版动画系统,本章节来介绍新版的Mecanim动画系统。新版的Mecanim动画系统实际是对旧版动画系统的升级。新版的Mecanim动画系统仍然是建立在动画片段的基础上的,只不过它给我们提供了一个可视化的窗口来编辑动…...
 
第二章 集合
系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目…...
 
这一篇Databinding应该可以帮助迅速上手吧
Databinding使用篇(迅速上手) 使用前需要在模块级别的build.gradle里面的android闭包里添加: dataBinding{enabled true}接着在layout文件中按下Alt 回车, 将布局转换成data binding layout即可,此时编译就会生成对…...
 
【PHP在线定制商城网站源码V3.0】开源的DIY在线定制商城系统+在线礼品定制
源码下载:https://download.csdn.net/download/m0_66047725/87637177 PHP在线定制商城网站源码,免费开源、免费下载。本商城基于mycncart开发。安装成功后即可浏览,你可以在后台->安装扩展功能上传安装插件,在代码调整中点击刷…...
 
cout源码浅析
目录 cout源码浅析 那么对于没有定义在这之中的要怎么办呢? 实际使用 结语 首先来看我从cplusplus中截取的这张图: 注意最下面这一行字。cout其实是ostream的一个标准对象object。而上面则演示了一些继承关系。 好的,理解了之后…...
 
发送Ajax get请求详解
发送AJAX get请求,前端代码: <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title>ajax get请求</title> </head> <body> <script type"text/java…...
SQL语句
创建及删除数据库和表 CREATE DATABASE 数据库名; CREATE DATABASE school; 创建新的表 CREATE TABLE 表名(字段1 数据类型,字段2 数据类型[,...] [,PRIMARY KEY (主键名)]); #主键一般选择能代表唯一性的字段,不允许取空值(NULL),值也不允许重复&…...
 
Mysql 学习(八)单表查询方法二
复杂查询 上一节说了5种访问类型的查询,这一节就来说说关于这些比较复杂的查询 情况一:多个二级索引查询 sql:SELECT * FROM index_value_table WHERE value1 abc AND value2 > 1000;搜索条件: value1 等于 abcvalue2 大于…...
 
安卓系统下的截屏和录屏
可以抓取手机屏幕画面(屏幕截图),也可以录制屏幕画面视频。拍摄屏幕后,可以查看、编辑和分享所拍的图片或视频。 抓取屏幕截图 打开要抓取的屏幕。视手机情况执行下列一个操作,3种方法看你手机有效的: 同…...
 
行为型模式-中介者模式
中介者模式 概述 一般来说,同事类之间的关系是比较复杂的,多个同事类之间互相关联时,他们之间的关系会呈现为复杂的网状结构,这是一种过度耦合的架构,即不利于类的复用,也不稳定。例如在下左图中…...
辅助驾驶功能开发-功能规范篇(16)-2-领航辅助系统NAP-功能ODD定义
1.系统定义 智能驾驶系统包含行车场景功能和泊车场景功能,行车场景功能包括安全ADAS功能、基础ADAS功能和高阶ADAS功能三大类,本文档定义高阶ADAS功能中的导航辅助驾驶功能用例。 1.1.高阶ADAS功能列表 功能需求ID 功能分类 功能名称...
 
PMP/高项 06-项目成本管理
项目成本管理 概念 项目成本管理 项目成本管理又被称为项目造价管理,是有关项目成本和项目价值两个方面的管理,是为保障以最小的成本实现最大的项目价值而开展的项目专项管理工作。 确保在批准的项目预算内完成项目 成本管理内容 规划成本管理 制定项目…...
 
XXL-JOB中间件【实现分布式任务调度】
目录 1:XXL-JOB介绍 2:搭建XXL-JOB 2.1:调度中心 2.2:执行器 2.3:执行任务 3:分片广播 1:XXL-JOB介绍 XXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学…...
 
Vue3+Element Plus环境搭建和一键切换明暗主题的配置
Vue (发音为 /vjuː/,类似 view) 是一款用于构建用户界面的 JavaScript 框架。而Element Plus是一款基于Vue3面向设计师和开发者的组件库。 最终效果: 环境搭建 已安装 16.0 或更高版本的 Node.js,终端: npm init vuelatest这一…...
 
Leetcode326. 3 的幂
Every day a leetcode 题目来源:326. 3 的幂 相似题目:342. 4的幂 解法1:递归 代码: /** lc appleetcode.cn id326 langcpp** [326] 3 的幂*/// lc codestart class Solution { public:bool isPowerOfThree(int n){if (n <…...
【运动规划算法项目实战】如何在栅格地图中实现Dijkstra算法
文章目录 简介一、算法介绍1.1 Dijkstra算法流程1.2 Dijkstra算法伪代码二、代码实现2.1 ROS实现2.2 RVIZ演示三、总结简介 Dijkstra算法是一种用于图中单源最短路径的贪心算法。在计算机科学和网络设计中广泛应用。该算法从起点开始,通过优先选择距离起点最近的未标记节点来…...
 
【算法】一文彻底搞懂ZAB算法
文章目录 什么是ZAB 算法?深入ZAB算法1. 消息广播两阶段提交ZAB消息广播过程 2. 崩溃恢复选举参数选举流程 ZAB算法需要解决的两大问题1. 已经被处理的消息不能丢2. 被丢弃的消息不能再次出现 最近需要设计一个分布式系统,需要一个中间件来存储共享的信息…...
 
【软考高级】2022年系统分析师综合知识
1.( )是从系统的应用领域而不是从系统用户的特定需要中得出的,它们可以是新的功能性需求,或者是对已有功能性需求的约束,或者是陈述特定的计算必须遵守的要求。 A.功能性需求 B. 用户需求 C.产品需求 D.领域需求 2.对于安全关键系…...
关于AI未来的思考和应用场景
关于AI未来的思考和应用场景 AI(人工智能)是当今最热门的技术领域之一,它已经在多个领域产生了深远的影响,如医疗、金融、制造业等。未来,AI将继续发展,并在更多领域产生重要的影响。 AI的未来发展方向有…...
 
智慧城市规划数字化管理:数字孪生技术的创新应用
随着智能城市的不断发展,数字孪生技术也开始在智慧城市的建设中得到了广泛应用。数字孪生作为一种数字化的复制技术,它可以模拟真实世界中的实体和过程。 在城市规划方面,数字孪生可以帮助城市规划师更加直观地了解城市的整体规划和发展趋势&…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
 
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
 
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
 
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
 
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
 
LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...
 
基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...
 
Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)
引言 工欲善其事,必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后,我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集,就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...
