Unity-Animation&Animator

这篇具有很好参考价值的文章主要介绍了Unity-Animation&Animator。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Animation动画窗口

Animation窗口 直译就是动画窗口

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

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


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

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

关键词说明

动画时间轴:

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

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

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

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

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

认识Animation面板

Unity-Animation&Animator,unity,游戏引擎

面板左侧

Unity-Animation&Animator,unity,游戏引擎

面板右侧

Unity-Animation&Animator,unity,游戏引擎

创建编辑动画

创建动画

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

2.在Animation窗口中点击创建

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


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

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

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

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

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

窗口变化

Unity-Animation&Animator,unity,游戏引擎

Unity-Animation&Animator,unity,游戏引擎

关键帧模式制作动画

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

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

曲线模式制作动画

Unity-Animation&Animator,unity,游戏引擎

可以在曲线上添加关键帧

Unity-Animation&Animator,unity,游戏引擎

动画文件界面参数

Unity-Animation&Animator,unity,游戏引擎

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

Loop Pose:无缝循环运动

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

代码控制老动画系统

Unity中有两套动画系统

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

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

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

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

老动画系统控制动画播放

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

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

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

创建后没有状态机文件

Animation参数
Unity-Animation&Animator,unity,游戏引擎

Animation:默认播放的动画

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

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

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

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

        Always Animate:始终播放

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

Unity-Animation&Animator,unity,游戏引擎

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();
    }

动画事件

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

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

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

Unity-Animation&Animator,unity,游戏引擎

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

Unity-Animation&Animator,unity,游戏引擎

    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.手动创建动画状态机文件

Unity-Animation&Animator,unity,游戏引擎

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

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

眼睛图标:显隐左侧面板

Unity-Animation&Animator,unity,游戏引擎

基础使用

添加动画

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

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

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

添加切换条件

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

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

Unity-Animation&Animator,unity,游戏引擎

Unity-Animation&Animator,unity,游戏引擎

Greater 0  则是大于0时切换

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

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

代码控制动画状态机切换

Animator参数

Unity-Animation&Animator,unity,游戏引擎

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.直接切换动画 除非特殊情况 不然一般不使用文章来源地址https://www.toymoban.com/news/detail-839457.html

animator.Play("状态名");

到了这里,关于Unity-Animation&Animator的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity Animation动画时间设置

    遇到一个需求,需要给角色添加一个翻滚动作,在翻滚同时无敌且可穿越敌人。 目前已有翻滚的动画,是使用Sprite制作的动画剪辑。如何匹配动画时间和脚色无敌时间?做到在翻滚结束时同时结束无敌与无碰撞设置。 在Animation设置窗口中,有Samples字段,可设置动画的采样帧

    2024年02月01日
    浏览(51)
  • Unity Animation -- 改进动画效果

          在上一篇笔记中(Unity Animation -- Overview_亦枫Leonlew的博客-CSDN博客),我们制作了简单的小球弹跳的动画,但这个动画看起来很不自然,小球的弹跳看起来就像是不受重力影响的物体,没有加速度的影响。要让小球的弹跳动画看起来更自然(不使用物理引擎,只使用动画

    2023年04月12日
    浏览(78)
  • Unity 制作动画 - Animation 的使用

    1. unity 顶部导航栏点击 Window  Animation 打开 Animation 窗口 通过这个窗口可以创建、编辑动画,也可以查看导入的动画。Animation 窗口同一时间只能查看、编辑同一段Clip中的动画 2. 选中 Hierarchy 面板中的节点, 也就是要制作动画的物体,该物体上没有动画,可以点击Animation窗口

    2024年02月15日
    浏览(42)
  • Unity Animation -- 使用Animator控制动画

            在很多实际场景中,我们经常需要根据特定的事件(比如玩家输入,敌人受到攻击等)来播放不同的动画。这需要我们了解一下Animator,Animator Controller和基础的动画状态机。         首先我们来创建一个简单的开门动画,示例中的门的模型来自官方教程。其实我们也

    2023年04月27日
    浏览(70)
  • Unity Animation、Animator 的使用(超详细)

    选中待提添加动画的物体, 在 Animation 窗口下 注意 :如果选中的物体无Animation/Animator组件,会自动添加Animator组件。 预览:启用/禁用场景预览模式。 录制:启用/禁用关键帧记录模式。 转到动画剪辑开头。 转到上一个 keyframe(关键帧)。 播放动画剪辑。 转到下一个keyfra

    2024年02月08日
    浏览(52)
  • 在Unity中,Animation和Animator区别

    在Unity中,Animation和Animator都是用于控制动画的组件,但它们的工作方式和应用场景不同。 Animation是一种比较简单的动画系统,它可以让开发者直接对物体的Transform、Rotation、Scale等属性进行关键帧动画编辑。开发者可以通过Animation组件将动画剪辑(Animation Clip)和动画控制器

    2024年02月15日
    浏览(51)
  • Unity 踩坑笔记 Animation动画不播放

    情况① 物体单挂Animation,无Animator,无法自动播放 原因 :两种Animation Clip 解决方案 : 注:此举会使其绑定的Animator失效 情况② 与上述相反,动画在Animator中无法播放 解决 :取消Legacy

    2024年02月12日
    浏览(39)
  • Unity用Animation组件制作简单的动画

    游戏中经常会出现动态提示,例如提示当前金钱不足,一般会从屏幕中央弹出,然后缓慢的向上飘去。 今天游戏项目中遇到了这么个要求,以前做过几次,但总是会忘记,而且随着unity版本更新,新版本总有些莫名其妙的坑,今天写个文章记录一下。 首先用到的组件是Anima

    2024年02月04日
    浏览(57)
  • Unity获取Animation和Animator的时长

    我们有时候会在协程中等待动画播放完毕,再去执行下一步的操作,但是由于不知道动画的播放时长,每次都要去看动画然后默数秒数(PS:作者以前是这样做的)。终于突发奇想我为什么不能直接获取动画的时长呢? 下面直接上代码

    2024年02月09日
    浏览(39)
  • Unity中Animation创建的动画如何指定播放

    使用Unity自带的Animation制作的动画如何指定帧播放和结束? 1.选择需要播放的动画,Inspector面板右键Debug,勾选Legacy 2.添加脚本,挂载脚本

    2024年02月03日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包