Unity 核心系统详解 -- 动画系统

一 系统简介

Mecanim 动画系统是 Unity 公司从 Unity4.0 之后开始引入的新版动画系统,它提供了如下四种功能。

  • 为 Unity 的所有元素(包括对象、角色和属性)提供简单工作流程和动画设置。
  • 支持 导入的动画剪辑 以及 Unity 内创建的动画
  • 人形动画 重定向 - 能够将动画从一个角色模型应用到另一角色模型。
  • 对齐动画剪辑的简化工作流程。
  • 方便预览动画剪辑以及它们之间的过渡和交互。因此,动画师与工程师之间的工作更加独立,使动画师能够在挂入游戏代码之前为动画构建原型并进行预览。
  • 提供可视化编程工具来管理动画之间的复杂交互。
  • 以不同逻辑对不同身体部位进行动画化。
  • 分层和遮罩功

其工作流程分为下面几个阶段:

(1) 模型准备以及导入:通过第三方建模工具完成

(2) 角色设置:人形角色设置(Humanoid)和通用角色设置(Generic)

(3) 让角色运动:动画剪辑,状态机,混合树,动画参数控制

二 核心组成

在 Unity 中,想要为一个游戏物体(GameObject)添加动画效果,我们可以直接为它添加 Animator组件(注意,此处是 Animator而非 Animation)。而在每个 Animator组件中都会调用一个 Animator Controller(动画控制器),每个 Animator Controller又会引用多个 Animation Clip

以上黑体字基本包含了 unity 动画系统中三个比较重要的概念。下面自下而上讲解。

首先是最基础的 Animation Clip,可以看作是动画系统中最小的单位,游戏中角色的跑步,跳跃,攻击,摔倒都可以用一个完整的 Animation Clip 表示,可理解为动画短片。这些动画短片可以自己创建,也可以导入外部的资源。最方便的是直接导入 Unity Asset Store 上的资源,更多的时候是从游戏美工收到这些资源,通常是和游戏模型一起打包的,例如 FBX 格式的文件,可能就包含了人物模型,对应动画短片和骨架。

其次,我们还需要一个文件来部署和管理所有相关的 Animation Clip,即 Animator Controller,可理解为动画控制器。Animator Controller 中定义了如何从一个动画状态跳转到另一个动画状态,每个动画状态对应一个动画短片。即使只有一个动画状态,动画控制器也是必需的。

当拥有了一个 Animator Controller,就可以把它加到某个角色的 Animator 组件上控制角色的动作了,这里要注意的是 Animator Controller 和 Animation Clip 都是文件(File),Animator 则是 GameObject 上的一个组件(Component),不能混为一谈。

下面是 Unity 官方文档中给出的三者的关系:

2.1 Animator 组件

通过 Animation窗口(快捷键是 command+6) 中的 Create New Clip创建 Animation时,一个 Animator已经悄无声息地出现在了对应的 GameObject

2.2 Animator Controller 文件

在上一步中生成的 Animator组件上, 第一个 Controller参数在创建 Animator 时已经被赋值了,可以点击该值,并切换到 Project窗口下,会发现这个 Controller对应的文件是一个**.controller**文件。

Animator Controller就是动画控制器,负责在不同的动画间切换,属于制作动画效果的必备原件。

注意,也可以通过 GameObject上的 Add Component添加一个崭新的 Animator组件,但是这种情况下 AnimatorController参数默认为空,所以需要我们手动将事先准备好的.controller文件拖拽到该参数位置,动画控制器才能正常工作。
状态机的状态(State)

每个 Animator Controller都会自带三个状态:Any State, EntryExit

1、Any State 状态

表示任意状态的特殊状态。例如如果希望角色在任何状态下都有可能切换到死亡状态,那么 Any State 就可以做到。当某个状态可以从任何状态以相同的条件跳转到时,那么就可以用 Any State 来简化过渡关系。

2、Entry 状态

表示状态机的入口状态。为某个 GameObject 添加上 Animator 组件时,这个组件就会开始发挥它的作用。

