Unity-动画基础

Animation动画窗口

打开Animation窗口

【Window】-【Animation】-【Animation】

Animation的窗口的作用

Animation 窗口 直译就是动画窗口

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

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

原理:

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

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

关键词说明

动画时间轴:

每一个动画文件都有自己的一个生命周期,从动画开始到结束

我们可以在动画时间轴上编辑每一个动画生命周期中变化

动画中的帧:

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

每一帧的间隔时间是 1s/60 ≈ 16.67 毫秒// 也就是说 我们最快可以每 16.67 毫秒改变一次对象状态

关键帧:

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

面板介绍

从左至右:

  1. 预览模式(开关)

  2. 录制模式(开关)打开后预览模式默认开启

  3. 回到动画开头

  4. 上一关键帧(快捷键:键盘逗号)

  5. 播放动画(快捷键:键盘 Alt + 逗号)

  6. 下一关键帧(快捷键:键盘句号)

  7. 回到动画结尾(快捷键:键盘 Alt + 句号)

  8. 当前处于第几帧

Dopesheet: 关键帧模式

Curves: 曲线模式

从左至右:

按选择筛选

添加关键帧

添加事件

动画时间轴面板,当编辑动画时,会在该面板上编辑关键帧等信息

创建动画

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

  2. 在 Animation 窗口中点击创建

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

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

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

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

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

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

Animation窗口变化

多出一个可以选择当前动画的下拉列表,可以在这里创建新动画和切换动画

多出一个可以添加变化属性的按钮,在这里你可以任意添加你想要在动画中变化的脚本变量

关键帧模式下编辑动画

先通过Add Property添加需要改变的属性

选择录制

以修改位置为例,添加关键帧,设置在此处位置的信息

关闭录制,即可生成动画

还有一种不在编辑界面操作的方式

什么事件都不添加,点击录制

选择时间,然后直接修改对象身上脚本的值

unity会自动生成关键帧并添加属性

曲线模式下编辑动画

时间轴可以拖动注意:时间轴上的单位为 n 秒 n 帧一格代表一帧(并不是秒)

Add Key:添加关键帧

Delete Key:删除关键帧

Clamped Auto:切线模式,自动设置切线

Auto:旧版切线模式,和 Clamped Auto 基本类似,主要用于老动画系统,建议不使用除非是老动画

Free Smooth:自由设置切线

Flat:切线设置为水平

Broken:单独控制左右曲线切线

Free:自由设置

Linear:直线

Constant:常量切换

Weighted:权重切换

要控制一个关键帧到另一个关键帧的变化是先快后慢还是先慢后快需要用到曲线模式

动画文件界面参数

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

Loop Pose:无缝循环运动

Cycle Offset:循环动画在其他时间开始时的周期偏移

代码控制动画(老动画系统)

什么是老动画系统

Unity 中有两套动画系统

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

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

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

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

老动画图系统控制动画播放

注意:在创建动画之前为对象添加Animation组件之后再制作动画,这时制作出的动画和之前的动画格式有区别

Animation:默认播放的动画

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

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

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

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

Always Animate:始终播放

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

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

Once:播放一次就停止

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

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

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

代码控制

cs 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class lesson6 : MonoBehaviour
{
    private Animation animation;
    // Start is called before the first frame update
    void Start()
    {
        animation = GetComponent<Animation>();
    }

    // Update is called once per frame
    void Update()
    {
        //播放动画
        if (Input.GetKeyDown(KeyCode.Alpha1))
        {
            animation.Play("1");
        }
        if (Input.GetKeyDown(KeyCode.Alpha2))
        {
            animation.Play("3");
        }
        //淡入播放,自动产生过渡效果
        if (Input.GetKeyDown(KeyCode.Alpha4))
        {
            //当你要播放的动画的开始状态和当前状态不匹配时就会产生过渡效果

            animation.CrossFade("4");
        }
        //前一个播放完再播放下一个
        if (Input.GetKeyDown(KeyCode.Alpha0))
        {
           // animation.PlayQueued("1");
            animation.CrossFadeQueued("1"); //过度
        }
        
        //停止播放所有动画
        //animation.Stop();

        //是否在播放某个动画
        if (animation.IsPlaying("1"))
        {
            Debug.Log("1 Playing");
        }

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

        //设置层级
        animation["1"].layer = 1;
        //设置权重
        animation["1"].weight = 1;
        //混合模式 叠加还是混合
        animation["1"].blendMode = AnimationBlendMode.Additive;
        //设置混组相关骨骼信息
        //animation[""].AddMixingTransform();
    }
}

