分类:Unity、C#、VS2015

创建日期:2016-05-02

一、简介

导入角色网格和动画及设置 Avatar 之后,就可以准备开始在游戏中使用它们了。以下部分涵盖 Mecanim 提供的、用于控制及排序动画的主要功能。

二、循环动画片段

使用动画的一个常见操作是确保动画正确循环。例如,表示走路循环的动画片段以类似的姿势开始、结束非常重要(如开始时左脚在地面上,结束时右脚在地面上),这样才能确保不会出现脚滑动或奇怪的不稳定动作。Mecanim为解决此问题提供了方便的工具,让动画片段可基于姿势、旋转和位置进行循环。

1、相关属性

(1)Start、End--开始和结束

如果拖动动画片段的起始 (Start) 或结束 (End) 点,你就会看到所有参数的循环 (Looping) 拟合曲线(以能够循环的参数为基础)。如果将起始 (Start)、结束 (End) 标记放在绿色属性曲线的位置,那么就会增大片段正确循环的几率。

(2)loop match--循环匹配

循环匹配指示器(loop match)用于显示所选范围的循环状况。

不是绿色的说明匹配不合适,其结果是动画播放时可能会造成重影(也叫“伪影”)。

(3)Loop Pose--循环姿势

如果循环匹配 (loop match) 指示器全部都变成了绿色,说明所启用的循环姿势 (Loop Pose)正确,这样动画播放时姿势循环就不会出现“伪影”。

2、动画组件(Animator Component)

任何具有 Avatar 的游戏对象 (GameObject) 都具有动画组件(Animaor),该组件是角色与其行为之间的链接。

动画组件引用动画控制器 (Animator Controller),该控制器用于对角色进行行为设置。包括通过脚本控制的状态机 (State Machine)、混合树 (Blend Tree)和事件的设置。

相关属性如下:

  • Controller 控制器。附加到此角色的动画器控制器
  • Avatar 此角色的Avatar。
  • Apply Root Motion 应用根运动。应从动画本身还是从脚本控制角色的位置。
  • Animate Physics 对物理进行动画处理。即:动画是否应与物理交互?
  • Culling Mode 动画的剔除模式
  • Always animate 始终播放动画,不剔除
  • Based on Renderers 基于渲染器的动画处理。即:当角色渲染器不可见时,仅对根运动进行动画处理,而身体的其他身体部位都保持静态。

3、动画控制器 (Animator Controller)

可以从 动画器控制器(Animator Controller) 视图【菜单: 窗口 (Window)> 动画器控制器 (Animator Controller)】查看和设置角色行为。

动画控制器 (Animator Controller)可以从 工程视图 (Project View) 【菜单: 创建 (Create) > 画器控制器 (Animator Controller)】进行创建。这会在磁盘上创建.controller资源 ,该资源文件在工程浏览器 (Project Browser)中用下面的图标显示:

进行状态机设置之后,可以在层次结构视图 (Hierarchy View) 中将控制器置于具有 Avatar 的任何角色的动画组件上。

动画控制器窗口 (Animator Controller Window)包括:

(1)动画层小组件 (Animation Layer Widget) (左上角,请参阅动画层?)

(2)事件参数小组件 (Event Parameters Widget) (左下角,请参阅动画参数?)

(3)状态机本身的可视化。

注意,动画器控制器窗口 (Animator Controller Window) 会始终显示最近选择的 .controller 资源中的状态机(与当前加载的场景无关)。

三、动画状态机

角色拥有几个对应于其在游戏中可以执行的不同动作的不同动画,这一点非常常见。例如,它可能在空闲时轻轻呼吸或摇摆,接受命令时走路,从平台坠落时恐慌地举起双臂。回放这些动画时进行控制可能是非常复杂的脚本任务。Mecanim 借用一个称为状态机的计算机科学概念来简化角色动画的控制和排序。

1、状态机基本原理

基本思想是角色在任何给定时间忙于一些特殊的动作。可用的动作取决于游戏类型,但典型动作包括空闲、走路、跑步、跳跃等。这些动作称为状态,在场景中,角色处于走路、空闲等“状态”。通常,角色要进入另一种状况会受到限制,而不是可以直接从任何状态转换成任何其他状态。例如,跑跳仅在角色已经在跑步时而非停滞不前时实现,所以永远无法直接从空闲状态转换成跑跳状态。角色可从当前状态进入下一个状态的选型称为状态转换。总之,状态集、转换集和记住当前状态的变量形成了状态机。

