第6章 Unity3D动画系统

Unity3D Animation System

虚拟现实技术与开发

让角色栩栩如生地动起来

本章内容概览

动画基础

  • 动画系统概述
  • AnimationClip动画剪辑
  • 旧版Animation组件

Mecanim系统

  • 导入模型与设置
  • Humanoid人形动画
  • 动画分割

Animator系统

  • Animator Controller
  • 动画状态机
  • 状态转换与参数

进阶功能

  • Avatar与Avatar Mask
  • Layer层动画融合
  • Timeline时间线

6.1 Unity动画系统概述

Mecanim动画系统:Unity 4.0引入的强大动画系统,基于Avatar骨骼重定向

动画系统核心概念

Mecanim优势

6.1.1 AnimationClip动画剪辑

AnimationClip:动画系统中最基本的概念,包含动画数据(位置、旋转变化)

获取动画剪辑的方式

动画录制步骤

  1. 选择游戏对象,绑定Animation组件
  2. Window → Animation打开编辑器
  3. 点击Create创建动画剪辑
  4. 点击Record按钮开始录制
  5. 在场景中移动/旋转/缩放对象
  6. 操作自动记录为关键帧

6.1.2 旧版Animation组件

Animation组件使用

  1. 给模型添加Animation组件
  2. 添加默认动画片段
  3. 可添加多个动画片段

Animation类方法

方法 功能
Play("AnimationName") 播放指定动画
Stop() 停止当前动画
CrossFade("Name", time) 淡入淡出切换动画
isPlaying 是否正在播放
// 示例:点击鼠标播放攻击动画
if (Input.GetMouseButtonDown(0)) {
    _ani.CrossFade("Attack", 0.5f);
}
if (!_ani.isPlaying) {
    _ani.Play("Idle");
}

6.1.2 AnimationEvent动画事件

动画事件:在动画播放到某一点时执行指定函数

添加事件步骤

  1. 创建脚本定义事件函数
  2. 在Animation编辑器中将播放头移到目标帧
  3. 点击Add Event按钮
  4. 在Inspector中选择要调用的函数
// 事件函数示例
public void TestAnimationEvent() {
    Debug.Log("播放了20帧,现在向上运动");
}

注意:事件函数必须是public,最多一个参数(int/bool/string/GameObject)

6.2 导入模型与动画设置

导入模型步骤

  1. Project面板右键 → Import New Asset
  2. 选择FBX模型文件
  3. 调整Scale Factor缩放比例

设置动画类型

类型 说明
None 无动画
Legacy 旧版动画系统
Generic 通用动画(非人形)
Humanoid 人形动画(推荐使用)

6.2.2 Humanoid人形动画设置

Humanoid:人形动画类型,支持骨骼重定向

设置步骤

  1. 模型Inspector → Rig选项卡
  2. Animation Type设为Humanoid
  3. 点击Apply应用
  4. 点击Configure按钮配置Avatar

Avatar配置

Muscles & Settings

设置骨骼带动身体各部分肌肉的开合度

6.2.3 动画分割(Animation Clipping)

动画分割:将导入的长动画分割为多个独立的动画片段

分割步骤

  1. 模型Inspector → Animations选项卡
  2. 看到Clips列表中的完整动画
  3. 点击"+"按钮添加新剪辑
  4. 设置Start和End帧
  5. 确保Loop Match为绿色
  6. 点击Apply确认

示例分割

6.3 Animator Controller与状态机

Animator Controller:动画控制器,核心是动画状态机(State Machine)

创建Animator Controller

Project → Create → Animator Controller

状态机组成

默认状态

6.3.1 动画状态机设置

添加状态与过渡

  1. 双击Animator Controller打开状态机窗口
  2. 将动画剪辑拖入窗口创建状态
  3. 右键状态 → Make Transition创建过渡
  4. 连接各状态形成状态图

创建参数

点击"+"添加参数:

设置过渡条件

6.3.2 代码控制动画状态

public class PlayerAnim : MonoBehaviour {
    private Animator anim;

    void Start() {
        anim = GetComponent<Animator>();
    }

    void Update() {
        // 设置Bool参数
        anim.SetBool("jump", Input.GetKeyDown(KeyCode.Space));

        // 设置Float参数
        float speed = Input.GetAxis("Vertical");
        anim.SetFloat("speed", speed);
    }
}

常用方法

6.4.1 Avatar与Avatar Mask

Avatar(骨骼映射)

Avatar Mask(身体遮罩)

作用:限制某些骨骼不播放动画,临时屏蔽身体部分运动

创建Avatar Mask

  1. Project → Create → Avatar Mask
  2. 双击打开Humanoid设置面板
  3. 点击身体部位切换红/绿色
  4. 绿色 - 正常动画,红色 - 屏蔽动画

6.4.1 Layer层动画融合

Layer层:实现层动画融合,同一套骨骼上两个动画同时播放

应用场景

下半身跑步 + 上半身投掷标枪

设置步骤

  1. Animator窗口点击Layer标签
  2. 点击"+"创建新层(如UpperBody)
  3. 点击齿轮设置层属性
  4. Weight - 层权重(0-1)
  5. Blending - 混合模式(Override/Additive)
  6. Mask - 选择Avatar Mask

6.4.2 Timeline时间线

Timeline:用时间线管理模型进度关系,制作过场动画、技能编辑器

Timeline功能

使用方法

  1. Window → Timeline打开时间线窗口
  2. 创建Timeline资源
  3. 添加Animation Track
  4. 拖入动画剪辑到时间线
  5. 调整播放速度和时序

本章小结

重点掌握

  • AnimationClip录制与导入
  • Humanoid人形动画设置
  • 动画分割方法
  • Animator Controller创建
  • 状态机设置与参数控制

了解拓展

  • 动画事件
  • Avatar骨骼映射
  • Avatar Mask身体遮罩
  • Layer层动画融合
  • Timeline时间线

思考题:简述游戏动画的几种类型及其原理

答案:关节动画、骨骼动画、单一网格模型动画。骨骼动画是最广泛应用的方式,骨骼按层次结构组成,皮肤蒙在骨骼之外