Unity-Animation&Animator

本文详细介绍了Unity中的Animation窗口、关键帧制作动画、动画文件参数、新老动画系统、Animator组件与AnimatorController的使用,以及有限状态机在游戏开发中的应用。涵盖了从创建动画到代码控制动画播放和状态机切换的全过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Animation动画窗口

Animation窗口 直译就是动画窗口

它主要用于在unity内部创建和修改动画

所有在场最中的对象都可以通过Animation窗口为其制作动画


原理:
制作动画时:记录在固定时间点对象挂载的脚本的变量变化

播放动画时:将制作动画时记录的数据在固定时间点进行改变,产生动画效果

关键词说明

动画时间轴:

每一个动画文件都有自己的一个生命周期,从动画开始到结束我们可以在动画时间轴上编辑每一个动画生命周期中变化

动画中的帧:
假设某个动画的帧率为60帧每秒,意味着该动画1秒钟最多会有60次改变机会

每一帧的间隔时间是 1s/60 = 16.67毫秒

也就是说 我们最快可以每16.67毫秒改变一次对象状态

关键帧:
动画在时间轴上的某一个时间节点上处于的状态

认识Animation面板

面板左侧

面板右侧

创建编辑动画

创建动画

1.在场景中选中想要创建动画的对象

2.在Animation窗口中点击创建

3.选择动画文件将要保存到的位置


保存动画文件时,unity会帮助我们完成以下操作

1.创建一个 Animator controller(动画控制器或称之为动画状态机) 资源(新动画系统)

2.将新创建的动画文件添加到Animator controller中

3.为动画对象添加Animator组件

4.为Animator组件关联创建的Animator controller文件

窗口变化

关键帧模式制作动画

普通的就是添加变化属性和关键帧,Unity会自动进行插值变化

还可以在录制模式下,在想要的位置直接更改对象的属性,Unity会自动添加关键帧

曲线模式制作动画

可以在曲线上添加关键帧

动画文件界面参数

Loop Time:是否是循环动画(在动画结尾时重新开始)

Loop Pose:无缝循环运动

Cycle Offset:循环动画在其他时间开始时的周期偏移(比如0.5,则一开始就在0.5秒的位置开始动画)

代码控制老动画系统

Unity中有两套动画系统

新:Mecanim动画系统-主要用Animator组件控制动画

老:Animation动画系统-主要用Animation组件控制动画(unity4之前的版本可能会用到)

目前我们为对象在Animation窗口创建的动画都会被新动画系统支配

有特殊需求或者针对一些简易动画,才会使用老动画系统

老动画系统控制动画播放

注意:
在创建动画之前为对象添加Animation组件之后再制作动画

这时制作出的动画和之前的动画格式是有区别的

老动画系统要给对象挂载Animation脚本后再创建动画

创建后没有状态机文件

Animation参数

Animation:默认播放的动画

Animations:该动画组件可以控制的所有动画

Play AutoMatically:是否一开始就自动播放默认动画

Animate Physics:动画是否与物理交互

Culling Type:决定什么时候不播放动画

        Always Animate:始终播放

        Based On Renderers:基于默认动画姿势剔除

Default:读取设置得更高的默认重复模式

Once:播放一次就停止

Loop:从头到尾不停循环播放

PingPong:从头到尾从尾到头不停播放

ClampForever:播放结束会停在最后一帧,并且会一直播放最后一帧(相当于状态不停止),表现效果和Once一样,但是逻辑处理上不同