如果 Animator Controller 控制多个 Animation 的播放,那么默认情况下 Animator 组件会播放哪个动画呢? 由 Entry 来决定的。

但是 Entry 本身并不包含动画,而是指向某个带有动画的状态,并设置其为默认状态。被设置为默认状态的状态会显示为 橘黄色。

可以随时在任意一个状态上通过 鼠标右键->Set as Layer Default State更改默认状态。记住,EntryAnimator组件被激活后 无条件 跳转到默认状态,并且每个 Layer有且仅有一个默认状态。

3、Exit 状态

表示状态机的出口状态,以红色标识。如果动画控制器只有一层,那么这个状态可能并没有什么用。但是当需要从子状态机中返回到上一层(Layer)时,把状态指向 Exit就可以了。

动画状态的属性

我们可以选中某个自定义状态,并在 Inspector窗口下观察它具有的属性

属性名描述
Motion状态对应的动画。每个状态的基本属性,直接选择已定义好的动画(Animation Clip)即可
Speed动画播放的速度。默认值为 1,表示速度为原动画的 1.0 倍。
Mutiplier勾选右侧的 Parameter 后可用,即在计算 Speed 的时考虑 区域 1 中定义的某个参数。若选择的参数为 smooth, 则动画播放速度的计算公式为 smooth * speed * fps(animation clip 中指定)
Mirror仅适用于 humanoid animation(人型机动画)
Cycle Offset周期偏移,取值范围为 0-1.0,用于控制动画起始的偏移量。把它和正弦函数的 offset 进行对比就能够理解了,只会影响起始动画的播放位置。
Foot IK仅适用于 humanoid animation(人型机动画)
Write Default最好保持默认,感兴趣可以参考官方手册
Transitions该状态向其他状态发起的过渡列表,包含了 Solo 和 Mute 两个参数,在预览状态机的效果时起作用
Add Behaviour用于向状态添加“行为”

2.3 Animation Clip 文件

双击 .controller"文件,会弹出一个 Animator窗口,该窗口中显示的就是动画控制器文件中的所有内容(也可以在顶部的工具栏通过 Window - Animator打开这个界面)

Project窗口右键单击,选择 Create->Animation创建 Animation Clip.anim文件)

### 关于Unity动画系统 Unity 动画系统是一个强大的工具集,旨在帮助开发者创建复杂的角色动画和其他动态效果。为了更好地理解如何使用 Unity动画系统,可以从以下几个方面入手: #### 1. **Animator 组件** 当在场景对象上添加 Animator 组件时,如果没有指定 Animator Controller,Unity 将会按照默认逻辑运行特定流程[^2]。这通常意味着需要手动配置 Animator Controller 来定义状态机和过渡规则。 #### 2. **Animator Controller** Animator Controller 是 Unity 中管理动画的核心文件之一。它允许用户通过可视化界面设置动画状态及其之间的转换条件。要实现复杂的行为模式,可以利用混合树(Blend Trees)、参数驱动的状态切换等功能。 以下是简单的脚本示例,展示如何访问并控制 Animator 参数: ```csharp using UnityEngine; public class Example : MonoBehaviour { private Animator _animator; void Start() { _animator = GetComponent<Animator>(); // 设置浮点型参数 _animator.SetFloat("Speed", 0.7f); // 触发布尔值变化 _animator.SetBool("IsRunning", true); } } ``` #### 3. **官方文档资源** 对于初学者而言,《User Guide》部分提供了关于 Unity 接口、资产工作流以及游戏构建的基础介绍[^3]。建议从 “Unity Basics” 子章节开始学习,逐步深入至更高级的主题如动画系统教程。 另外值得注意的是,尽管两份描述略有差异,但它们都强调了手册作为全面指导的重要性——既可以顺序阅读也可以按需查阅[^1][^4]。 #### 4. **常见问题排查** 如果遇到具体的技术难题,比如动画无法播放或者预期行为不一致,则应检查以下几点: - 是否正确关联了 Animator Controller 文件? - 所有必要的触发器/参数是否已被正确定义并在代码中调用? ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值