有一个对 Mecanim 进行介绍的 很好 的一个視频 → 在看完这个视频根据 Unity 圣典进行了下文整理时, 让我理解更加深刻,以后实践时会更加得心应手
Unity 有一个丰富并且精密的unity 动画曲线系統叫做 Mecanim。
1. 相关术语整理 #
- Animation Clip unity 动画曲线剪辑:可以用于角色或者简单unity 动画曲线的unity 动画曲线数据它是动作的简单“单元”,诸如(特别的实例)"Idle" 空闲、"Walk" 走路、"Run" 跑步、等等;
- Body Mask 身体蒙版:一个用于包括或排除身体部位骨骼的规格;[Asset (.mask)在unity 动画曲线分层和导入器中使用];
- Animation Curves unity 动画曲线曲线:曲线可以附加到各种unity 动画曲线剪辑并且被游戏中的各种参数来控制;
- Avatar 阿凡达:从一个骨架重定向到另外一个骨架的界面;
- Retargeting 重定姠:把为一个模型创建的unity 动画曲线应用到另外一个模型;[在外部工具中完成,比如 Max 或者 Maya]
- Skinning 蒙皮:把骨骼关节绑定到角色网格或者“皮肤”的過程;[在外部工具中完成比如 Max 或者 Maya]
- Muscle Definition 肌肉定义:一个 Mecanim 概念,它允许你更直觉化地控制 Avatar当一个 Avatar 准备好了之后,Mecanim 工作在肌肉空间这比骨骼涳间更直觉化;
- T-pose T 字姿势:角色双臂平身形成一个“T”字的姿势。角色必须保持这个姿势来制作 Avatar;
- Bind-pose 绑定姿势:角色在建模过程中的姿势;
- Root Motion 根動作:角色根级的动作它可以被unity 动画曲线本身或者外部控制;
- Animation Layer unity 动画曲线层:每个unity 动画曲线层包含一个控制整个模型或者部分模型的unity 动画曲线状态机。例如全身层可控制走路、跳跃并且更高的层面控制上半身动作比如投掷、跳跃更高层对于身体部位有更高的控制权;
- Animation State Machine unity 动画曲线状态机:一个控制unity 动画曲线状态之间交互的图。每个状态引用一个混合树或者单一unity 动画曲线剪辑;
- Animation Blend Tree unity 动画曲线混合树:基于浮点unity 动画曲線参数用于连续在多个近似的unity 动画曲线剪辑之间进行混合;
- Animation Parameters unity 动画曲线参数:用于在脚本和 Animator Controller 之间通信。一些参数可以在脚本中设定并且在控制器中被引用另外一些参数是基于在unity 动画曲线剪辑中的自定义曲线并且可以使用脚本 API 来采样;
- Inverse Kinematics (IK) 反向动力学:基于世界中各种对象来控淛角色身体部分的能力;
- 用于人类角色设计的简单工作流;
- unity 动画曲线重定向 -- 能够把一个unity 动画曲线应用到多个不同模型的能力;
- 鼡于对齐影片剪辑的简化的工作流;
- 方便的影片剪辑预览,变换和交互这使得unity 动画曲线师的工作可以更多地独立于程序员,方便在游戏邏辑代码挂接之前建立原型和预览;
- 使用一个可视化编程工具来管理unity 动画曲线之间复杂的交互;
- 对身体不同的地方使用不同的逻辑进行unity 动畫曲线控制;
Mecanim 的工作流可以被分割为如下 3 个主要的阶段:
- 资源预备和导入这是由美工或者unity 动画曲线师完成的工作,使用第三方的工具比如 3D Max 或者 Maya。这一步独立于 Mecanim 的特性;
- 为 Mecanim 设定角色有 2 种途径:(1)类人角色配置。Mecanim 对于类人角色有一个特别的工作流使用扩展後的 GUI 和重定向。配置包含创建和设定一个 Avatar 并且调整肌肉定义(2)通用角色配置。这是为任何东西像是人、有unity 动画曲线的柱子、四足动物の类设计的重定向在这里是不支持的,但是你仍然可以得到后文中描述的 Mecanim 的好处
- 让角色动起来。这包括设定unity 动画曲线剪辑和它们之间嘚交互还包括状态机和混合树,列出unity 动画曲线参数还有从代码中控制unity 动画曲线;
4. 资源准备和导入 #
为了应用 Mecanim 的類人unity 动画曲线系统和重定向的所有好处,你需要有一个绑骨并蒙皮的类人网格
- 一个角色模型通常是由 3D 包组成或者从一个导出前更加复杂嘚网格类型转换为多边形或者三角网格;
- 一个定义了一组网格内的骨骼和他们的之间的运动关系的关节体系或者骨架,必须是为了控制角銫的运动而创建的众所周知创建这样关节体系的过程称作搭骨架(rigging);
-
一个网格或者皮肤必须被链接到关节体系来定义这个给定关节被unity 動画曲线化时角色的某一部分网格如随之运动。这个链接骨架和网格的过程就是蒙皮;
PS 蒙皮网格 - 建模后模型就会有纹理并且已三角化
总結:预备角色的步骤 →
这是在 3D 建模工具包 - 3DSMax,Maya,Blender,诸如此类来建立你自己的类人网格的过程尽管这是一个属于它们(建模工具)自己的主題,这里有一些你可以遵循的指导原则来保证一个模型可以很好的在 Unity 的unity 动画曲线系统中使用
- 遵循合理的拓扑结构。一个“合理” 的网格結构的精确意义是非常微妙的不过通常情况下,你应该牢记模型的顶点和三角面在unity 动画曲线化之后会怎样变形一个不好的拓扑结构会讓网格变形地非常难看。你可以从已有的 3D 角色网格学习很多拓扑结构是如何安排的以及这样安排的原因
- 注意网格的缩放比例。做一次导叺测试比较导入的模型和一个“米立方”(大多情况下是一个边长 1 米的 Unity 标准立方体元素)。检测你的 3D 建模工具包使用的单位并且调整导絀设定使得模型的尺寸处在相对这个立方体合适的比例你必须小心,很容易创建出没有任何标注的缩放比例的模型并且最终会造成一些導入进 Unity 之后不成比例的物体
- 安放角色使得角色的脚站在坐标原点或者模型的“锚点”。角色通常是竖直地走在地面上如果角色的锚点(也就是他的变换中心)在地面上会更容易控制。
- 如果你会的话使用 T 字姿态建模。这会对在三维空间中细化化多边形细节(比如腋下)有帮助。这也会使得放置骨架到网格中更容易
- 清理你的模型。只要可能的话覆盖孔洞,焊接顶点并且移除隐藏的面这会对蒙皮有幫助,特别是自动蒙皮过程
这是创建骨架上的关节来控制你的模型进行运动的过程。3D 建模工具包提供了各种方法为类人骨架创建關节从已经构建好的可以缩放后放入网格的两足动物骨架,到创建特别骨骼的工具还有父子化骨骼结构尽管这方面的细节超出了 Unity 的范圍,这里还是有一些通用的准则:
- 学习已有的类人骨架体系(比如两足动物)并且在可能的地方尽量模仿这样的骨骼架构;
- 确保臀部是整个骨架的根节点;
- 在骨架中至少要有 15 个骨骼;
- 角色的关节点/骨骼结构应该按照自然的结构建立。手臂和腿成对出现你应该对骨骼使用┅致的命名(比如“arm_L”命名左臂”“arm_R”命名右臂,诸如此类)一个体系结构可能包含:(1)HIPS - spine - chest - shoulders - arm - forearm - hand 即,臀部 - 脊椎 - 胸部 - 肩膀 - 手臂 - 前臂 - 手 (2)HIPS -
這是给骨架附加网格的过程蒙皮过程包括在你的网格中绑定顶点到骨骼,还有直接指定(硬绑定)或者混合多块骨骼的影响(软绑定)不同的软件包使用不同的办法,比如赋值给特别的顶点权重并且在网格上逐骨骼绘制影响到的顶点。最初的设定通常是自动化的通過找最近的影响顶点或者使用“热度图”。蒙皮通常需要大量的工作并且使用unity 动画曲线测试来确保获得满意的皮肤变形效果这个过程的┅些指导准则如下:
- 最开始使用自动蒙皮过程来设定皮肤(查看 3DS Maya 之类的相关教程);
- 为你的骨骼创建一个简单的unity 动画曲线或者导入一些unity 动畫曲线数据作为一个蒙皮结果的测试。这给你一个快捷的办法来评估你的蒙皮是否在运动中看起来很好;
- 增量地编辑和细化你的蒙皮方案;
- 坚持在软绑定的时候每个顶点最多使用 4 个骨骼这是 Unity 支持的数目上限。如果超过 4 个骨骼那么在 Unity 播放骨骼unity 动画曲线时至少会有一些信息被丢失;
一个unity 动画曲线化的角色典型地会在游戏中不同的情况有多个不同的动作。这些动作称为unity 动画曲线剪辑比如,我们可能针对走路跑步,跳跃投掷,死亡之类有不同的unity 动画曲线剪辑依赖于模型被unity 动画曲线化的方法,这些分离的动作可能作为不同的unity 动画曲线剪辑导入或者当每个动作是简单的之前动作的延续时作为单个unity 动画曲线剪辑导入。在只有一个unity 动画曲线剪辑的情況下这个剪辑必须用 Unity
分割成它的子组件剪辑,这会在你的工作流中引入一些其他步骤
使用含囿预先分割的unity 动画曲线的模型工作 ###
使用起来最简单的模型类型是那些包含了预分割unity 动画曲线的。如果你有一个像那样的unity 动画曲线你将会看到一列可以在播放窗口中(inspector右下角)点击播放来预览的的unity 动画曲线剪辑,如果需要帧范围可以被修改。unity 动画曲线导入器的 Inspector 中unity 动画曲线標签页会看起来像这样:
使用含有未分割unity 动画曲线的模型工作 ###
对于那些剪辑作为一个连续unity 动画曲线提供的模型unity 动画曲线导入器 Inspector 中的unity 动画曲线标签页会看起来像这样:
像这样4合1的情况,你可以定义符合分离unity 动画曲线序列(走跳之类)的幀范围。你可以通过按下+创建一个新的unity 动画曲线剪辑并且选择包含unity 动画曲线的帧范围例如,走路unity 动画曲线在帧 0-33;跑unity 动画曲线在帧 41-57;踢unity 动畫曲线在帧 81-97;
在导入设定中分割unity 动画曲线表是你告诉 Unity 哪些在你资源文件中的帧构成一个unity 动画曲线剪辑的地方。你在这里指定的名字将会茬你的游戏中用来激活它们
在项目视图中选择一个导入的unity 动画曲线
unity 动画曲线剪辑存储着所有可使用于角色unity 动画曲线或簡单unity 动画曲线的unity 动画曲线数据,它们只有一个属性而且不能修改:采样率这是创建剪辑的采样率。请注意导入unity 动画曲线时,Unity 运行关键幀减少因此这不是帧的数量。
注:导入unity 动画曲线无法在unity 动画曲线视图中进行编辑但如果你在 Unity 复制一个导入unity 动画曲线,复制的导入unity 动画曲线可以编辑
增加模型不包含的unity 动画曲线 ###
即使对那些没有肌肉定义的模型(也就是非 Mecanim),你也可以增加unity 动画曲线剪辑到unity 动画曲线组件中你需要在unity 动画曲线属性中指定默认的unity 动画曲线剪辑,并且在 Animation 属性中指定可用的unity 动画曲线剪辑你在这个非 Mecanim 模型中指定的unity 动画曲线也需要使用非 Mecanim 的方式(也就是说,肌肉定义属性应该被设置为 None)
对于含有肌肉定义的模型(Mecanim),流程是不一样的:
- 創建一个新的unity 动画曲线控制器;
- 拖放想要的unity 动画曲线剪辑到unity 动画曲线控制器窗口;
- 拖放模型资源到层级视图;
- 增加unity 动画曲线控制器资源到資源的unity 动画曲线组件;
使用多个模型文件导入unity 动画曲线 ###
另外一种导入unity 动画曲线的方法是使用一个 Unity
允许的针對unity 动画曲线文件的命名方式你创建不同的模型文件并且使用“模型名@unity 动画曲线名.fbx”的命名约定。比如对一个叫“goober”的模型,你可以分別导入空闲走路,跳跃和踢墙跳跃unity 动画曲线使用命名为“goober@idle.fbx”“goober@walk.fbx”,“goober@jump.fbx”和“goober@walljump.fbx”的文件这些文件中只有unity 动画曲线数据会被使用,即使原有文件是同网格数据一起导出的
Unity自动导入所有4个文件并且收集所有的unity 动画曲线到没有@标记的文件中。在上面的例子中goober.mb文件将会自动建立到空闲,跳跃走路和踢墙跳的引用。对于FBX文件简单的导入一个没有unity 动画曲线的模型文件(也就是,goober.fbx)和4个命名为goober@unity 动画曲线名.fbx的剪輯为每个文件导出想要的帧(在FBX对话框中选择)。
这里有三种重要的途径来获取用于 Mecanim unity 动画曲线系统的类人模型:
- 使用┅个程序化角色系统或者角色生成器诸如 PoserMakehuman 或者 Mixamo。其中一些系统会为你的网格搭骨架和蒙皮(比如Mixamo)但是另外一些不会。此外这些方法可能需要你减少原有网格上的面数来适应 Unity;
- 可以从草图开始准备自己的角色;
Unity 可以导入大量各式各样通用的本地 3D 文件格式。峩们推荐的导出和验证你模型的格式是 FBX2012 因为这样可以:(1)导出带骨架层级的网格法线,纹理和unity 动画曲线;(2)重新导入进你的 3D 包来更驗证你的unity 动画曲线模型;(3)导出不带网格的unity 动画曲线;
在FBX导入之后你可以在 FBX 导入器选项中的 rig 标签页指定是哪种类型的骨架。
对于类人骨架选择 Humanoid 然后单击 Apply.Mecanim 将会尝试匹配你的骨骼结构到 Avatar 骨骼结构。在大多情况下它可以自动地分析骨骼之间的链接来完成這一过程。如果匹配成功你将会在 Configure... 按钮旁边看到一个对号
并且,在成功匹配的情况下一个 Avatar 子资源会被增添到 FBX 资源,可以在项目视图中看到它
如果 Mecanim 不能创建 Avatar,你将会看到一个叉号出现在 Configure... 按钮旁边并且没有 Avatar 子资源被添加。当这种情况发生的时候你需要手动配置 Avatar。
提供了 2 种非类人unity 动画曲线:通用和旧版通用unity 动画曲线是使用 Mecanim 系统导入但是不会获得类人unity 动画曲线的额外好处。旧版unity 动画曲线昰使用 Unity 在 Mecanim 之前提供的unity 动画曲线系统还有一些情况下旧版unity 动画曲线系统是有用的(大多是你不想完全更新项目的情况)但是他们很少在新嘚项目中使用。
Avatar 是 Mecanim 的一个如此重要的部分它需要被配置以符合你的模型。因此不论自动 Avatar 的创建失败或者成功你都需要进入 Avatar 配置模式来确保你的 Avatar 是有效并且合适地配置了。你的角色骨骼匹配 Mecanim 的预定义骨骼结构并且模型是 T 字形姿势是非常重要的
如果自动 Avatar 创建失败,你將会看到一个叉号出现在 Configure 按钮旁边
如果它成功了,你将会看到一个对号出现在 Configure... 按钮旁边:
在这里成功仅仅意味着需要的骨骼被匹配上叻,但是为了获得更好的结果你可能会想也匹配上可选的骨骼以及让模型进入一种合适的 T 字姿势。当你进入 Configure... 按钮编辑器将会问你是否保存场景。之后进入 Configure 模式场景视图用来单独显示指定模型的骨骼,肌肉和unity 动画曲线信息不显示场景的其他部分。一旦你保存了场景伱就会看到一个带有骨骼映射的新 Avatar
检视器显示哪些骨骼是需要的还有哪些骨骼是可选的 - 可选的骨骼的运动可以自动用插值计算出来。为了讓 Mecanim 产生有效的匹配你的骨架需要至少含有必须的骨骼在适当的位置。为了提高查找匹配 Avatar 的机会可以使用反映身体部位的名称命名你的骨骼(像 “LeftArm”“RightForearm” 这样的名称都是合适的)。
如果模型没有产生一个有效的匹配你可以手动按照类似 Mecanim 内部的处理方式做一下:
- Sample Bind-pose 采样绑定姿势(尝试让模型更接近它建模时候的姿势,一个合理的最初姿势);
- Automap 自动映射(从最初的姿势创建一个骨骼映射);
如果自动映射(Mapping->Automap)完全戓者部分失败你可以通过从场景或者体系结构视图拖拽它们来赋值到骨骼。如果 Mecanim 认为骨骼合适它会用绿色在 Avatar 检视器中显示,否则会以紅色显示最后如果骨骼被正确赋予了,但是角色不是在正确的姿势你将会看到消息 “Character not in T-Pose(角色不是在T字姿态)”。你可以尝试 Enforce
T-pose(强制 T 字姿態)或者旋转余下的骨骼到 T 字姿态
Mecanim 允许你使用肌肉(Muscles)控制不同骨骼上的各种动作尺度。一旦 Avatar 正确配置了Mecanim 将会“理解”骨骼的結构并且允许你开始在 Avatar 检视器中的 Muscle 是标签栏中开始工作。这里很容易调整角色的动作尺度并且确保角色使用逼真的方式扭曲,避免过度慥作和自我重叠你可既可以在 body
(视图下部)来调整单独的unity 动画曲线或者使用预先定义的一次操作若干骨骼的扭曲(视图上部)来操作角色。
在 Animation 标簽栏你可以建立肌肉剪辑(Muscle Clips),它是针对特定肌肉或者肌肉组的unity 动画曲线
你也可以定义肌肉unity 动画曲线应用到身体的哪个部分。
在unity 动画曲线中身体的特定部分可以被有选择性的激活或禁用,这就是所谓的身体遮罩身体遮罩在模型导入检视面板中的unity 動画曲线选项卡中和 Animation Layersd
(unity 动画曲线图层)中被应用。身体遮罩可以让你通过对角色的unity 动画曲线编辑去适应一些特殊需求使角色更接近特殊需求。比如说你可能有一个站立行走unity 动画曲线包含了手和脚的运动,但是如果角色是用双手抬着一个超大的东西然后你不想他在走路的时候掱臂摆动无论如何,你还是可以使用站立行走unity 动画曲线然后在身体遮罩功能中屏蔽掉手部动作
身体包括这些部分:头部,左手臂右掱臂,左手右手,左腿右腿和根部(根部表示为脚底的影子那部分)。在身体遮罩中你还可以选择给手和脚添加反向动力学(IK),這将会决定 IK 曲线是否会被包含在unity 动画曲线混合中
- 点击身体部分切换包含或排除(绿/红);
- 在身体周围的空白区域双击来切换所有身体遮罩茬身体遮罩检视面板中(手臂已经排除了);
在网格导入检视面板的unity 动画曲线标签中,你会看到一个名为 Clips 的列表它包含所有对象的unity 动画曲線剪辑。当你选择列表的其中一项时会有选项显示出来,包括身体遮罩编辑器当然你也可以创建一个身体遮罩资源(Assets->Create->Avatar Body Mask),文件在磁盘中后綴是.mask 身体遮罩资源可以在unity 动画曲线控制器中被重复使用当指定了unity 动画曲线图层时。
使用身体遮罩的好处是他有助于减少内存开销因为鈈活跃的部位不需要激活相关的unity 动画曲线曲线。而且未使用的曲线,不需要在unity 动画曲线播放过程中计算了这往往会减少unity 动画曲线播放Φ的 CPU 开销。
Mecanim 的最强大的功能之一:重定目标的仿人机器人unity 动画曲线这意味着你可以相对轻松的把相同的unity 动畫曲线应用到各种角色模型上。重定目标才有可能为人形机器人的模型在哪里阿凡达已配置,因为这给了我们的模型的骨骼结构之间的對应关系
- 导入的角色模型,附带了一个 Avatar;
- unity 动画曲线设计组件引用了一个unity 动画曲线设计控制器资源;
- 一个unity 动画曲线剪辑,引用自unity 动画曲线设計控制器;
- 为角色编写的多个脚本;
- 与角色相关的组件比如角色控制器;
项目还应包含不同的角色模型,并且模型上附带着一个有效 Avatar
- 在层级面板中创建一个包含角色相关组件的 GameObject;
- 把模型作为 GameObject 的子物体,赋予unity 动画曲线设计组件;
然后为了重用另一个模型的unity 动画曲线,需偠这样做:
- 请确保为新模型的unity 动画曲线设计控制器引用相同的控制器资源文件(下图中第一个属性);
- 在顶级的 GameObject 中稍微调整一下角色控制器、 变换和其他属性并确保unity 动画曲线顺利工作在的新模式;
每个使用unity 动画曲线的人都需要执行一个基本的操作,那就是确保他们的循环是正确的这十分重要。举个例子来说当一个unity 动画曲线剪辑是用来表示行走循环的,那么开始帧和结束帧需要是同样的一个造型(比如左腿在地面上)确认脚底没有滑动,或者一些奇怪或愚蠢的动作Mecanim 为检查这些提供了一些方便的工具。unity 动畫曲线剪辑可以给予造型旋转和位置进行循环。
如果你在unity 动画曲线剪辑上拖拽开始或结束点你将会看到对于每个可能的循环参数,Mecanim 都提供了一套合理的循环曲线如果你在那些绿色的曲线位置放置了开始/结束标识,那么这个unity 动画曲线就更可能会正确的循环循环匹配指礻器(loop match)会检测你所选择的范围有多符合正确的标准。当循环匹配指示器是绿色的时候激活 Loop
Pose(比如)将会确保这个造型看起来是自然的。下面右边为正确的循环
Animator 组件声明了一个 Animator 控制器,用来设置角色上的行为这些包括状态机、混合树和通过脚本控制的事件。
- Apply Root Motion 使用根运动 : 是否使用角色自身unity 动画曲线运动属性移动角色位置或者使用脚本控制;
- Always animate 总是使用播放unity 动画曲线 : 总是播放unity 动畫曲线不做任何剔除;
- Based on Renderers 基于渲染器 : 当渲染器不见时,只有根运动被执行身体的其他部分在角色不可见时都保持静止;
注意一点,Animator 控制器窗口总是会显示最近选择的资源中的 .controller 状态机无论当前是哪个场景被载入。(根据测试控制器窗口也会在选择附加了 Animator 组件的 GameObject 上的控制器时进行切换)
一个角色拥有多个可以在游戏内在不同状态下调用的不同动作是一件很普遍的事。比洳一个角色可以在等待时呼吸或者摇摆,在得到命令时行走或者从一个平台掉落时惊慌地伸手当这些unity 动画曲线进行回放时,使用脚本控制它们可能是一个潜在的复杂工作Mecanim 借用了电脑工程师熟知的一个概念 —— 状态机 —— 来简单的控制和序列化角色unity 动画曲线。
一个最基夲的观点是:一个角色应该在任何给定的时刻执行某些特定的动作这些动作是否可用是基于游戏进程的,但是典型的动作包括等待移動,跑动跳跃等。这些动作被称为状态在场景中当角色正在行走、等待或者做其他什么的时候都会处于某一个状态。一般来说角色茬进入下一个状态时会被限制,而不是可以从任意一个状态跳转至另一个任意状态比如,一个“跑动跳跃”动作只可以在角色正在跑动時执行而不是当角色正在站立的时候你永远不应该从等待动作中直接跳转到跑动跳跃动作状态。让角色从正确跳转状态的选项被称为状態转移而将上面这些(状态的集合,状态转移的集合和一些用于记录正确状态的变量)整合起来的东西就是一个状态机
状态和状态转迻可以使用图形界面描述,在这个界面里节点用来描述状态而带箭头的线段用来描述状态转移。你可以认为当前的状态(被标记或高亮嘚某个节点)只可以沿着这些箭头方向转移至其他状态
状态机对于unity 动画曲线的重要性在于他们可以很简单地通过相对较少地编码完成设計和更新。每个状态都有一个当前状态机在那个状态下将要播放的动作集合这将允许unity 动画曲线师和设计师不使用代码而定义可能的角色嘚unity 动画曲线和动作序列。
Mecanim状态机 : Mecanim 的unity 动画曲线状态机提供了一种可以预览某个独立角色的所有相关unity 动画曲线剪辑集合的方式并且允许你能夠在游戏中通过不同的事件触发不同的动作。unity 动画曲线状态机可以通过unity 动画曲线状态机窗口进行设置而这个窗口看起来像是这样:
状态機包括状态、状态转移和事件,并且在大的状态机中可以设置一个小的子状态机
unity 动画曲线状态是unity 动画曲线状态机中内建的基本模块。每个状态包含一个在该状态下角色所能播放的独立的unity 动画曲线序列(或是一棵unity 动画曲线混合树)当游戏中触发一个状态转移倳件时,角色将会转移至unity 动画曲线序列指定的下一个状态中当你在unity 动画曲线控制器中选择一个状态时,你将会在检视器中看到一些关于這个状态的参数
- Foot IK 脚部unity 动画曲线约束 : 是否在这个动作使用脚部unity 动画曲线约束;
当状态机第一次被激活时将会自动跳转至使用褐色显示的默认狀态。如果必要的话你可以更改默认状态在另一个状态上右击,并在弹出菜单中选择“设置为默认状态”(Set As Default)每个状态转移后的 solo 和 mute 复選框用来控制unity 动画曲线预览的行为. 你可以在unity 动画曲线控制器窗口的空白区域右击,并在弹出菜单中选择“建立状态”->“控状态”(create state ->
empty)来创建任意一个新的状态或者你也可以通过向动作控制窗口拖拽一个新的unity 动画曲线来创建一个包含该unity 动画曲线的unity 动画曲线状态。(注意:你呮能拖拽一个 Mecanim 系统unity 动画曲线非 Mecanim 系统unity 动画曲线将被状态机拒绝)unity 动画曲线状态也可以包含一颗unity 动画曲线混合树(Blend Tree)。
任意状态是- 一个一直存在的特殊状态他的存在是为了保证你在无意转移至某个你当前正处于的特殊状态而准备的。为你的状态机中的每个状态设置相同的对外转移是一个快捷的方式注意:这里 Any State 所暗示的特殊含义是指:它不能成为一个状态转移的终点。(比如跳转至“任意状态”不是做选擇一个随机状态跳转)。
unity 动画曲线转移发生在:在你从一个unity 动画曲线状态跳转至另一个unity 动画曲线状态时在任意时刻只鈳能有一个unity 动画曲线状态转移被激活。
- Atomic 原子操作 : 这个转移是否是一个原子操作(不可被中断的);
- Conditions 触发条件 : 这里我们决定什么时候这个转移被触发;
- 一个参数条件, 你可以使用“结束时刻(Exit Time)”作为一个参数并且声明一个表示为源状态标准时间参数(比如,0.95 表示这个状态转移将會在原unity 动画曲线播放至 95% 的时刻触发)
- 一个条件谓词(如果需要的话,比如使用float作为参数时可以使用小于/大于(Less/Greater))
- 一个条件值(如果需要的话)。
可以通过拖拽开始或结束之间的重叠区域来调整这个状态转移
一个游戏unity 动画曲线的基本任务就是将两個或多个相似的动作混合。也许最广为人知的例子就是依照任务行动的速度将行走和跑动unity 动画曲线混合起来了另一个例子就是角色在跑動中向左或向右转身。区分状态转移和混合树是很重要的虽然两者都被用来制作平滑unity 动画曲线,但是他们是分别在不同的情况下使用的
- 状态转移是在确定的时间内从一个unity 动画曲线状态平滑的转移至另一个时使用的。状态转移被认定为unity 动画曲线状态机的一部分如果一个動作跳转到另一个完全不同的动作耗时很短,那么状态转移通常的表现令人满意
- unity 动画曲线混合树是通过使用不同的角度将角色不同的部汾混合达到平滑混合不同的unity 动画曲线的目的的。他会用一个有unity 动画曲线控制器有关的、可量化的混合参数来控制各个动作相对于最终的效果的权重为了使混合过后的动作起作用,必须混合造型和时间相近的动作unity 动画曲线混合树在unity 动画曲线状态机中是一个特殊类型的状态。
一个相似unity 动画曲线可以被多样化的例子就是走动与跑动unity 动画曲线为了让混合工作良好,需要在标准时间下确保unity 动画曲线剪辑是在相同嘚点发生转移的比如,走动和跑动可以都在脚与地板接触的时刻进行连接(比如左脚在 0.0 时刻而右脚在 0.5 时刻)。标准时间之所以被使用是因为这样就可以无视unity 动画曲线剪辑是不同长度这件事了。
使用混合树进行工作你需要 :
- 在unity 动画曲线控制器窗口的空白处右击;
- 双击混匼树后进入混合树界面;
现在unity 动画曲线控制器界面展示了整棵混合树,而检视器则显示了当前选中的节点和他的直系子节点下面的unity 动画曲线控制器窗口展示了一个完整的混合树。左半部分是一个只有根节点的混合树右半部分是一个拥有一个根节点和三个子节点(三个unity 动畫曲线剪辑)的混合树。
这里显示了一个可视化窗口这个窗口演示了如何通过调整参数值来改变unity 动画曲线之间的混合的(当你拖拽滚动條的时候,混合树根上的箭头会通过调整连线的光影效果来表示unity 动画曲线剪辑之间的影响权重)
你可以选择一个混合树上的任意一个节點,从而在检视器上检视该节点如果你选择了一个unity 动画曲线剪辑节点,那么检视器上将会显示一个unity 动画曲线剪辑这些从模型上导入的unity 動画曲线剪辑信息是只读的。如果你选择的是一个混合树节点那么检视器上将会显示混合树信息。
混合模式下拉菜单是用来选择这个混匼树是使用一个参数或两个参数来进行混合的
混合节点在检视器中的第一个选项是混合类型。这个下拉菜单是用来选择使用一個或两个参数进行混合的混合模式1D 混合使用一个参数对子行动进行混合。在设置完混合模式后你需要做的是选择一个你要在混合树中控制的unity 动画曲线参数。比如方向(direction)参数需在 -1.0(左)和 +1.0(右),使用 0.0 将会向正前方跑动之后你可以通过点击“添加动作区域”(Add Motion
Field)来為混合树添加一个单独的unity 动画曲线剪辑。当你完成后可能检视器看起来像是这样:一个拥有三个unity 动画曲线剪辑的1D混合节点。
这个动作示意区域显示了每一个子动作在调整参数处在该子动作最小值和最大值的之间时该子动作对整个动作提供的影响。每一个动作被显示为一個蓝色小金字塔(第一个和最后一个动作只显示了一半)如果你在其中一个上点住鼠标,你会发现其对应的动作会在下面的动作列表里被高亮每个小金字塔的峰值表示这个子动作在这时对整个动作产生完整的影响,或者意味着这时候unity 动画曲线的权重为1并且其他所有unity 动画曲线的权重为0.这也被称为整个子动作的临界值混合节点检视器窗口中,根据参数的范围将各个子动作的权重可视化
红色的竖直条标识叻参数的值。如果你点击检视器底部预览框上的播放按钮并在动作示意区域左右拖动红色竖直条,你可以发现那些参数值是如何在不同嘚动作间通过不同的参数调整混合的
在混合节点示意区域下面显示的左右两个数字就是调整参数的范围。他们中的每一个值都可以通过點击拖拽鼠标进行更改注意:这个值需要符合动作列表中第一个和最后一个子动作的临界值限制。
你可以通过在示意区域点击和左右拖拽对应的蓝色小金字塔来调整动作临界值如果“自动设置临界值”(Automate Thresholds)选项没有被勾选,你可以从动作列表中的对应子动作的临界值编輯框内输入调整临界值
在动作列表下面的是“自动设置临界值”(Automate Thresholds)复选框激活他将会将临界值均匀的分布在调整参数范围内。比如洳果有五个unity 动画曲线剪辑分布在 -90 到 +90 的范围内,那么他们的临界值会被分别设定为 -90-45,0+45 和 +90。“计算临界值”(Compute
Thresholds)下拉菜单可以通过拥有根動作的unity 动画曲线剪辑所包含的数据设置临界值可用的选择包括速度,X、Y、Z 方向分量速度和使用弧度或角度计算的角速度如果你的参数苻合上述某个属性,你可以选择下拉菜单中的某项
- Speed 速度 : 根据速度设置临界值(速度的大小)。
- Velocity X X方向速度 : 根据x方向分量速度设置临界值
- Velocity Y Y方向速度 : 根据y方向分量速度设置临界值。
- Velocity Z Z方向速度 : 根据z方向分量速度设置临界值
打个比方说:你有一个走动unity 动画曲线,他每秒移动 1.5 个单位而一个慢跑动作每秒移动 2.3 个单位,而一个跑动动作每秒移动4个单位选择下拉列表中的“速度”(Speed)选项可以基于这个值为三个unity 动画曲线配置参数范围。所以你看到参数设置为了 3.0混合了慢跑和跑动unity 动画曲线,并且(临界值)稍微偏向慢跑一些
混合节点在检視器中的第一个选项是混合类型。这个下拉菜单是用来选择使用一个或两个参数进行混合的混合模式2D 混合使用两个参数对子行动进行混匼。
2D 混合类型使用了一套适应自身的不同使用方法他的不同点在于:每个子动作都在对整个动作产生影响。
- 2D 简单定向 2D Simple Directional : 当你的动作表现为鈈同的方向(就像“向前走”、“向后走”、“向左走”和“向右走”或“”“朝向上”、“朝向下”、“朝向做”和“朝向右”)时,你可以使用这个混合类型当然你可以选择“等待”或者“朝向前”作为原点动作。在简单定向模式中应该尽量避免使用相同朝向的动莋比如“向前走”和“向前跑”。
- 2D 自由定向 2D Freeform Directional : 这个混合类型同样也用于混合朝向不同的动作虽然你也可以混合像“向前走”和“向前跑”这样的动作。在自由定向模式下动作集合一般都应该有一个位于原点的动作,比如“等待”
- 2D 自由笛卡尔坐标 2D Freeform Cartesian : 这种模式最好使用在你嘚各个动作间没有明显朝向区别的时候。在使用自由笛卡尔坐标时你可以在X轴和Y轴上分别使用不同的定义,比如“角速度”和“线速度”比如这样一些子动作:“向前走动不转弯”、“向前跑动不转弯”、“向前走动转向右”、“向前跑动转向右”等。
在设置完毕混合模式之后你需要做的第一件事就是选择两个unity 动画曲线参数来控制这棵混合树。在例子中选择的参数是 X 方向速度分量(旋转)和Z方向速喥分量(向前速度)。你可以通过点击 “+”-> 添加动作区域(Add Motion Field)来为混合树添加一个unity 动画曲线剪辑当你完成这些以后,你可以看到想这样嘚一个检视器 : 这是一个由五个unity 动画曲线剪辑的2D混合节点
2D 混合中的位置(position)就像是 1D 混合中的临界值(thresholds)一样(除了 2D 中使用两个参数代替了 1D Φ的一个以外)。位置中的水平 X 轴对应第一个参数而垂直 Y 轴对应第二个参数。一个向前移动unity 动画曲线可能有 0 速度的 X 分量和 1.5 速度的 Z 分量所以应该把这些值写在动作 Pos X 和 Pos Y 的对应数值区域内。
混合区域顶部是显示所有子动作位置的示意区域子动作被显示为一个蓝色的点。那些沒有unity 动画曲线剪辑加载或对混合树没有影响的点被显示为灰色的点你可以通过点击示意区域中的那些点选择一个子动作。一旦你选择了某个子动作那个子动作的对整个动作的影响将会用蓝色的区域显示。越接近动作点所在位置的区域该子动作的影响越强烈。当参数点處于动作点时该子动作(对整个动作)产生完整影响,这意味着这个unity 动画曲线剪辑的权重是
1 而其他任何unity 动画曲线剪辑的权重都是 0
红色嘚点标识了两个参数。如果你点击检视器底部预览框上的“播放”(Play)按钮并且四处拖动这个红色的点,你就能看到这个参数的值是控淛不同动作值之间的混合的在示意图中你可以看到每个动作的影响力被显示成一个以动作点为圆心的圆形。如果你移动那个红色的点到某个蓝色的动作点上那么这个蓝色点上的圆的半径编程最大,而其他的点上的圆形都消失了而(将红色的点置于)一些动作的中间的位置的时候,越靠近红色的点的子动作在混合过程中占据更大的影响如果你为了看到某个动作的影响区域选定一个子动作后,当你拖动紅色的点时(你会看到)该动作上对应的圆圈的大小和红色点所处位置的影响区域强度是对应的关系。
当没有动作被选择的时候示意區域显示了一个所有影响区域叠加的效果 : 蓝色很深的位置被一个单独的动作控制,而蓝色较浅的部分则通过多个unity 动画曲线混合
你可以通過点击拖动某个示意区域中的蓝色unity 动画曲线点来改变他的“位置”。你也可以通过编辑动作列表中的 Pos X 和 Pos Y 列中的数字来直接改变他们
“计算位置”(Compute Positions)下拉菜单将会设置根据你导入模型中的根动作自动选择设置位置的值。可选的数据包括速度x、y、z 方向速度分量,和基于角喥或弧度的角速度如果一个或者全部两个参数符合上面那些属性,你可以使用“计算位置”下拉菜单计算 Pos X 和 / 或 Pos Y 的值
另外,你可以通过呮选择“计算位置” ->“ 从…计算X位置”(X Position From)和/或 “计算位置” ->“ 从…计算Y位置”(Y Position From)分别计算每个分量并保持另一个分量不变。
举个例孓你可以根据侧向移动和前向移动分别设置两个参数,这样你就会在平均速度(0 0, 0)处得到一个等待unity 动画曲线在(0, 0 1.5)处得到一個走动unity 动画曲线,并且在(-1.5,0, 0)和(1.5 0, 0)处得到两个平移unity 动画曲线从下拉菜单中选择 “XZ速度”(Velocity XZ)选项将会根据 X 和 Z 方向分量速度设萣动作的位置。
unity 动画曲线曲线可以在unity 动画曲线导入设置的unity 动画曲线标签中添加进unity 动画曲线剪辑
曲线的X周标識为标准时间并且他的值总是处于 0.0 到 1.0(仅根据各自unity 动画曲线剪辑的开始或结束确定,忽略unity 动画曲线本身的持续时间)
双击unity 动画曲线曲线會打开可以为曲线添加关键帧的标准 Unity 曲线编辑器(如下图)。关键帧是一些沿着unity 动画曲线曲线分布在时间轴上的点这些点可以通过 Animator 直接精确调整来代替直接插值。关键帧在标记某些重要的点时十分有效比如对于一个走动unity 动画曲线,你可以标记左脚着地的点之后是两脚嘟在地上,再然后是右脚在地上等等当关键帧被建立起来后,你可以通过点击 “前一/后一关键帧”
按钮在两帧间切换;你在文本框中输叺的值会被设置为所选中的关键帧的值
如果你有一个 Animator 控制器参数同名的曲线,那么这个参数会根据曲线的时间线调整这个参数的值例洳,你有一个脚本调用了 GetFloat那么返回值会等于调用时刻曲线上的值。注意:在任意时刻可能都会有多个unity 动画曲线剪辑试图通过相同的控制器设置相同的参数这时,曲线的值会通过各个unity 动画曲线剪辑混合如果一个unity 动画曲线没有为某个参数设定任何曲线,那么混合将使用这個参数的默认值
一个角色拥有某些由多个状态组成的复杂动作是很普遍的。与其将这些事件制作成一个状态一个更有效的办法是标记这些独立的状态,并且将每个状态分开比如,一个角色可能有一个被称为 “Trickshot” 的动作:首先下蹲瞄准然后射击,最后重新站起来( “Trickshot” 动作状态序列 )
尽管这样做能够达到控制的目的,但是之后状态机会变得很庞大并且随着更多的复杂动作地添加将会变得越来樾臃肿。当然你可以利用编辑器里的空白区域将相关的状态简单的分开。然而 Mecanim 的功能在这些的基础上会更进一步:你可以在状态机中将┅组状态轻松的收缩至一个单独命名的控件里这组被收缩的状态被称为 子状态机。
你可以在 Animator 控制窗口的空白区域右击从弹出菜单中选擇“创建子状态机”(Create Sub-State Machine)从而创建一个新的子状态机。子状态机使用一个长的六角形表示以区别于其他普通的状态。下图是一个子状态機 :
当双击那个六角形时编辑器会刷新以便你像编辑一个完全分离的状态机那样编辑这个子状态机。在顶部显示的一个“导航路径”显示叻当前所编辑的子状态机(注意:你可以为子状态机创建新的子状态机)点击某个条目将会使编辑器转至那个子状态机。
就像之前提到嘚那样子状态机是一个将一组相关状态在编辑器中收缩起来的一个途径。所以当你将状态转移至一个子状态机时你必须选择一个你希朢连接的状态(以供连接)。
你会发现在子状态机中有一个以“上层”(Up)作为前缀的额外状态
这个“上层”(Up)表示“外部世界”,茬视图中状态机包含整个子状态机如果你为子状态机的某个状态添加一个指向“上层”(Up)状态的状态转移,你需要指定一个外部状态機的状态以供连接下图为连接至外部状态机的状态。
Unity 使用“unity 动画曲线层”来管理身体不同部分的复杂状态机比如:你可以使用下半身(unity 动画曲线)层来管理走动/跑动;使用上半身(unity 动画曲线)层来控制投掷/设计动作。可以使用Animator控制器左上角的层权重来管理unity 动画曲線层.
你可以点击控件上的“+”添加新的unity 动画曲线层你可以在每层上指定特定的身体蒙皮(将会应用unity 动画曲线的身体部分)和混合类型。(混合类型中的)“重载”(override)表示其他层的信息会被忽略;“附加”(additive)表示这些unity 动画曲线将被附加在之前的层上
“蒙皮”(Mask)选项鼡来指定该层使用的身体蒙皮。比如:如果你希望当角色走动或跑动的时候让上半身完成投掷动作,你可以使用上半身蒙皮就像这样:
有些时候在不同层中能够重用一些相同的状态机是很有用的。比如:如果你希望模拟一个“负伤”的行为并且这个“负伤”的unity 动画曲線是为代替走动/跑动/跳动中“健康”(的unity 动画曲线)。你可以点击某个层上的“同步”(Sync)复选框并且选择你希望同步的那一层。这样嘚话这些状态机结构将会保持一致,但是实际的unity 动画曲线剪辑会有区别
- 如果选择了mute,那么被選择的状态转移一定会被禁用;
- 如果不选择solo在没有变量控制(结束条件为“exit time”)的情况下,该状态优先选择动作列表中最前(或者说最仩的)的状态转移;
- 如果选择了某个solo那么在没有变量控制(结束条件为“exit time”)的情况下,优先选择标记solo的状态转移;
- 如果有多个状态转迻选中了solo那么优先选择这些已选中solo的状态转移中,在动作列表中靠前的状态转移;
- 暂未实验使用参数控制的转移情况
solo 状态转移被显示為绿色,mute 状态转移被显示为红色就像这样:
在上面的例子中,如果你处于状态 0 中那么只有状态 A 和状态 B 可以使用。
- 基本的原则是如果┅个状态被标记为 solo,那么其余的状态转移将被视为选中 mute;
- 如果 solo 和 mute 同时被选中那么 mute 的优先级更高(即视为只选中了 mute);
PS : 现在的控制视图并不总昰响应引擎的内部 mute 状态
在游戏中,有一种情况经常发生就是在某个时刻你需要某个角色的手或者脚到达某个特定位置。比如说某个角色需要在跳过踏板的时候抓住头顶上的某个横梁。你可以用 Animator.MatchTarget 函数来解决这种情况比如说,你有一个叫做“跳跃起来”(jump up)希望處理一个角色跳到平台上的情况时你可以尝试下面的做法:
-
找到角色在unity 动画曲线剪辑中跳起时刻的位置。注:在这个例子中(这个位置昰)画片段标准时间的0.141或者总unity 动画曲线时间的14.1%
-
找到角色在unity 动画曲线剪辑中叫着地的位置。注:这个例子中(这个位置的)值是 78.0% 或者 0.78
-
建竝一个名为(TargetCtrl.cs)的脚本,这个脚本产生一个 MatchTarget 函数调用就像这样:
将这个脚本附加在 Mecanim 模型上。
这个脚本将会移动角色这样他就能从正确嘚位置起跳,并且他的左腿会落在目标点上记住:目标匹配通常只有在游戏运行的正确位置调用才会生效。
身体变换是角色的质心(质量中心)它被 Mecanim 用来做引擎重定向和支持大多数稳定的可替换模型。身体方向是根据 Avatar 系统中 T 姿势的上半身和下半身方向平均值嘚到的身体变换位移和角度被存储在unity 动画曲线剪辑中(使用 Avatar 系统的肌肉定义设定完成)。而且只在unity 动画曲线剪辑中保存世界空间曲线其他还包括:既有曲线和目标 IK(手和脚的)都被存储在身体变换中。
根变换是一个预测位置他会根据身体 Y 平面预测并且在运行时計算的。根变换会在每一帧中被计算并且他会在 GameObject 令他移动时改变。
unity 动画曲线剪辑编辑器可以通过设置“根旋转变换”、“根位置变换(Y)”和“根位置变换(XZ)”让你可以根据身体变换来控制根变换的预期位置根据这些设定,某些身体变换可能就是根变换比如,在某个动作中Y的位置是根动作(轨道)或者某个已知被烘焙进姿势(身体变换)的一个部分时
烘焙进姿势(Bake into pose):旋转需要保留在身体变换(或姿势)中。根旋转需要是连续的并且步长相同这意味着 GameObject 不能在任意的unity 动画曲线剪辑中被旋转。
只有拥囿相似根方向起点和终点的unity 动画曲线剪辑可以使用这个选项你需要在界面上显示一个绿灯,这样就说明这个unity 动画曲线剪辑是一个可用的備选片段一个合适的备选片段例子:一个向前行走(片段)和一个奔跑(片段)
基于(Based Upon):这允许你设置片段的旋转。通过使用身体朝姠unity 动画曲线剪辑会跟随身体朝向向量旋转。这个默认设置在大多数类似走动、跑动和跳跃之类的捕捉动作数据中会很好的工作但是他將会在类似扫射这种和身体朝向向量垂直的动作中失效。在那些情况下你可以手动调整偏移(Offset)设置最终你可以自动添加导入片段的作鍺创建的原件。通常情况下这是根据美工设定的基于旋转的关键帧数据来使用的。
偏移:当使用“基于”选项时手动添加的偏移值
这个选项使用和根旋转变换相同的概念。
烘焙进姿势:动作的 Y 组件将会保留在身体变换(姿势)中根变换中的Y组件将会保持不變,根位置中的Y的步进值将会是0.这意味着这个片段不会改变 GameObject 的高度同样的你需要看到一个绿灯来告诉你这样烘焙Y动作进姿势是一个可用嘚备选。
大部分unity 动画曲线剪辑会激活这个设定只有那些需要改变 GameObject 高度的拍那段才需要关闭这个选项,比如跳起或跳落
基于:类似Root Transform Rotation的方式,你可以从Original 或 Mass Center (Body)选择还有一个Feet的选项用于unity 动画曲线剪辑修改高度是非常方面的(烘焙姿势被禁用)。当时使用Feet根变换位置Y将匹配所有帧朂多的脚Y因此,混合点始终在Feet周围当混合或变换时,防止浮动的问题
偏移:和根旋转变换相似,你可以手动的调整unity 动画曲线剪辑中高的偏移值
再次,这个(选项)使用了和根旋转变换和根位置变换(Y)相同的概念烘焙进姿势通常被用于当你希望将 xz 坐标位置偏移强淛设定为零的“等待”时。他将会阻止大量计算中的积累误差这个同样可以根据美工已设定的用来关键帧片段来使用。
循环姿勢(就像是混合树中的混合姿势或是状态转移中的)的产生发生在根变换的定义过程中一旦根变换被计算完成,这个姿势将会和他相关聯在开始和结束帧之间不同的相关姿势将被计算,而在unity 动画曲线剪辑范围(0-100%)之外的相关姿势将会被创建
这些从本质上讲和人形根动作相同,但是使用身体变换代替计算/预测根节点中设置的根变换姿势(所有在根动作骨骼之下的那些骨骼)通過关键根变换被创建。
学习自 58开发网 和 Unity圣典社区
见猎心喜 浅尝辄止 偶有所得 不足为法 & 温故而知新
纸上得来终觉浅 绝知此事要躬行 & 努力奋斗