11.动画 Animation

在 Unity 中,动画包括 Animation 和 Animator ,它们都是用于控制动画的组件,但它们的工作方式和应用场景不同。

Animation是一种比较简单的动画系统,它可以让开发者直接对物体的 Transform、Rotation、Scale 等属性进行关键帧动画编辑。开发者可以通过 Animation 组件将动画剪辑(Animation Clip)和动画控制器(Animation Controller)添加到游戏对象上,实现对其属性的动画控制。Animation 组件适用于制作简单的动画,如角色行走、跳跃等。

Animator是一种更为复杂的动画系统,它使用状态机(State Machine)来控制游戏对象的动画。Animator 组件可以将 Animator Controller 添加到游戏对象上,Animator Controller 中包含多个状态(State),每个状态又包含多个动画剪辑(Animation Clip)。在 Animator Controller 中,开发者可以定义不同的状态转换条件和动画播放逻辑,实现更为复杂的动画控制。Animator 组件适用于制作复杂的动画,如角色技能、战斗等。

举例来说,如果你需要制作一个简单的角色行走动画,你可以使用 Animation 组件。你可以在 Unity 编辑器中创建一个 Animation Clip,然后使用关键帧来编辑角色的移动和旋转。将 Animation Clip 和 Animation Controller 添加到角色游戏对象上,然后在代码中使用 Animation 组件来播放动画。这样,当你让角色移动时,动画就会自动播放。

如果你需要制作一个复杂的角色技能动画,你可以使用 Animator 组件。你可以在 Unity 编辑器中创建一个 Animator Controller,然后使用状态机来定义角色的不同状态(如待机、行走、攻击、技能等)。在每个状态中,你可以使用多个 Animation Clip 来定义不同的动画。然后在代码中使用 Animator 组件来控制角色的状态,从而实现复杂的动画效果。

本节介绍简单的 Animation 动画。

11.1 动画组件 Animation

动画的创建步骤:

1.为模型添加 Animation 组件(动画组件);

2.通过 Animation 编辑器(Animation Clip 动画剪辑编辑器)修改动画的关键帧;

3.给 Animation 组件应用动画剪辑即可。

11.1.1 动画组件 Animation

选中要创建动画的物体,在 Inspector 视图中单击 Add Component -> Miscellaneous -> Animation,添加组件后如下图所示:

unity入门小动画(11.Unity动画Animation)(1)

Animation 组件的属性如下:

  1. Always Animate - 即使离开屏幕,动画会一直执行,不会进行动画剔除
  2. BasedOnRenderers - 当渲染不可见时,动画将停止
11.1.2 创建动画剪辑 Animation Clip

选中要创建动画的物体,选择菜单 Window -> Animation -> Animation,打开 Animation 面板,如下图所示:

unity入门小动画(11.Unity动画Animation)(2)

该面板用于创建 Animation Clip。每个动画组件都可以创建多个动画剪辑,单击 Create 按钮后设置保存位置和名称即可创建第一个动画。如下图所示:

unity入门小动画(11.Unity动画Animation)(3)

操作控制:

动画剪辑的属性:

选中动画剪辑,在 Inspector 视图中可以设置动画剪辑的属性 Wrap Mode,默认情况下只播放一次,可以修改为循环。

11.2 动画制作11.2.1 通过属性制作动画

在 Animation 组件中,动画的制作就是属性的变化,比如:位置属性变化产生的就是移动动画,旋转属性的变化就是旋转动画。

操作步骤:

  1. 单击 Add Property 按钮选择属性并单击属性右侧的加号按钮,此时,在右侧的时间线面板上自动在第 0 秒和第 1 秒处生成两个关键帧,这两个关键帧表示动画剪辑的开头和末尾;
  2. 在时间线上可以单击,单击后出现白色竖线表示当前时间线,此时,可以在左侧修改属性值,修改属性值后会自动生成一个关键帧,也可以通过右击时间轴下方的灰色帧的灰色区域,选择 Add Key 来添加关键帧,然后在关键帧上设置属性值;
  3. 动画剪辑编辑完后,将 Project 视图中的动画剪辑拖拽到物体的 Animation 组件中。