代码控制

    Animation animation;
    // Start is called before the first frame update
    void Start()
    {
        animation = this.GetComponent<Animation>();

    }

    // Update is called once per frame
    void Update()
    {
        //播放动画
        if (Input.GetKeyDown(KeyCode.Alpha1))
            animation.Play("old");
            //animation.CrossFade("old");
        if (Input.GetKeyDown(KeyCode.Alpha2))
            animation.Play("old2");

        //淡入播放,自动产生过度效果
        //当要播放的动画的开始状态和当前状态不同,就会产生过度效果
        if (Input.GetKeyDown(KeyCode.Alpha3))
            animation.CrossFade("old3");

        //前一个播放完,再播放下一个
        if (Input.GetKeyDown(KeyCode.Alpha4))
            animation.PlayQueued("old2");
            //有过渡效果的
            //animation.CrossFadeQueued("old2")

        //停止所有动画
        animation.Stop();

        //是否在播放某动画
        if (animation.IsPlaying("old"))
        {
            print("在播放1");
        }

        //播放模式设置
        animation.wrapMode = WrapMode.Loop;

        //7.其它(了解即可,新动画系统中会详细讲解)
        //层级和权重以及混合(老动画系统需要通过代码来达到动画的遮罩、融合等效果)
        //设置层级
        animation["1"].layer = 1;
        //设置权重
        animation["1"].weight = 1;
        //混合模式 叠加还是混合
        animation["1"].blendMode = AnimationBlendMode.Additive;
        //设置混组相关骨骼信息
        //animation[""].AddMixingTransform();
    }

动画事件

动画事件主要用于处理 当动画播放到某一时刻想要触发某些逻辑

比如进行伤害检测、发射子弹、特效播放等等

添加动画事件后,选择该事件点,并添加事件

当动画播放到该时间点时,会调用该事件

    public void animationEvent()
    {
        print("动画事件触发");
    }
    
    //可以传各种参数,包括GameObject这类
    public void animationEvent(int i)
    {
        print("动画事件触发");
    }

总结

老动画系统主要用于处理老版本项目和简单的一些自制动画

新项目都不建议大家使用了

关键组件:Animation

Animator动画状态机

有限状态机

有限状态机(Finite-state machine,FsM)

又称有限状态自动机,简称状态机

是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型

有限:表示是有限度的不是无限的

状态:指所拥有的所有状态

举例说明:
假设我们人会做很多个动作,也就是有很多种状态,这些状态包括 站立、走路、跑步、攻击、防守、睡觉等等

我们每天都会在这些状态中切换,而且这些状态虽然多但是是有限的

当达到某种条件时,我们就会在这些状态中进行切换

而且这种切换时随时可能发生的

意义

游戏开发中有很多功能系统都是有限状态机

最典型的状态机系统

动作系统 - 当满足某个条件切换一个动作,且动作是有限的

AI(人工智能)系统-当满足某个条件切换一个状态,且状态是有限的

所以状态机是游戏开发中一个必不可少的概念

最简单的状态机实现

//最简单的状态机实现代码就是基于switch的实现
        //假设我们只有一个值来控制当前玩家的状态
        string animName = "idle";
        switch (animName)
        {
            case "idle":
                //待机动作逻辑
                break;
            case "move":
                //移动动作逻辑
                break;
            case "run":
                //跑步动作逻辑
                break;
        }

Animator Controller(动画控制器(状态机))

创建动画状态机

1.通过为场景中物体创建动画时自动创建

2.手动创建动画状态机文件

Layers:动画层级页签,为动画添加更多的层级,层级高的动画播放会覆盖层级低的(实际上并不准确,是权重影响)

Parameters:参数页签,为动画状态机添加控制状态切换的参数

眼睛图标:显隐左侧面板

基础使用

添加动画

1.自动添加一为对象创建动画后会白别将动画添加到状态机中

2.手动添加1-将动画文件拖入到状态机中(注意:老动画拖入会有警告)

3.手动添加2-右键创建状态,再关联动画

添加切换条件

在左侧面板点击参数页签
可以在这里添加4种类型的切换条件

添加多个条件,则要同时满足时才能切换

Greater 0  则是大于0时切换

Trigger条件则是满足一次后就会失效

Has Exit Time 勾选时当前动画播放完才会切换动画

代码控制动画状态机切换

Animator参数

Controller:对应的动画控制器(状态机)
Avatar:对应的替身配置信息(之后讲解3D模型时详细讲解)
Apply Root Motion:是否启用动画位移更新
UpdateMode:更新模式(一般不修改它)

        Normal:正常更新

        Animate Physics:物理更新

        Unscaled Time:不受时间缩放影响