动画事件

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

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

添加事件并选择触发事件的时间点

在对象的脚本中添加公共方法

cs 复制代码
public void AnimationEvent()
{
    Debug.Log("AnimationEvent");
}

然后选择添加的事件,给右侧的Function添加我们写好的函数

执行没有问题

Animator动画状态机

有限状态机概念

什么是有限状态机

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

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

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

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

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

举例说明:

假设我们人会做很多个动作,也就是有很多种状态

这些状态包括 站立、走路、跑步、攻击、防守、睡觉等等

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

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

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

最简单的状态机实现

最简单的状态机实现代码是基于switch的实现

cs 复制代码
string animName = "idle";
switch(animName)
{
    case "idle":
        //待机动作逻辑
        break;
    case "move":
        //移动动作逻辑
        break;
      case "run":
        //跑步动作逻辑
        break;      
     case "atk":
        //攻击动作逻辑
        break;       
}
Animator Controller动画控制器(状态机)
创建动画状态机

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

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

选择对象在【Window】中选择【Animation】进行创建

动画状态机窗口

Layers:动画层级页签,为动画添加更多的层级

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

眼睛图标:显隐左侧面板

网格化布局区域:

主要用于编辑状态之前的切换关系

  1. 窗口中的每一个矩形表示一个状态

  2. 窗口中的每一个箭头表示一个切换条件

矩形说明:

默认三大矩形:

绿色 Entry 矩形:进入状态机流程

红色 Exit 矩形:退出状态机流程

Any State:任意状态,代表状态机中的任意状态

人为添加矩形:

橙色矩形:一开始的默认状态动画,和 Entry 相连表示一开始播放的动画

灰色矩形:自己添加的某一种动作状态

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

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

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

添加切换连线

右键状态选择【Make Transition】然后选择需要关联的状态

添加切换条件

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

选择连线,右侧的【Inspector】窗口可以通过【Conditions】来添加条件

左边时类型,中间是条件判断(大于 小于 等于),右侧是值

代码控制状态机切换功能

Controller: 对应的动画控制器(状态机)

Avatar: 对应的替身配置信息

Apply Root Motion: 是否启用动画位移更新

UpdateMode: 更新模式(一般不修改它)

Normal: 正常更新

Animate Physics: 物理更新

Unscaled Time: 不受时间缩放影响

Culling Mode: 裁剪剔除模式

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

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

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

cs 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

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

        //获取值
        //animator.GetBool("条件名");

        //直接切换动画,除非特殊情况 不然不使用
        //animator.Play("状态名");

    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Alpha0))
        {
            animator.SetBool("New Bool", true);
        }
        if (Input.GetKeyDown(KeyCode.Alpha1))
        {
            animator.SetBool("New Bool", false);
        }
    }
}
相关推荐
陈言必行2 小时前
Unity 性能优化 之 内存优化
unity·性能优化·游戏引擎
ellis19703 小时前
LuaC API开发环境搭建保姆级教程
c++·unity·lua
arbboter3 小时前
【代码】关于C#支持文件和文本框的简单日志实现
数据库·c#·日志·log·日志库
玉龙20253 小时前
虚幻引擎(UE5)中实现物体破碎的方法
游戏引擎·虚幻·破碎系统·虚幻引擎破碎·虚幻引擎基础入门·ue5d基础入门
Eiceblue3 小时前
使用 C# 操作 Excel 工作表:添加、删除、复制、移动、重命名
服务器·开发语言·c#·excel
娶不到胡一菲的汪大东4 小时前
C#第五讲 函数的用法
开发语言·c#
coding-fun5 小时前
SuperScript:C#脚本编辑器、C#脚本引擎
开发语言·c#·编辑器
UsagiKnight5 小时前
UE5小游戏开发 - 武士决斗
ue5·游戏引擎·游戏程序
绀目澄清5 小时前
Unity 游戏引擎中 HDRP(高清渲染管线) 的材质着色器选择列表
unity·游戏引擎·材质