精华内容
下载资源
问答
  • FSM(Finite State Machine),无限状态机。一个状态机就是一个设备,具有有限的状态数量,在任何给定的时间根据输入和自己预先定好的状态转换规则,从一个状态跳转到另一个状态。一个有限状态机在同一时间只能处于某...
  • Simple Mirror Animation Unity动画镜像翻转插件,Mirroring character animations should not just be a Mecanim only feature. With the Simple Mirror Animation asset, legacy character animation mirroring is...
  • ae转unity动画

    2019-03-27 17:16:27
    1.可以分别自定义控制关键帧频率,位移、旋转等。 2.支持ugui和ngui。 3.支持AE合集。
  • Unity动画系统详解3:如何播放、切换动画?

    万次阅读 多人点赞 2020-05-31 19:37:49
    摘要:【长文预警,建议先收藏】有了模型和多个动画以后,在Unity中如何控制它们的播放和切换呢?本文带你一站式解析Unity的Animator模块。 洪流学堂,让你快人几步。你好,我是跟着大智学Unity的萌新,我叫小新,...

    摘要:【长文预警,建议先收藏】有了模型和多个动画以后,在Unity中如何控制它们的播放和切换呢?本文带你一站式解析Unity的Animator模块。

    洪流学堂,让你快人几步。你好,我是跟着大智学Unity的萌新,我叫小新,这几周一起来复(yu)习(xi)动画系统。

    大智:“小新,还记得Unity的动画来源有哪些么?”

    小新:“有Unity中制作和外部导入两种,哦对!还可以用代码写动画,不过我不会,嘿嘿”

    大智:“没错,前两天我们学习的其实主要是Animation Clip的内容,也就是一个物体对应的一段动画,是整个动画系统的基本元素。今天我们要着重学习一下Animator。如果把Animation Clip比作是一段视频的话,那么Animator就是一个视频播放器,用来控制多段视频的播放、切换等等。”

    Animator组件

    想要在一个物体上播放动画,需要在这个物体上添加Animator组件。

    Animator中有一个很重要的属性是Controller,这个属性引用了一种叫Animator Controller的资源,这种资源以文件的形式存储在工程中,文件内存储了动画的各种状态以及状态之间的切换规则。本文后半部分会细讲。

    Avatar 设置使用的骨骼节点映射。

    Apply Root Motion 应用根节点运动。如果不启用,动画播放时根节点会保持在原地,需要通过脚本控制物体的移动。如果启用,如果动画中有运动,动画中的运动会换算到根节点中,根节点会发生运动。(通常用于人物/动物的运动动画)

    Update Mode 设置Animator更新的时机以及timescale的设置。

    • Normal Animator按正常的方式更新(随着Update调用更新,timescale减小时,动画播放也会减慢,timescale的具体含义和用法后续会详解)
    • Animate Physics Animator会按照物理系统的频率更新(根据FixedUpdate调用更新,后续会详解),适用于物理交互,例如角色加上了物理属性可以推动周围的其他物体。
    • Unscaled Time 根据Update调用更新,无视timescale。一般用于UI界面,当你使用timescale暂停游戏时,界面保持正常动画。

    Culling Mode 裁剪模式

    • Always Animate 动画一直运行,即使物体在屏幕外被裁剪掉并没有渲染
    • Cull Update Transforms 当物体不可见时,禁用Retarget、IK、Transforms的更新(后续动画进阶模块会细讲)
    • Cull Completely 当物体不可见时,完全禁用动画

    Animator Controller

    Animator Controller是Animator组件必须的资源,这种资源以文件的形式存储在工程中,文件内存储了动画的各种状态以及状态之间的切换规则。

    上图中有两个Animator Controller文件

    通常一个物体上有不止一段动画,使用Animator Controller可以很容易地管理各段动画以及动画之间的切换。比如角色身上有走、跑、跳、蹲的动画,使用Animator Controller可以很容易管理它们。不过,即使只有一段动画,仍然需要给动画物体添加Animator组件才能播放动画。

    大智之前讲过可以使用PlayableAPI绕过Animator Controller来播放动画,感兴趣的话可以去看一下

    Animator Controller中使用了一种叫State Machine(状态机)的技术来管理状态以及状态之间的切换。

    StateMachine 状态机

    状态机由State(状态)和Transition(转换)组成。State代表一个状态,在Animator Controller中一个State可以包含一段动画、一个子状态机或一个混合树(后面会细讲)。Transition用来设置状态之间的切换条件,一般会有一个或多个条件,用于从一个状态切换到另一个状态。

    在Animator窗口中,可以可视化看到State以及Transition。

    创建Animator Controller

    创建Animator Controller资源有如下几种方式:

    • 在Unity中创建Animation Clip时,如果选中的GameObject上没有Animator组件,会自动添加Animator组件并在工程中创建一个Animator Controller文件(和Animation Clip文件同目录)。
    • 将任意Animation Clip拖到一个物体上时,如果拖到的物体上没有Animator组件,会自动添加Animator组件并在工程中创建一个Animator Controller文件(和Animation Clip文件同目录)。
    • 可以在Project窗口中手动创建Animator Controller文件,如下图所示:

    创建Animator Controller文件

    编辑Animator Controller

    双击Animator Controller文件,可以打开Animator窗口,编辑该文件。

    今天我们先简单学习一下如何将导入的动画播放出来,后续的动画进阶模块会更详细讲解Animator Controller中的高级功能。

    在Project窗口中直接创建Animator Controller时,其中是不包含任何动画的。如下图所示:

    图中包含三个节点:

    Entry 入口。动画状态机会从这个节点开始,根据Transition进入一个默认State。

    Any State 任意状态。用于从任意状态转换到特定状态。比如射击类游戏中,如果被子弹打中后,不管当前处于什么状态,都会倒地死亡。

    Exit 退出状态机。一般用于嵌套的状态机的退出(后面动画进阶模块会讲)。

    添加状态

    可以在空白处右键添加Empty State,也可以将Animation Clip文件拖到Animator窗口中添加一个State。

    如果当前在Project窗口选中了一个Animation Clip,也可以通过上图的From Selected Clip创建一个State,不过还是直接将Clip拖到Animator中创建State更简单,如下图所示。

    拖拽添加State.gif

    第一个创建的State默认是橘黄色的,代表是默认状态。有一条黄色的箭头从Entry指向橘黄色的State。Animator组件会在一开始播放New State,如果New State中有动画,也会播放对应的动画。

    这时候如果你Play这个场景的话,设个物体就会播放默认State的动画。

    State设置

    每个State可以包含一段Animation Clip,处于该State时Animator组件所在的物体会播放该动画。选中一个State时,在Inspector中可以看到如下内容:

    Motion 可以设置一个Animation Clip,如果是从Animation Clip创建的动画,这里应该已经有动画了,你也可以从工程中选择动画。

    Speed 动画的播放速度

    Multiplier 乘数,可以使用一个参数来控制动画的播放速度,动画最终的播放速度会是Speed * Multiplier。后面会讲解Animator的参数以及如何在代码中控制参数。

    Normalized Time 单位化时间,范围是0-1,需要使用参数控制。

    Mirror 镜像动画。也可以使用一个参数控制。

    Cycle Offset 循环偏移量。可以用来同步循环的动画。偏移量使用的是单位化时间,范围是0-1。也可以使用参数来控制。

    Foot IK 只用于人形动画。角色的脚是否使用反向动力学。

    Write Defaults 是否初始化该State没有用到的参数为默认值。

    Transitions 该状态参与的状态转换。下面会细讲。

    Parameters 参数

    上面我们提到了参数的概念,那么参数是什么呢?

    Animator Controller中的参数可以作为控制transition切换的条件,也可以控制上面可以参数化的属性比如State中的几个属性。

    State中可以用参数做属性值的来源

    Animator Controller的参数可以通过代码进行控制,进而控制整个Animator状态机的运转。

    参数共有4种类型:

    • Int 整数类型
    • Float 浮点数(小数)类型
    • Bool true或false(真或者假,用于逻辑判断),界面上显示为复选框
    • Trigger 触发器,与Bool有点类似,但是transition在使用这个参数后会被自动设置为false状态。界面上显示为一个圆形按钮。

    Transition

    Transition代表状态之间的切换条件,一般会有一个或多个条件,用于从一个状态切换到另一个状态。

    添加Transition

    在一个State上右键,在弹出菜单中选择Make Transition,可以创建一个到其他State的Transition。

    增加Transition

    点击代表Transition的箭头,可以在Inspector上看到这条Transition的具体情况。选中Transition的源State(从哪个State出发),也可以在State的Inspector中看到这条Transition的具体信息。

    Transitions 显示当前选中的Transition。后面有两个复选框包括Solo和Mute。

    • Solo 如果两个State之间有多条Transition,勾选这个选项后,只有选中Solo的Transition生效。其他Transition会被禁用。

    比如Transition1设置为Solo,则从源State到目的State的3个Transition中只有1会生效

    • Mute 勾选这个选项后,该条Transition会被禁用。如果同时选中了Solo和Mute,Mute会优先生效。

    Name Field 名称框。如上图所示,可以给Transition命名,用于区分两个State之间的多个Transition时非常有用。

    Has Exit Time 是否有退出时间条件。退出时间是一种特殊的transition条件,它没有依赖参数(下面会讲),而是根据设置的退出时间点作为条件进行状态转换。

    Settings transition的一些参数设置。

    • Exit Time 如果勾选了Has Exit Time,该参数是可以设置的,设置动画退出的单位化时间。例如设置为0.75,代表动画播放到75%时为true,如果没有其他条件,会直接切换到下一个State。

      如果exit time小于1,那么state每次循环到对应位置的时候(不管动画是否设置为循环,state总是循环的),该条件都会为true。比如第一次播放到75%,第二次播放到75%……时退出条件都会为true。

      如果exit time大于1,该条件只会检测一次。比如exit time为3.5,state的动画会在循环3次后,在播放到第4次的50%时为true。

    • Fixed Duration 勾选时,下方Transition Duration参数的单位是秒,不勾选时,参数会作为一个百分比。

    • Transition Duration transition的过渡时间。两个状态在转换时,一般不会瞬间从一个状态转换到另一个状态,而是会经过平滑混合,这个属性就是设置了平滑混合的时间。可以从下图的两个蓝色箭头看出转换的时间。

    • Transition Offset 目标状态开始播放的时间偏移。比如设置为0.5,则转换到下一个State时,会从50%的位置开始播放。

    如图设置为0.5时,下一个State会从50%开始转换

    • Interruption SourceOrdered Interruption 这两个参数可以用来控制transition的打断。下面会进行详解。

    Transition图

    上面的参数不仅可以手动修改数值,也可以通过Transition图预览、修改。

    Conditions 条件

    一个Transition可以有一个条件,也可以有多个条件,甚至没有条件。

    如果Conditions中没有条件,但是勾选了Has exit time,那么exit time会被作为state退出的条件,到达exit time时,会切换到下一个state。

    如果有一个或多个条件,需要同时满足这些条件才能切换下一个state。

    一个条件可以是:

    • 相等/不相等判断,一个参数等于/不等于一个常量时为true(int,float,bool类型参数)
    • 比较判断,一个参数与一个常量的比较结果(int,float类型参数)
    • 触发器,触发器激活时为true

    如果Has Exit Time勾选了,并且transition还有一个或多个条件,那么transition需要同时满足到达exit time同时条件全为true,才会切换到下一个state。

    一个transition至少要有一个条件(Has Exit Time可以作为一个条件),否则transition会被忽略。

    【选读】Transition Interruption

    之前我们提到了Interruption SourceOrdered Interruption 这两个参数可以用来控制transition的打断。那么究竟什么是transition打断呢?

    一般情况下,动画系统的transition是不能打断的:一旦transition开始从一个state切换到另一个state,没有打断的方法。就像乘坐跨大西洋航班的乘客一样,你舒适地坐在座位上,直到到达目的地,无法改变主意。对于大多数用户来说,这很好。

    但是如果你需要对transition进行更多控制,可以通过多种方式配置动画系统来满足需求。如果你对目前的目的地不满意,你可以跳进飞行员的座位,在飞行途中改变计划。这能带来更灵活的动画控制,但也很有可能迷失在复杂的打断中。

    我们通过几个例子来深入探索一下打断。从一个相当简单的状态机开始,这个状态机具有四个状态,标记为A到D,并且使用trigger作为每个transition的条件。

    默认情况下,当A到B的切换触发后,状态机开始切换到B,在切换到B之前无法被改变。但是,如果将A->B的transition的interruption source属性从None切换到Current State,A到B的切换就可以被A上的一些触发器中断。

    为什么只有一些呢?因为Ordered Interruption属性默认也会被勾选。这意味着只有优先级大于当前的transition才能打断。选中State A,在Inspector中查看,我们看到A -> C的优先级高于 A -> B,那也意味着只有A -> C能打断A -> B的转换。

    如果我们激活A->B的trigger,然后立马激活A->D的trigger,A到B的transition不会被打断。但是,如果我们激活A->B的trigger,然后立马激活A->C的trigger,A到B的transition会被打断,转而切换到C。

    在动画系统内部,会记录下被打断时的动画的状态,然后从打断的状态混合到新的目标动画。

    如果不勾选Ordered Interruption属性,会发生什么情况呢?A->C 和 A->D 都能打断 A -> B 的transition了。但是,如果在同一帧激活了A->C和A->D的trigger,A->C仍然会优先激活因为A->C的优先级更高。

    如果将A -> B的interruption source属性改为Next State,也就是下一个状态。A->C 和 A->D就不能打断A -> B了。如果我们激活A->B的trigger,然后立马激活B->D的trigger,A到B的transition会被打断,转而切换到D。

    B上的Transition的顺序也有影响。但是这时候Ordered Interruption属性就无法勾选了(因为A -> B是在State A上不在State B上,不参与B的排序)。B上transition的顺序会决定同时触发时,会使用哪一个transition。例如下图的排序,如果B->D 和B->C在同一帧被触发,B->D的transition会被执行。

    如果想完整控制,我们可以设置interruption source属性为Current State Then Next State或Next State Then Current State。设置为这两个值时,State A和State B上的transition都会被考虑在内。例如设置如下,选中了Current State Then Next State:

    如果A到B切换时,同时激活的A->C, A->D, B->C和B->D,会发生什么情况?

    如果选中了Ordered Interruption,那么首先可以忽略A->D(因为比A->B)的优先级低。然后先考虑Current State A,那么A->C会胜出,甚至不用考虑Next State B了。

    如果同样的配置,只激活了B->C 和 B->D,那么B->D会胜出,因为B->D的优先级比B->C更高。

    小结

    上面我们只使用了A->B一种情况作为例子进行了讲解,其他的中断都是类似的,只需要根据他们自身的规则即可。

    有一点很重要需要记住的是:不管打断发生了几次,只要transition没有完成,source state会一直不会变。比如A->B被B->C打断,又被C->D打断,transition未完成前source state会一直是A。Animator.GetCurrentAnimatorStateInfo()也会返回State A。

    简而言之,transition中断功能很强大,并提供了很大的灵活性,但会变得非常混乱。因此,合理地使用transition中断,而且一定要在编辑器中多进行测试。

    总结

    今天讲了Animator组件,希望你能记住一下几点:

    • 如果把Animation Clip比作是一段视频的话,那么Animator就是一个视频播放器,用来控制多段视频的播放、切换等等。
    • Animator Controller就是一个剧本,用来指导视频播放器如何播放多段视频。

    今日思考题

    大智:“导入Standard Assets中的Character包,看看里面的Animator Controller是如何设置的。”
    小新:“好嘞~”
    大智:“收获别忘了分享出来!别忘了点击右下角请好友看免费分享给你的朋友,也许能够帮到他。”

    扩展阅读

    【扩展学习】洪流学堂公众号回复动画可以阅读本系列所有文章,更有视频教程等着你!


    呼~ 今天小新絮絮叨叨的真是够够的了。没讲清楚的地方欢迎评论,咱们一起探索。

    我是大智(微信:zhz11235),你的技术探路者,下次见!

    别走!点赞收藏哦!

    好,你可以走了。

    展开全文
  • Unity动画系统详解1:在Unity中如何制作动画?

    千次阅读 多人点赞 2020-05-17 15:32:34
    Unity场景中的物体可以通过制作动画,让物体动起来。简单的动画如物体的移动、旋转(比如旋转的风扇、闪烁不定的灯泡等),复杂的动画如游戏中角色的动作、面部表情等。 洪流学堂,让你快人几步。你好,我是跟着大...

    摘要:在场景中加入动态的物体,可以让整个场景更加生动、真实。Unity场景中的物体可以通过制作动画,让物体动起来。简单的动画如物体的移动、旋转(比如旋转的风扇、闪烁不定的灯泡等),复杂的动画如游戏中角色的动作、面部表情等。

    洪流学堂,让你快人几步。你好,我是跟着大智学Unity的萌新,我叫小新,这几周一起来复(yu)习(xi)动画系统。

    包含动画的场景

    小新:“智哥,我想在场景里加上一个旋转的风扇怎么做啊?现在做的模型都是静态的。”

    大智:“这就需要用到动画系统了。在场景中加入动态的物体,会让整个场景更加生动、真实。除了上周学过的粒子效果外,场景中的物体也可以通过制作动画,让物体动起来。简单的动画如物体的移动、旋转(比如旋转的风扇、闪烁不定的灯泡等),复杂的动画如游戏中角色的动作、面部表情等。”

    动画系统

    Unity中的动画主要是三种来源:

    • 在Unity引擎中制作动画
    • 从外部工具(如3ds Max、Maya等)导入动画
    • 使用代码制作的动画

    下面讨论的主要是前两种来源的动画,使用代码写动画我们后面再学习。

    Unity中内置了强大的动画系统,可以支持在Unity内制作动画,也支持从外部导入动画。

    动画系统基于一种名为Animation Clip(动画剪辑)的资源,这些资源以文件的形式存在工程中。这些文件内的数据记录了物体如何随着时间移动、旋转、缩放,物体上的属性如何随着时间变化。每一个Clip文件是一段动画。

    这些动画可以在Unity中直接制作,也可以由美术同学在3D建模软件中制作并导入到Unity中。

    在Unity中制作动画

    在Unity中制作动画需要用到Animation窗口,可以通过菜单栏Window > Animation打开Animation窗口。

    通过这个窗口可以创建、编辑动画,也可以查看导入的动画。Animation窗口同一时间只能查看、编辑同一段Clip中的动画。Animation适合单个物体(及其子物体)的动画编辑。咱们最近刚学的Timeline系统,适合同时对场景中多个物体制作复杂动画,还能包含音频,自定义的动画内容。

    在Unity中制作动画一般分为以下几个步骤:
    1、打开Animation窗口
    2、选中要制作动画的物体
    3、创建新的动画Clip
    4、编辑、预览、修改动画

    创建新的Animation Clip

    选中要制作动画的物体,这时候Animation窗口会有以下两种状态:
    状态1:该物体上没有动画,可以点击Animation窗口中间的Create按钮创建动画Clip。

    物体上没有动画的情况

    状态2:该物体上已经有动画,会在窗口中显示一段动画的关键帧。可以通过左上角的菜单切换预览动画、创建新动画。可以点击Create New Clip…来创建新的动画Clip,如下图所示。

    物体上有动画的情况

    点击完创建新的动画Clip后,会弹出一个文件对话框,可以设置保存动画Clip的位置。(为了保持工程文件目录的整洁,不要保存在工程根目录,建议保存在Animations文件夹中)

    保存完毕后,原先没有动画的物体上会自动附加一个Animator组件,这个组件是做什么的呢?

    Animator组件

    Animation Clip只是一段动画数据,你可以把它类比成视频文件,而Animator组件是一个播放器,用来控制动画的播放、多个动画片段之间的切换等。

    Animator窗口

    **Animator组件的第一个属性是Controller,对应到工程目录中的文件是一个Animator Controller类型的文件,可以在这个文件中定义动画Clip之间如何进行切换。**双击这个文件会打开Unity的Animator窗口,显示该文件中的内容。后面会细讲Animator组件。

    制作动画

    创建了动画Clip后,就可以开始制作动画了。

    Animation窗口有两种模式:录制模式和预览模式。

    点击图中红色按钮进入录制模式,时间轴会显示为红色

    点击图中Preview按钮进入预览模式,时间轴会显示为浅蓝色。在时间轴上点击也会自动进入预览模式

    在录制模式下,当你对物体进行改动时(例如移动、旋转、缩放、修改属性等),Unity会自动在当前时间位置生成关键帧,记录修改的属性。

    在预览模式下,修改物体不会自动创建/修改关键帧,如果需要创建/修改关键帧,你需要手动点击添加关键帧按钮。

    录制关键帧

    点击录制按钮后,就进入了录制状态。

    可以通过在时间轴上拖动修改当前所在的时间位置。

    在时间轴上拖动修改当前时间

    也可以通过修改当前帧数输入框中的数字,修改时间轴的位置。默认情况下,动画的帧速率是60,即每秒播放60帧。如果设置当前帧数为30,就是0.5秒的位置。

    在录制模式下,不管是在场景中移动、旋转、缩放物体,还是在Inspector面板中修改物体组件的属性(Unity动画支持的属性),Unity都会自动在动画Clip的当前时间上添加关键帧保存。

    当前被记录的属性,在Inspector上会以红色背景显示

    编辑动画

    编辑完动画后,可以再次点击录制按钮退出录制模式,避免后续对物体的操作被记录到动画中。

    现在你会看到在Animation窗口中,左侧多处很多个属性,这些属性就是所有被记录的属性列表。你也可以通过点击下方的Add Property按钮手动添加需要被动画记录的属性。

    手动创建关键帧

    如果没有在录制模式下,对物体的修改不会自动记录到动画Clip中。如果需要记录,需要手动添加关键帧进行记录。

    如果在Inspector中修改了物体的属性,物体的属性会从浅蓝色背景变为浅红色,代表该属性已经被修改。这时候你可以右键点击对应的属性,在弹出菜单中点击Add Key即可添加关键帧,将该属性的数据保存到动画Clip中。如果你在当前帧修改了多个属性,可以点击菜单中的Key All Modified(将所有修改的属性记录关键帧)或Key All Animated(记录属性列表中所有属性的数值,即使与上一帧相同数值的属性也会被记录)来一次性将所有修改的属性保存。

    属性上的右键菜单

    也可以点击Animation窗口左侧的Add Keyframe按钮来记录当前属性列表中选中属性的关键帧,如果当前没有选中任何属性,则会记录所有属性。如下图所示。

    小技巧
    添加关键帧也有快捷键哦,记住快捷键能大幅提高制作动画的效率。

    • K Key All Animated,将记录当前属性列表中选中属性的关键帧,如果当前没有选中任何属性,则会记录所有属性。
    • Shift + K Key All Modified,将动画属性列表中所有已修改的属性的数值记录为关键帧。

    使用曲线编辑动画

    默认情况下,Animation窗口是DopeSheet模式,显示的是关键帧的点。可以通过点击下方的Curves切换为曲线模式,进一步调节关键帧之间的数值是如何过渡的。

    切换到Curves模式后,出现的曲线编辑框和我们之前在粒子系统模块学到的用法是一样的,在这就不重复了。

    可以在左侧属性列表选中一条或多条曲线进行编辑。

    小技巧
    别忘了F的妙用,F键可以让曲线充满整个窗口,这在不同属性的曲线之间切换时非常有用。

    编辑关键帧

    编辑关键帧时,可以多选(在Curve编辑中同理):

    • 按住Shift或Ctrl,再点击关键帧可以选中多个关键帧
    • 通过框选多选关键帧
    • 按住Shift或Ctrl的同时框选,可以添加或移除框选住的关键帧

    框选关键帧

    批量移动关键帧

    批量缩放关键帧

    Ripple Edit 波纹编辑

    你会发现直接拖拽多个关键帧时,后方的关键帧并不会跟随这些关键帧移动。如果你想让后方的关键帧也跟着移动,可以按住R键,同时拖拽这些关键帧。这种编辑方式叫做Ripple Edit(在音视频编辑软件中很常见)。缩放同理。

    Ripple Edit

    预览动画效果

    点击Animation窗口中的播放按钮,就可以在Scene中预览动画。

    在游戏运行时播放动画

    今天做出来的动画,在点击Play按钮以后就会自动循环播放了。如果不想让它循环播放,可以选中Animation Clip文件,取消Loop的勾选。

    如果不想让这段动画自动播放,那就需要修改Animator Controller啦,接着往下学吧!

    总结

    大智:“敲黑板,今天讲了如何使用Unity内的Animation给物体做动画,希望你能记住一下几点:”

    • Animation Clip是Unity中保存动画的资源文件,保存在工程中。
    • Animator是Animation Clip的播放器。
    • Animator Controller是一个“导演”,类似“播放列表”,用来指导Animator如何播放其中的Animation Clip

    如果你想降伏动画系统这个法宝,快去学习修炼吧,这里有完整的攻略

    今日思考题

    大智:“动手创建一个简单的动画试一试吧!”
    小新:“好嘞~”
    大智:“收获别忘了分享出来!别忘了分享给你的朋友,也许能够帮到他。”

    扩展阅读

    【建议收藏】找不到免费的角色动画?来试试mixamo
    5分钟制作过场动画
    5分钟入门Cinemachine智能相机系统
    Unity编辑器录屏神器:Unity Recorder

    【扩展学习】洪流学堂公众号回复动画可以阅读本系列所有文章,更有视频教程等着你!


    呼~ 今天小新絮絮叨叨的真是够够的了。没讲清楚的地方欢迎评论,咱们一起探索。

    我是大智(微信:zhz11235),你的技术探路者,下次见!

    别走!点赞收藏哦!

    好,你可以走了。

    展开全文
  • Ever wonder if it’s possible to make Unity follow a precise frame rate and potentially even follow an external clock source (commonly known as genlock)? This post will discuss how Unity natively ...

    unity 动画帧速率

    Ever wonder if it’s possible to make Unity follow a precise frame rate and potentially even follow an external clock source (commonly known as genlock)? This post will discuss how Unity natively maintains frame rates and how user code can be added to tightly control it. This can be vital in an environment like a broadcast studio where synchronization between Unity and other equipment is crucial.

    有没有想过是否有可能使Unity遵循精确的帧速率,甚至可能遵循外部时钟源(通常称为 genlock )? 这篇文章将讨论Unity如何本地保持帧速率,以及如何添加用户代码以对其进行严格控制。 这在广播工作室等环境中至关重要,在该环境中,Unity与其他设备之间的同步至关重要。

    Normally, out of the box, a Unity project will attempt to run your project as fast as possible. Frames will be rendered as quickly as they can while generally being limited by your display device’s refresh rate (see V Sync Count). The simplest way to start controlling frame rate is to explicitly set the QualitySettings.vSyncCount so that rendering will occur at an interval related to the display device’s refresh rate (e.g., for a 60Hz display, setting vSyncCount=2 will cause Unity to render at 30fps in sync with the display). This may not give granular enough control, however, as you are limited to submultiples of the display refresh rate.

    通常,开箱即用,Unity项目将尝试尽快运行您的项目。 帧将尽快渲染,而通常受显示设备的刷新率限制(请参见 V Sync Count )。 开始控制帧频的最简单方法是显式设置 QualitySettings.vSyncCount, 以便在与显示设备的刷新率相关的时间间隔进行渲染(例如,对于60Hz显示器,设置vSyncCount = 2将导致Unity以30fps的速度渲染与显示同步)。 但是,这可能无法提供足够的精细控制,因为您只能使用显示刷新率的整数倍。

    The next simplest solution would be to set QualitySettings.vSyncCount=0 and use Application.targetFrameRate to target a frame rate independent of the display’s refresh rate. With this set, Unity will throttle back its rendering loop to approximately this rate (note that tearing may occur since Unity will no longer be rendering in sync with the display). This is done in a low-cost manner so as not to unnecessarily burn CPU resources. The downside is that this approach may not yield the required precision for every use case.

    下一个最简单的解决方案是设置 QualitySettings.vSyncCount = 0并使用 Application.targetFrameRate 来定位独立于显示器刷新率的帧速率。 设置此设置后,Unity会将其渲染循环的速度降低到大约此速率(请注意, 由于Unity将不再与显示同步进行渲染,因此可能会发生 撕裂 )。 这是以低成本方式完成的,以免不必要地消耗CPU资源。 缺点是,这种方法可能无法为每个用例提供所需的精度。

    Fear not, coroutines can help improve precision. Rather than rely on Unity’s built-in frame rate throttling, you can control it yourself via script code. In order to do so, you must let Unity try to run as fast as possible by setting QualitySettings.vSyncCount=0 and Application.targetFrameRate to a very high value, and then, using a WaitForEndOfFrame coroutine, slow it down to precisely the rate you are looking for by refusing to allow the next frame to start rendering until you say so. To do this precisely, we suggest you use a combination of Thread.Sleep to conservatively delay the Unity rendering loop without eating up CPU resources, and then for the last few milliseconds, spin the CPU while checking for exactly the right time to allow the next frame to start. If you are trying to coordinate Unity’s frame rate with an external clock (genlock) you should break out of this CPU spinning loop as soon as an external sync signal is received.

    不用担心,协程可以帮助提高精度。 您可以依靠脚本代码自己控制它,而不必依靠Unity的内置帧率限制。 为此,您必须通过将 QualitySettings.vSyncCount = 0和 Application.targetFrameRate 设置 为一个很高的值来 让Unity尝试尽可能快地运行 ,然后使用 WaitForEndOfFrame 协程将其降低到精确的速率通过拒绝允许下一帧开始渲染来寻找,直到您这样说。 为了精确地做到这一点,我们建议您使用 Thread.Sleep 的组合 来保守地延迟Unity渲染循环而不会占用CPU资源,然后在最后几毫秒内旋转CPU,同时检查恰好合适的时间以允许下一次框架开始。 如果您尝试与外部时钟(同步锁相)协调Unity的帧速率,则应在收到外部同步信号后立即退出此CPU自旋循环。

    1

    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    using System.Collections;
    using System.Threading;
    using UnityEngine;
    public class ForceRenderRate : MonoBehaviour
    {
        public float Rate = 50.0f;
        float currentFrameTime;
        void Start()
        {
            QualitySettings.vSyncCount = 0;
            Application.targetFrameRate = 9999;
            currentFrameTime = Time.realtimeSinceStartup;
            StartCoroutine("WaitForNextFrame");
        }
        IEnumerator WaitForNextFrame()
        {
            while (true)
            {
                yield return new WaitForEndOfFrame();
                currentFrameTime += 1.0f / Rate;
                var t = Time.realtimeSinceStartup;
                var sleepTime = currentFrameTime - t - 0.01f;
                if (sleepTime > 0)
                    Thread.Sleep((int)(sleepTime * 1000));
                while (t < currentFrameTime)
                    t = Time.realtimeSinceStartup;
            }
        }
    }

    1

    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    using System . Collections ;
    using System . Threading ;
    using UnityEngine ;
    public class ForceRenderRate : MonoBehaviour
    {
         public float Rate = 50.0f ;
         float currentFrameTime ;
         void Start ( )
         {
             QualitySettings . vSyncCount = 0 ;
             Application . targetFrameRate = 9999 ;
             currentFrameTime = Time . realtimeSinceStartup ;
             StartCoroutine ( "WaitForNextFrame" ) ;
         }
         IEnumerator WaitForNextFrame ( )
         {
             while ( true )
             {
                 yield return new WaitForEndOfFrame ( ) ;
                 currentFrameTime += 1.0f / Rate ;
                 var t = Time . realtimeSinceStartup ;
                 var sleepTime = currentFrameTime - t - 0.01f ;
                 if ( sleepTime > 0 )
                     Thread . Sleep ( ( int ) ( sleepTime * 1000 ) ) ;
                 while ( t < currentFrameTime )
                     t = Time . realtimeSinceStartup ;
             }
         }
    }

    Finally, on a related topic, if trying to coordinate time with an external clock source, you may also want Unity’s internal game time to advance at the same pace (rather than follow the CPUs clock which may drift over time relative to the external source). This is can be achieved by setting Time.captureFramerate to the same rate as the external clock. For example, if your external genlock signal is operating at 60fps, setting captureFramerate to 60 instructs Unity to allow exactly 1/60th of a second of game time to elapse between frame renders regardless of exactly how much real time has passed. As of Unity 2019.2 beta, it is possible to set a floating point capture frame rate by setting Time.captureDeltaTime. For older Unity versions, if your external signal is not operating at an integer based rate (like say 59.94), you can vary captureFramerate at every frame rendering to achieve the desired average rate for the advancement of time.

    最后,在一个相关主题上,如果尝试与外部时钟源协调时间,那么您可能还希望Unity的内部游戏时间以相同的速度前进(而不是跟随可能随着时间而变化的CPU时钟)。 。 这可以通过将 Time.captureFramerate 设置 为与外部时钟相同的速率 来实现 。 例如,如果您的外部同步锁相信号以60fps运行,则将captureFramerate设置为60会指示Unity允许在帧渲染之间准确地经过游戏时间的1/60秒,而不管实际经过了多少时间。 从 Unity 2019.2 beta版开始 ,可以通过设置 Time.captureDeltaTime 来设置浮点捕获帧速率 。 对于较旧的Unity版本,如果您的外部信号不是以基于整数的速率运行(例如59.94),则可以在每个帧渲染时更改captureFramerate,以达到所需的平均速率以延长时间。

    A sample proof-of-concept Unity project exploring the above topic is available at our GitHub project page. Specifically, precise control of frame rate using the WaitForEndFrame coroutine is given in ForceRenderRate.cs. A more complex example which emulates an external genlock can be found in GenLockedRecorder.cs. Although Unity does not natively support any vendor-specific genock implementation, the latter is a good starting point for integration with a third-party SDK offering this feature.

    可以在我们的 GitHub项目页面上找到 探讨上述主题的示例概念证明Unity项目 。 具体来说, 在 ForceRenderRate.cs中 提供了 使用 WaitForEndFrame 协程 精确控制帧速率的 功能 。 可以在 GenLockedRecorder.cs中 找到一个更复杂的模拟外部同步锁相的 示例 。 尽管Unity本身不支持任何特定于供应商的genock实施,但后者是与提供此功能的第三方SDK集成的良好起点。

    Please note that all above techniques yield the most stable frame rates when part of a Unity standalone player build. They are functional nonetheless when in Play Mode inside the Unity Editor but you may experience momentary fluctuations from time to time.

    请注意,在Unity独立播放器构建的一部分中,上述所有技术都会产生最稳定的帧速率。 虽然它们在Unity编辑器中的“播放模式”下仍可运行,但您可能会时不时地遇到波动。

    翻译自: https://blogs.unity3d.com/2019/06/03/precise-framerates-in-unity/

    unity 动画帧速率

    展开全文
  • Unity动画Unity动画系统Bug集合

    千次阅读 2019-10-24 09:16:01
    不知道这算不算Bug,暂且这样叫吧。 1、希望调整动画播放速度,Animator调整State的Speed不起作用。 选中State里的Motion动画片段,调整其每秒帧数Samples即可。 ...

    不知道这算不算Bug,暂且这样叫吧。

     

    1、希望调整动画播放速度,Animator调整State的Speed不起作用。

    选中State里的Motion动画片段,调整其每秒帧数Samples即可。

    展开全文
  • 你好,我是跟着大智学Unity的萌新,我叫小新,这几周一起来复(yu)习(xi)动画系统。 “智哥,我现在做的吃鸡游戏没有人物,看着好奇怪啊,从哪能搞点人物模型呢?” “号外号外:本人已与百度达成合作,以后有...
  • Unity 动画压缩及其优化

    千次阅读 2019-12-02 00:57:31
    一:为什么要做动画优化 动画文件在游戏包体和内存中占的比例仅次于贴图,优化好动画文件,就优化...2.1:Unity引擎对导入的AnimationClip提供三种压缩格式,Off、Keyframe Reduction和Optimal。其中,Off表示不采...
  • Unity 动画 exe文件

    2013-10-08 14:14:14
    模拟的是一块石头从空中掉到草丛里。 左上角有FPS。 按“Alt”+“F4”可以退出。
  • 你好,我是跟着大智学Unity的萌新,我叫小新,这几周一起来复(yu)习(xi)动画系统。 “智哥,自从用了混合树来做人物移动,腰不酸腿不疼,思路更清晰了,一口气能写12小时代码!” “哟,疗效这么好,我看你应该...
  • Unity动画触发方法总结

    千次阅读 2021-03-23 21:22:04
    Unity动画触发方法总结 需求 UI动画希望玩家点击一次就播放一次 一、SetActive 这种情况需要在动画播放完毕后,将animator所在 gameobject设置为 inactive;或者在每次点击时先将gameObject设置为inactive,再timer...
  • Unity动画系统

    2017-12-18 09:15:19
    彻底掌握Unity动画系统。让你轻松开发出理想的游戏!祝你成功!链接已经整理
  • UNITY动画播放暂停

    2020-04-26 10:50:38
    检查animatioon 的loop是否勾选上
  • unity 动画特效

    2018-10-11 19:34:49
    unity 动画粒子特效包,包含大量好看的特效资源,使用方便
  • Unity动画状态机Animator使用

    万次阅读 多人点赞 2019-07-01 16:05:22
    unity可以用两种方式控制动画 1 Animations,这种方式简单,直接 Play(“Idle”) 或者 CorssFade(“Idle”) 就可以播放动画 2 Animator,5.x之后推荐使用这种方式,因为里面可以加上混合动画,让动画切换更加平滑 ...
  • Unity动画丨动画帧事件

    千次阅读 2019-08-05 15:24:24
    目的: 当模型动画播放到一定进度后,执行某函数 ...2、动画为自己在Unity中给模型制作的: 我们点击我们自己的模型,即使做成预制体,也会发现右侧Inspector面板并没有Animation-Events。我们需要如下操作 a...
  • Unity 动画的简单切换

    2020-12-08 16:39:28
    1.在Project面板下Asset中创建一个Animator Controller; 2.创建两个Animation,分别命名为Walk,Idle; **3.**打开Animator面板,创建两个Creat State—Empty,分别命名为Walk,Idle; ...(如上图) ...
  • 【Unity编程】Unity动画系统(一)

    千次阅读 2018-03-26 10:54:22
    Unity动画系统Unity动画系统,也称为“Mecanim”,提供了以下功能:简单的工作流程,设置动画的所有元素,包括对象,角色和属性。支持导入外部创建的动画片段和使用内置动画编辑器制作的动画片段。人型动画重新定位...
  • Unity动画控制器

    千次阅读 2019-01-11 15:34:46
    添加Animator组件,拖入预制体的动画控制器 双击进入Animator面板 点了线之后给这个线添加Conditions
  • 你好,我是跟着大智学Unity的萌新,我叫小新,这几周一起来复(yu)习(xi)动画系统。 “智哥,我用Animator做了一个人物移动的状态机,怎么看怎么不顺眼,这也太复杂了,你来看看?” “哟,这不是挺规整的嘛,...
  • Unity 动画系统的使用

    千次阅读 2019-05-25 10:45:44
    Unity 动画系统采用状态机,将每一个动画视为一个状态,根据用户的输入来改变状态机中的条件,利用该特定的条件来控制状态的切换,从而实现动画的改变。下面将从四个步骤来展示动画系统的使用方法。 在Project中...
  • unity3d战马动画资源包

    2019-02-23 00:15:31
    unity3d战马动画资源包,好东西分享。
  • unity动画冻结、减益、加速cs文件,u
  • unity 动画混合总结(一)

    千次阅读 2020-06-28 00:33:42
    动画混合总结: 1D: 运动阈值,看横轴,下图是-1到1.当处于某个金字塔顶峰时,表示该动画权重为1,其它动画权重为0. 注意横轴,横轴表示动画的影响值,对于某一位置的参数所有动画影响值之和为100%...
  • Unity动画真心烦,自己写了一个做动画的,效果不错。对计算机性能提升很有帮助,附加开发文档。不懂可以联系, 基于.net3.5 适用于Unity2017以及unity5 ,亲测可用
  • 在学习DOTween之前所有的动画都要通过Unity自带的动画系统去做,比较一下unity自带的动画系统。优点:动画制作成本低,不需要自己费时费力的完成各种动画的设计,缺点:对新手不太友好,需要程序基础和一定的英文基础。
  • Unity动画系统详解8:IK是什么?

    千次阅读 2020-07-19 09:48:20
    你好,我是跟着大智学Unity的萌新,我叫小新,这几周一起来复(yu)习(xi)动画系统。 “大智,昨天你说要给我讲讲IK,趁现在有空,你给我讲讲呗” “IK你已经明白是什么意思了吧?” “IK是Inverse Kinematic的...
  • 摘要:在Unity中只能制作比较简单的动画,要想要复杂的动画,比如人物跳舞的动画,那就得在外部的软件中制作并且导入到Unity中使用,那这个过程是什么呢? 洪流学堂,让你快人几步。你好,我是跟着大智学Unity的萌...
  • 利用Unity官方Animation示例里的两种动画节点,来实现外部输入index值时,自动将目前动画clip自动混合过度到指定index动画clip的功能。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 31,686
精华内容 12,674
关键字:

unity动画