状态机的状态和转换可用一个图解表示,其中节点代表状态,弧(节点之间的箭头)代表转换。您可以把当前状态看作一个标记或置于一个节点上的突出显示,然后只需沿着一条箭头跳转到另一个节点。

动画状态机的价值在于可以用相对较少的编码即可轻松设计和更新。每个状态有一个与之相关的动作 (Motion),并在机器处于该状态时播放。这样就使动画器或设计器能够定义角色动作和动画的可能顺序,无需担心代码如何工作。

2、Mecanim 状态机

Mecanim 的动画状态机 (Animation State Machines) 提供一种方式来概览与特殊角色相关的全部动画片段,让游戏中的各种事件(例如用户输入)触发不同的动画。

可从动画器控制器窗口设置动画状态机 (Animation State Machines),如下所示:

状态机 (State Machines) 包含状态 (States)、转换 (Transitions) 和事件 (Events),较小的子状态机 (Sub-State Machines) 可在较大的机器中用作组件。

3、动画状态 (Animation State)

动画状态 (Animation State) 是 动画状态机 (Animation State Machine)的基本构造块。每个状态包含将在角色处于该状态时播放的单独动画序列(或混合树 (blend tree))。游戏中的事件触发状态转换时,角色会保留为新状态,该状态的动画序列随后会接管播放。

相关属性如下:

速度 (Speed) 动画的默认速度

运动 (Motion) 分配给此状态的动画片段

脚 IK (Foot IK) 是否应对此状态考虑“脚 IK”(Foot IK)

转换 (Transitions) 源自此状态的转换的列表

默认状态(以棕色显示)是第一次激活时计算机所处的状态。必要时,可以通过右键单击另一个状态并从上下文菜单中选择设为默认 (Set As Default) 来更改默认状态。每个转换上的独奏 (solo) 和静音 (mute) 复选框用于控制动画预览行为 — 有关更多详细信息,请参阅此页面。

可以通过在动画器控制器窗口 (Animator Controller Window) 中右键单击空白空间并从上下文菜单中选择 创建状态 (Create State)->空 (Empty) ,来添加新状态。或者,可以将一个动画拖动到动画器控制器窗口 (Animator Controller Window) 中以创建包含该动画的状态。(请注意,只能将 Mecanim 动画拖动到控制器中 - 非 Mecanim 动画会被拒绝。)状态还可以包含混合树 (Blend Tree)。

任意状态 (Any State)

任意状态 (Any State) 是始终存在的特殊状态。该状态针对您要转变为特定状态(无论您当前处于何状态)的情况而存在。这是将相同向外转换添加到机器中所有状态的快速方法。请注意,任意状态 (Any State) 的特殊含义意味着它不能是转换的结束点(即,跳转到“任意状态”不能用作挑选下一次进入的随机状态的方式)。

4、动画转换 (Animation Transition)

动画转换 (Animation Transition) 定义从一个 动画状态 (Animation State) 在任何给定时间都只能有一个转换处于活动状态。

相关属性:

原子 (Atomic) 此转换是否为原子转换?(无法中断)

条件 (Conditions) 在此处决定触发转换的时间时间。.

还可以使用退出时间Exit Time,而不使用参数,并指定表示源状态的规范化时间的数字(例如,0.95 表示在播放了 95% 的源片段内容时触发转换)。

参数值(如果需要):可以通过拖动重叠的开始值和结束值,来调整两个动画片段之间的转换。

四、混合树 (Blend Tree)

游戏动画中的一个常见任务是在两个或更多相似运动之间混合。最佳的已知示例可能是根据角色速度混合行走和奔跑动画。另一个示例是角色在奔跑过程中转弯时向左或向右倾斜。

重要的是区分转换 (Transition) 与混合树 (Blend Tree)。虽然两者都用于创建平滑动画,但是它们用于不同类型的情况。

基本概念:

转换 (Transition):用于在给定时间量内从一个动画状态 (Animation State) 平滑转换为另一个状态。转换指定为动画状态机 (Animation State Machine) 的一部分。如果转换迅速,则通常可从一个运动很好地转换为完全不同的运动。

混合树 (Blend Tree):用于允许通过按不同程度组合所有动画的各个部分来平滑混合多个动画。各个运动参与形成最终效果的量使用混合参数进行控制,该参数只是与动画器控制器 (Animator Controller) 关联的数值动画参数之一。要使混合运动有意义,混合的运动必须具有相似性质和时间。混合树 (Blend Tree) 是动画器控制器 (Animator Controller) 中的特殊状态类型。

