Unity游戏开发之游戏动画(Unity动画系统)
文章目录
- Unity动画系统
- 动画片段 Animation Clip
- 在Unity中制作动画
- 动画复用
- 替身系统 Avatar
- Animator 组件 Animator Component
- 动画状态机 Animator Controller
- 动画状态
- 动画状态的类型
- 动画状态的属性
- 动画状态机----动画转换
- 转换属性的配置面板
- 动画状态机---层级和参数
- Layers 用于组合动画
Unity动画系统
Unity动画系统分为
- 动画片段 Animation Clip: 动画资源,与模型无关
- 动画状态机 Animator Controller:帮助我们跟踪当前动画的播放状态,并且根据设置觉得如何切换动画片段
- 动画组件 Animator Component:玩家角色需要播放动画功能时,需要动画组件,将游戏对象需要的动画状态机(以及替身)放入该组件,之后便可以在游戏脚本中自由访问该组件,从而自由控制游戏对象动画。
- 替身 Avatar:人形动画骨骼的标准,所有按照同一标准配置好的人形角色都可以播放同一套动画。
动画片段 Animation Clip
在Unity中制作动画
- 点击Window,打开animatioin窗口
- 选中需要制作动画的物体,点击create,选择一个位置保存。
Unity为我们在保存位置生成了一个动画片段(.anim) 文件和一个pivet 动画状态机(.controller),
并且,在需要制作动画的物体上挂在了一个Animator
组件
注:动画片段文件(.anim)是使用标记语言YAML编写的文件(Unity中绝大多数文件都是使用YAML来记录的)
- 选中物体,切换到Animation视图,选中这里的add Property,选择要对哪些属性进行变换
- 时间标尺的默认长度为1s,在起始位置0s和结束位置1s处各有一个关键帧。
- 选择对应的关键帧,或在任意位置修改数据,即可创建关键帧。修改关键帧后,中间的帧可根据两边关键帧插值计算得到。
- 点击左下角的Curves,我们就能已曲线的形式观察并修改当前的动画片段
- 打开动画片段文件(.anim),在检视视图下看到Euler:1,说明包含一段欧拉角运动。
动画复用
当动画文件只对应一个物体的时候,可以复用到任何一个物体上。
当动画文件要处理多个物体或多个游戏对象时,会在文件中写上该物体的对象名称,unity会通过文件里的这个名称找到正确的游戏对象。
如果游戏对象的名字和动画文件中的不一致,就无法正常播放。
动画复用,当骨骼结构一致,命名也一致,就可以对动画文件进行复用。
当骨骼结构相似,但动画命名不一致时,修改命名以及骨骼系统就可以复用动画,但Unity对人形骨骼有简便的处理方式:Avator
替身系统 Avatar
当两个角色的命名方式不一样时,动画不能复用。
如下:名称不匹配,会在Animation窗口显示Missing!
使用替身系统,需要为两个模型都添加替身,使得两模型替身命名方式相同。
- 对模型创建Avatar,对所有模型创建,并可在Avatar配置中对模型的修改量进行参数设置。具体可看【Unity动画系统详解 四】八分钟理解并掌握Avatar和人形动画复用【Unity开发入门教程12】 5:05
- 对A模型的动作配置A模型的Avatar,对B模型的动作配置B模型的Avator。
- 新建Animator Controller,在动画状态机中添加动作。
- 对场景中的角色模型添加Animator组件,不同的模型选择不同的Avatar,但可以共用相同的动画状态机。
Animator 组件 Animator Component
- Controller 动画状态机
- Avatar 替身系统:在组件这里,还担任了一个传令兵的职责,会在当前对象以及子对象中层层寻找符合要求的模型。
- Apply Root Motion:有些动画自带位移,如果希望动画位移应用在游戏上,则勾选。
- update mode:动画的刷新模式(重新计算每个骨骼结点的位置转向和缩放的数值)
- normal:和帧率同步(update())
- Animate Physics:与物理引擎同步(fixedUpdate())
- Unscaled Time:和帧率同步,但会忽略时间标尺,及当修改时间标尺(游戏中1s对应现实2s,则Unscaled Time不受影响)
- Culling Mode 剔除模式: 当游戏对象没有被看到时,如何处理
- Always Animate : 动画不受影响
- Cull Update Transforms:剔除关于IK之类的操作
- Cull Completely:完全停止动画
动画状态机 Animator Controller
动画状态
动画状态的类型
- 单独的动画片段
添加单独动画片段的三种方法
1. 新建空状态,再添加动画
2. 选中动画,右键添加
3. 直接拖动动画
- 多个动画片段组成的混合书 Blend Tree
- 另一个动画状态机
动画状态的属性
- 名称:修改状态机中展示的文本,以便管理
- 标签Tag:给不同的动画状态打上标签进行分类,可在脚本中便于统一管理
//获取当前状态机正在播放的动画状态
AnimatorStateInfo stateInfo = animator.GetCurrentAnimatorStateInfo(animator.GetLayerIndex("层级名称"));
//通过标签对不同的标签动画,做不同的事
if(stateInfo.isTag("标签名称")){......
}
- Motion :动画片段或混合树
- Speed:动画的播放速度(不能通过脚本更改)
- Multiplier:动画实际速度为Speed与Multiplier的乘积(设置Parameter后,可通过脚本修改参数)
- Motion Time:播放动画的时间点(注意:只会播放单帧)【适合制作单帧2D动画】
- Mirror:镜像动画
- Cycle Offset:动画播放的起始位置[0,1]
- Foot IK:使用了IK的动画矫正机制
- Write Defaults :默认开启,是否为其运动未动画化的属性写回默认值。但是有很大的坑,一般情况下禁用。
[Unity] AnimatorStates中的write defaults详解:https://blog.csdn.net/rickshaozhiheng/article/details/77838379
动画状态机----动画转换
点击状态,可看到状态下的所有转化。
- 如果有勾选Solo的转化,只对勾选Solo的状态转换,
- 哪个转换的条件先满足,就执行哪个转换。
- 如果条件同时满足,则执行最上面的转换
- 如果没有勾选Solo的转换
- 对勾选了Mute的转换永远不会执行
转换属性的配置面板
- Has Exit Time : 当前动画状态播放到某个时间点的时候,就执行这个转换。如果不勾选,就必须在Conditions下对转换添加其他条件。
- 展示图
- 最上方的白线:Root motion动画在水平方向上的位移
- Exit Time:动画开始转化的时间(勾选Has Exit Time下有效)
- Fixed Duration : 转换的持续时间
- 勾选(按秒读),后面有(s)
- 不勾选(按百分比读),后面有(%)
- Transition Offset:进入下一个动画片段时下一个动画开始播放的偏移量,取值[0,1]。
- Interruption Source : 表示哪些转化可以打断当前这个转换
- None:当前这个状态不可被打断
- Current State:可以被当前出发状态的其他转换打断
- Next State:可被从目的状态出发的其他转换打断
- Current State Then Next State:出发状态的其他状态优先
- Next State Then Current State:目的状态的其他状态优先
- Ordered Interruption:默认被勾选,只有优先集比当前转换的优先级高的转换才可打断当前转换(点击状态,状态转化栏中,越靠上的优先级越高)。不勾选的话,则不考虑优先级。
- Conditions
- 使用setTrigger,setInt等激活触发器或来改变条件的值设置值
- 如果与Trigger相关联的动画并没有被执行,trigger就会一直处于激活状态,直到转换被执行。
- 转换条件可以设计多条,之间的关系为逻辑与(当所有条件都满足时才会转换)
动画状态机—层级和参数
Layers 用于组合动画
- 权重:当前层级会在多大程度上影响整个动画的最终表现
- Mask用于层级遮蔽,过滤不受影响的点,既可以在Humanoid中点击设置,也可以在Transfrom中精准设置可以被影响的点
使用Mask后,【层级会标注M来表示】。 - Blending【覆盖override、添加additive】
- sync 同步:与某个层级保持一致、状态转化相同
- Timing
- IK Pass:当前层级使用IK则打开【层级会标注IK来表示】
越向下,优先级越高
- Parameters
//修改参数值
animator.SetFloat("参数名称",值);
animator.SetBool("参数名称",值);
//内部会自动转为Hash值,及如下方法
animator.SetFloat(Animator.StringToHash("参数名称"),值);
//获取参数值
animator.getInt("参数名称");
Unity游戏开发之游戏动画(Unity动画系统)相关推荐
- 《C++游戏开发》笔记十一 平滑动画:不再颤抖的小雪花
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9430645 作者:七十一雾央 新浪微博:http:// ...
- Unity游戏开发之游戏存档方式
目录 1.Unity自带存储方式PlayerPrefs 2.XML存储方式 3.Json类型存储方式 1.Unity的序列化问题 2.Unity中支持序列化的类 3.Unity中Json的使用方法 4 ...
- 雪碧图 游戏开发_Android游戏开发–雪碧动画
雪碧图 游戏开发 如果到目前为止您仍然关注该系列 ,我们将在处理触摸,显示图像和移动它们方面广为人知. 但是,动态图像看起来很呆板,因为它看起来确实是假的和业余的. 为了给角色一些生活,我们将需要做更 ...
- 2D横板解谜类游戏开发日志-角色移动和动画
2D横板解谜类游戏开发日志-角色移动和动画 一.创建角色 1新建精灵 2拉入素材 3添加组件*2,方便后续使用 4创建动画文件夹,动画帧素材丢进去(方便以后管理 5创建代码文件,挂在player对象上 ...
- 【游戏开发】定时器循环播放动画
//Windows窗口头文件 #include <windows.h>//swprintf_s函数包含的头文件 #include <tchar.h>//PlaySound函数包 ...
- 游戏开发入门(七)特效系统
视频链接:游戏开发入门(七)特效系统(6节课 时常:约2小时20分钟) 该视频课程与其他本系列的课程不太一样,因为在很多游戏或者很多引擎中并没有一个专门的"特效系统",而是把各种特 ...
- 微信小游戏开发教程-游戏实现1
微信小游戏开发教程-游戏实现1 概述 微信开发者工具官方提供一个飞机大战的游戏Demo,这里我们不再使用这个demo,我们以FlappyBird为例,为了让读者更加容易理解. 源码 https://g ...
- android_Android游戏开发–基本游戏架构
android 因此,我们启动并运行了我们的Android应用程序,但是您可能想知道哪种类型的应用程序正是游戏. 我会尽力让您了解它. 下图显示了游戏架构. Android手机上的游戏架构 在上面的架 ...
- 游戏开发技术——游戏引擎
游戏开发技术--游戏引擎 是什么:游戏引擎是指一些已编写好的可编辑电脑游戏系统或者一些交互式实时图像应用程序的核心组件.这些系统为游戏设计者提供各种编写游戏所需的各种工具,其目的在于让游戏设计者能容易 ...
- android 开发游戏_Android游戏开发–基本游戏循环
android 开发游戏 在到目前为止的系列之后,您将对游戏架构有所了解. 即使只是短暂的一次,但我们知道我们需要以某种形式进行输入,更新游戏的内部状态,最后将其渲染到屏幕上,并产生一些声音和/或振动 ...
最新文章
- c#v2.0 扩展特性 翻译(1)
- SQL语句,统计一段时间内有多少个工作日
- Excel中将时间格式转化成时间戳格式
- Elasticsearch调优实践
- 【Flutter】开发之功能篇(七)
- what does the checkbox Continue mean in Text Access Sequence customizing
- 先序中序数组推后序数组
- metasploit基本使用方法
- 索尼申请“Pregius S”商标 或用于CMOS图像传感器
- 力扣算法题—076最小覆盖子串
- 梅西、内马尔谁是全能的五边形战士?教你用BI做出可视化能力图
- 如何在 Python 数据中灵活运用 Pandas 索引?
- 带有自定义适配器示例教程的Android ListView
- 基于大数据的推荐算法综述
- 计算机硬盘哒哒响,教你轻松解决硬盘异响(咔咔或者嗒嗒声)
- JS实现页面保存为图片
- 物联网技术,主要包括哪些核心技术
- 大数据血缘分析系统设计
- 基于MySQL毕业设计题目50例
- 案例研究|蜜雪冰城65亿背后的差异化商业模式创新