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.通过状态机条件切换动画文章来源:https://www.toymoban.com/news/detail-839457.html
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模板网!