相似运动示例可以是各种行走和奔跑动画。要使混合工作良好,片段中的移动必须在相同的规范化时间点发生。例如,行走和奔跑动画可以对齐,以便脚与地面接触的时刻在相同的规范化时间点发生(例如,左脚在 0.0 踏地,而右脚在 0.5 踏地)。因为使用规范化时间,所以片段是否具有不同长度无关紧要。

要开始使用新混合树 (Blend Tree),需要:

右键单击动动画器控制器窗口 (Animator Controller Window)上的空白空间

从出现的上下文菜单中选择 创建状态 (Create State) > 从新混合树 (From New Blend Tree)。

双击混合树 (Blend Tree) 以进入混合树图 (Blend Tree Graph)。

动画器控制器窗口 (Animator Controller Window) 现在显示整个混合树 (Blend Tree) 的图形,而检视器 (Inspector) 显示当前选择的节点及其直接子级。

动画器窗口 (Animator Window) 显示整个 混合树 (Blend Tree) 的图形。左侧是仅包含根混合节点 (Blend Node) 的混合树 (Blend Tree)。右侧是包含根混合节点 (Blend Node) 以及以三个动画片段 (Animation Clip) 作为子节点的混合树 (Blend Tree)。

这会为参数值变化时的动画组合方式提供图形可视化(在拖动滑块时,源自树根的箭头会改变其底纹以显示主要动画片段)。

可以在混合树 (Blend Tree) 图中选择任何节点以在检视器 (Inspector) 中检视它。如果所选节点是动画片段 (Animation Clip),则会显示该动画片段 (Animation Clip) 的检视器 (Inspector)。如果动画是从模型导入,则设置是只读的。如果节点是混合节点 (Blend Node),则会显示混合节点 (Blend Node) 的检视器 (Inspector)。

下图是运动前已添加的检视器 (Inspector) 中显示的混合节点 (Blend Node)。

混合类型”(Blend Type) 下拉菜单用于选择可以根据一个或两个参数混合的不同混合类型之一。可以在以下页面上了解有关不同混合类型和其他混合树 (Blend Tree) 选项的更多信息。

1、一维混合 (1D Blending)

混合节点 (Blend Node) 的检视器 (Inspector) 中的第一个选项是混合类型 (Blend Type)。此下拉菜单用于选择可以根据一个或两个参数混合的不同混合类型之一。一维混合 (1D Blending) 根据单个参数混合子运动。

设置混合类型 (Blend Type) 之后,需要执行的第一个操作是选择将控制此混合树 (Blend Tree) 的动画参数 (Animation Parameter)。在此示例中,该参数为方向 (direction),它在 -1.0(左)与 +1.0(右), 其中 0.0 表示笔直运行而不倾斜。

随后可以通过单击 + ->添加运动域 (Add Motion Field) 将动画片段 (Animation Clip) 添加到混合树中,从而添加各个动画。完成后,它应类似于下面这样:

2、二维混合 (2D Blending)

混合节点 (Blend Node)的检视器 (Inspector) 中的第一个选项是混合类型 (Blend Type)。此下拉菜单用于选择可以根据一个或两个参数混合的不同混合类型之一。二维混合 (2D Blending) 类型根据两个参数混合子运动。

3、其他混合树 (Blend Tree) 选项

以下选项对一维和二维混合通用。

时间尺度 (Time Scale)

可以使用动画速度数字字段(顶部具有时钟图标的列)改变动画片段 (Animation Clip) 的“自然”速度,从而可以通过使用值 2.0 作为速度,使行走速度是以前的两倍。调整时间尺度 (Adjust Time Scale) > 均匀速度 (Homogeneous Speed) 按钮可重新调整片段的速度,以便它们符合参数的最小值和最大值,但是保持最初具有的相同相对速度。

请注意,仅当所有运动都是动画片段 (Animation Clip) 而不是子混合树 (Blend Tree) 时,调整时间尺度 (Adjust Time Scale) 下拉菜单才可用。

镜像 (Mirroring)

可以通过启用最右侧的镜像开关来镜像运动列表中的任何类人动画片段 (Animation Clip)。此功能使您可以采用原始形式和镜像版本使用相同动画,而无需两次使用内存和空间。