Culling Mode:裁剪剔除模式

        Always Animate:始终播放动画,即使在屏幕外也不剔除

        Cull Update Transforms:摄像机没有渲染该物体时,停止位置、IK的写入

        Cull Completely:摄像机没有渲染物体时,整个动画被完全禁

AnimatorAPI

我们用代码控制状态机切换主要使用的就是Animator提供给我们的API

我们知道一共有四种切换条件 int float bool trigger

所以对应的API也是和这四种类型有关系的

1.通过状态机条件切换动画

  private Animator animator;
    // Start is called before the first frame update
    void Start()
    {
        animator = GetComponent<Animator>();
        //通过状态机条件切换动画
        animator.SetFloat("条件名",1.2f);
        animator.SetInteger("条件名", 5);
        animator.SetBool("条件名",true);
        animator.SetTrigger("条件名");

        animator.GetFloat("条件名");
        animator.GetInteger("条件名");
        animator.GetBool("条件名");
    }

2.直接切换动画 除非特殊情况 不然一般不使用

animator.Play("状态名");

### Animator 的定义与应用 在编程和软件开发的上下文中,“Animator”通常指的是用于创建动画效果的技术、库或者框架。它主要用于图形界面设计以及动态交互体验的实现。以下是关于 Animator 的一些核心概念及其应用场景: #### 1. 动画的核心功能 Animator 是一种工具或类,负责管理对象的状态变化并将其呈现为平滑过渡的效果。这种状态的变化可以涉及位置、大小、颜色或其他视觉属性。例如,在 Android 开发中,`ValueAnimator` 和 `ObjectAnimator` 类被广泛应用于 UI 组件的动画处理[^2]。 #### 2. 主要用途 Animator 被用来增强用户体验 (UX),通过提供流畅的视觉反馈来改善应用程序的表现力。常见的使用场景包括但不限于: - **UI 过渡**:当用户从一个页面切换到另一个页面时,Animator 可以生成淡入淡出、缩放等效果。 - **按钮点击反馈**:模拟按下按钮后的凹陷感或高亮显示。 - **数据可视化**:展示图表中的数值变化过程,使信息传递更加直观。 #### 3. 实现方式 根据不同平台和技术栈,Animator 的具体实现可能有所差异。下面列举几个典型例子: ##### (1)Android 中的 Animator 在 Android SDK 中提供了两种主要类型的 Animator- **ValueAnimator**: 它计算动画过程中某个值的变化情况,并允许开发者监听这些变化以便更新视图。 - **ObjectAnimator**: 基于 ValueAnimator 构建而成,可以直接作用于目标对象上的特定属性上。 示例代码如下所示: ```java // 使用 ObjectAnimator 创建简单的旋转动画 ObjectAnimator animator = ObjectAnimator.ofFloat(imageView, "rotation", 0f, 360f); animator.setDuration(1000); // 设置持续时间为一秒 animator.start(); // 启动动画 ``` ##### (2)Web 技术中的 CSS Animations / JavaScript Animation Libraries 对于 Web 应用程序而言,可以通过纯 CSS 或借助第三方 JS 库(如 GSAP、Anime.js 等)轻松完成复杂的动画效果制作。CSS animation 属性支持定义关键帧序列从而控制元素在整个时间线内的表现形式;而基于脚本的方法则赋予了更大的灵活性,能够实时调整参数甚至与其他逻辑紧密结合在一起工作。 #### 4. 关联技术对比 虽然上述提到的内容侧重讨论的是专门针对动画操作的部分组件/模块——即所谓的 “Animator”,但实际上整个生态系统还包括其他密切相关的部分比如 LayoutManager 控制布局安排、Renderer 处理最终渲染输出等等。它们共同协作才能构建起完整的现代化 GUI 系统架构体系结构模型[^3]。 --- ### 总结 综上所述,无论是在移动设备端还是桌面级跨平台解决方案里头,“Animator” 都扮演着极其重要的角色地位。凭借其强大的能力帮助程序员们打造出既美观又实用的产品原型设计方案出来!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值