如下图所示:

unity入门小动画(11.Unity动画Animation)(4)

11.2.2 通过曲线控制动画

在 Animation 面板的左侧右下角的按钮 Curves ,单击后即可切换到曲线模式,可以在曲线模式中看到属性的变化和关键帧的位置,如下图所示:

unity入门小动画(11.Unity动画Animation)(5)

在这个曲线编辑器中,可以直接对曲线进行拖拽编辑,单击关键点会出现左右切线操作杆用于改变曲线形状。右击曲线可添加关键帧,右击关键帧后的菜单如下图所示:

unity入门小动画(11.Unity动画Animation)(6)

Delete Key 可删除关键帧

Edit Key 可修改关键帧的具体时间和属性值

其他选项均为曲线操作杆的设置,其中 Broken(中断),是将操作杆断开,断开后可对左切线和右切线分别单独进行设置。

11.2.3 帧事件

在动画的某一帧可以触发脚本事件,在事件中可以执行相应的代码,这就是帧事件。

首先创建脚本并把脚本挂载到对象上,然后在动画的关键帧上通过添加帧事件,设置对应代码中的方法即可。

示例:

先创建脚本并挂载到对象,脚本代码如下:

using System.Collections; using System.Collections.Generic; using UnityEngine; public class CubeFrame : MonoBehaviour { // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { } void FrameEvent() { Debug.Log("帧事件"); } }

如下图所示:

unity入门小动画(11.Unity动画Animation)(7)

选择关键帧,单击 Add Event,在右侧 Inspector 视图中选择代码上的方法即可。

11.3 动画示例

1.创建一个项目 door

2.选择 Window -> Asset Store,下载并导入 Door Free Pack Aferar(这个资源是多种类型的房门),资源导入后,在 Project 视图中 Assets 文件夹下打开 01_AssetStore/DoorPackFree/Scenes 文件夹,双击 Demo 场景,如下图所示:

unity入门小动画(11.Unity动画Animation)(8)

3.在 Hierarchy 视图中选择 Door001/01_low,该物体是第一扇门,选择该物体的 z 轴可以对门进行开关,设置其旋转属性为(-90,0,-180)为该物体添加 Animation 组件。

4.选择 Window -> Animation -> Animation,打开 Animation 面板,单击 Create 按钮创建一个动画剪辑,命名为 Open,单击 Add Property,添加 Rotation 属性。

5.设置 0 秒处的关键帧的 Rotation.z 为 0,1 秒处的关键帧的 Rotation.z 为 -180,保存动画。

6.创建一个新的动画剪辑并命名为 Close,单击 Add Property,添加 Rotation 属性,设置 0 秒处的关键帧的 Rotation.z 为 -180,1 秒处的关键帧的 Rotation.z 为 0,保存动画。

7.创建脚本 DoorController 并挂载到 Door001/01_low 物体上,编写代码如下:

using System.Collections; using System.Collections.Generic; using UnityEngine; public class DoorController : MonoBehaviour { private Animation anim; private bool isOpen = true; // Start is called before the first frame update void Start() { anim = GetComponent<Animation>(); } // Update is called once per frame void Update() { if (Input.GetMouseButtonDown(0)) { // 单击鼠标左键时播放开门动画 if (!anim.isPlaying && !isOpen) { isOpen = true; anim.Play("Open"); } } if (Input.GetMouseButtonDown(1)) { // 单击鼠标右键时播放关门动画 if (!anim.isPlaying && isOpen) { isOpen = false; anim.Play("Close"); } } } }

8.在 Hierarchy 视图中选择 Door001/01_low,在 Inspector 视图中取消勾选 Static 选项。

此时 Animation 组件的设置如下图所示:

unity入门小动画(11.Unity动画Animation)(9)

运行游戏,单击鼠标右键关门,单击鼠标左键开门。

,