【Unity】10.4 类人动画角色的控制的更多相关文章

  1. 【Unity】10.3 创建类人动画角色

    分类:Unity.C#.VS2015 创建日期:2016-05-02 一.简介 Mecanim 动画系统 (Mecanim Animation System) 特别适合使用类人骨架动画.由于类人骨架非 ...

  2. 【Unity】10.1 类人动画的导入和设置

    分类:Unity.C#.VS2015 创建日期:2016-05-02 一.制作或购买类人模型 为了充分使用 Mecanim 类人动画系统和类人动画的动画重定位功能,需要先使用其他3D建模软件(例如3d ...

  3. 利用GPU实现大规模动画角色的渲染

    0x00 前言 我想很多开发游戏的小伙伴都希望自己的场景内能渲染越多物体越好,甚至是能同时渲染成千上万个有自己动作的游戏角色就更好了. 但不幸的是,渲染和管理大量的游戏对象是以牺牲CPU和GPU性能为 ...

  4. 关于Unity中Mecanim动画的动画状态代码控制与代码生成动画控制器

    对于多量的.复杂的.有规律的控制器使用代码生成 动画状态代码控制 1:每个动画状态,比如进入状态,离开状态, 等都有可能需要代码来参与和处理,比如,进入这个动画单元后做哪些事情,来开这个动画单元后做哪 ...

  5. 游戏编程之Unity常用脚本类的继承关系

    前言学习Unity开发引擎的初学者会接触大量的脚本类,而这些类之间的关系往往容易被忽略.本文对Unity引擎开发中的一些常用类及其关系进行了简单的归纳总结. 博文首发地址:http://tieba.b ...

  6. 利用GPU实现大规模动画角色的渲染(转)

    原文: https://www.cnblogs.com/murongxiaopifu/p/7250772.html 利用GPU实现大规模动画角色的渲染 0x00 前言 我想很多开发游戏的小伙伴都希望自 ...

  7. Unity手游之路<七>角色控制器

    Unity手游之路<七>角色控制器 我们要控制角色的移动,可以全部细节都由自己来实现.控制角色模型的移动,同时移动摄影机,改变视角.当然Unity也提供了一些组件,可以让我们做更少的工作, ...

  8. 转:java开发的10位牛人

    文章来自于:http://it.deepinmind.com/java/2014/04/10/top-10-java-people-you-should-know.html James Gosling ...

  9. Unity游戏开发——自动为动画剪辑添加事件 之 最后几帧的事件不能被调用的问题

    最近在做一个根据配置表自动生成动画剪辑clip以及controller的功能.做法是根据配置表配置的动作以及每个动作的关键帧,自动为每个clip添加事件.这样做可以把动画的事件处理在游戏运行之前就计算 ...

随机推荐

  1. 大数据(十一) - Mahout

    传统数据挖掘/机器学习库存在的问题         缺少一个活跃的技术社区         扩展性差         文档化差,缺少实例         不开源.商业化库         通常由研究机 ...

  2. \G 用法:查询结果按列打印

    \G 用法:查询结果按列打印 \G 放到sql语句后,可以使每个字段打印到单独的行, 如: mysql \G; mysql> select * from t \G;*************** ...

  3. python 模块之os.path模块

    # -*- coding: cp936 -*- #python 27 #xiaodeng #python 模块之os.path模块 #http://www.cnblogs.com/dkblog/arc ...

  4. linux rpm 安装后 mysql 默认安装目录等信息

    MySQL安装完成后不象SQL Server默认安装在一个目录,它的数据库文件.配置文件和命令文件分别在不同的目录,了解这些目录非常重要,尤其对于Linux的初学者,因为 Linux本身的目录结构就比 ...

  5. quartz持久化部署实现

    http://blog.csdn.net/wxniitxueyuan/article/details/50477712

  6. 持续集成工具hudson

     2008-07-08  一.什么是持续集成 持续集成的核心概念 CI 过程会经常构建软件组件:在许多情况下,每当源代码存储库(比如 Subversion 或 ClearCase)中的代码发生变化时, ...

  7. Language and Compiler Features Since Delphi 7

    from: http://edn.embarcadero.com/cn/article/34324 Language and Compiler Features Since Delphi 7   In ...

  8. 如何设置页面自动刷新第一篇?? servlet setHeader("refresh","2")

    import java.io.IOException; import java.util.Random; import javax.servlet.ServletException; import j ...

  9. IOS的动态性

    IOS的动态性主要来自以下方面的特性:动态类型,动态绑定,动态载入,SEL类型. 1.IOS的动态类型:(强类型)id可以在代码运行时判断对象的类型.使用id类型(又称强类型)可以在运行的时候使用任何 ...

  10. 颜色传感器TCS230及颜色识别电路(转)

    摘要 TCS230是美国TAOS公司生产的一种可编程彩色光到频率的传感器.该传感器具有分辨率高.可编程的颜色选择与输出定标.单电源供电等特点:输出为数字量,可直接与微处理器连接.文中主要介绍TCS23 ...