创建编辑Animation动画
创建动画
1.在场景中选中想要创建动画的对象
2.在Animation窗囗中点击创建
3.选择动画文件将要保存到的位置
保存动画文件时,unity会帮助我们完成以下操作
1.创建一个 Animator controller(动画控制器或称之为动画状态机)资源(新动画系统)
2.将新创建的动画文件添加到Animator controller中
3.为动画对象添加Animator组件
4.为Animator组件关联创建的Animator controller文件
窗口变化
关键帧模式下编辑动画
手动添加关键帧,添加要改变的量等
录制模式下可以直接在Inspector窗口下改变position等的值,unity会自动在Animation中添加对应的变量以及关键帧,较为方便
曲线模式下编辑动画
动画文件界面参数
Loop Time:是否循环播放动画(在动画结尾时重新开始)
Loop Pose:无缝循环运动
Cycle Offset:循环动画在其他时间开始时的周期偏移
代码控制老动画系统
Unity中有两套动画系统
新:Mecanim动画系统-主要用Animator组件控制动画
老:Animation动画系统一主要用Animation组件控制动画(Unity4之前的版本可能会用到)
目前我们为对象在Animation窗口创建的动画都会被新动画系统支配
有特殊需求或者针对一些简易动画,才会使用老动画系统
老动画系统创建动画要在添加动画之前现在对象上创建Animation组件,这样创建的动画没有状态机文件
Animation参数
Animation:默认播放的动画
Animations:该动画组件可控制的所有动画
Play AutoMatically:是否一开始就自动播放默认动画
Animate Physics:动画是否与物理交互
Culling Type:决定什么时候不播放动画
Always Animate:始终播放
Based On Renderers:基于默认动画姿势剔除(比如动画在屏幕外就不播放)
动画文件参数
Default:读取设置得更高的默认重复模式
Once:播放一次就停止
Loop:从头到尾不停循环播放
PingPong:从头到尾从尾到头不停播放
ClampForever:播放结束会停在最后一帧,并且会一直播放最后一帧(相当于状态不停止),表现效果和Once一样,但是逻辑处理上不同
代码控制
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.W))
{
animation.Play("1");
}
if (Input.GetKeyDown(KeyCode.S)){
animation.Play("2");
}
//淡入播放,自动产生过渡效果
if (Input.GetKeyDown(KeyCode.A))
{
animation.CrossFade("3");
}
//前一个播放完再播放下一个
if (Input.GetKeyDown(KeyCode.Alpha1))
{
//animation.PlayQueued("2");
//含过渡的依次播放
animation.CrossFadeQueued("2");
}
//停止播放
animation.Stop();
//是否在播放某动画
if (animation.IsPlaying("1"))
{
}
//播放模式设置
animation.wrapMode = WrapMode.Loop;
//其它(了解即可,新动画系统中会详细讲解)
//层级和权重以及混合(老动画系统需要通过代码来达到动画的遮罩、融合等效果)
//设置层级
animation["1"].layer = 1;
//设置权重
animation["2"].weight = 1;//权重1最高,高的覆盖低的动画
//混合模式 叠加还是混合
animation["1"].blendMode = AnimationBlendMode.Additive;
//设置混组相关骨骼信息
//animation["1"].AddMixingTransform();//传入transform
}
动画事件
动画事件主要用于处理 当动画播放到某一时刻想要触发某些逻辑
比如进行伤害检测、发射子弹、特效播放等等
按键在添加关键帧的右边,添加完毕后选中该事件,即可添加函数
public void AnimationEvent()//可以传入参数,如GameObject,可以在函数中实例化预设体等
{
print("动画事件触发");
}
函数还可以添加参数如GameObject
Animator动画状态机
创建动画状态机
通过场景中的物体创建动画时自动创建
手动创建动画状态机文件
左侧面板:
Layer:动画层级页签,为动画添加更多层级,层级搞得动画播放会覆盖层级低的(实际上要看里面的weight)
Parameters:参数页签,为动画状态机添加控制状态切换的参数
右侧面板:
添加动画
1.自动添加一为对象创建动画后会自动将动画添加到状态机中
2.手动添加1-将动画文件拖入到状态机中(注意:老动画拖入会有警告)
3.手动添加2-右键创建状态,再关联动画
添加切换条件
左侧面板点击参数页签,可以添加四种类型的条件切换变量
点击连线,右侧面板中conditions可以添加对已有的变量的条件判断
若多个条件需要同时满足才能跳转
Trigger条件则是满足一次后就会失效(还原)
Has Exit Time 勾选时当前动画播放完才会切换动画
代码控制动画状态机切换
关键组件Animator
Animator中的API
public class Lesson3 : MonoBehaviour
{
private Animator animator;
// Start is called before the first frame update
void Start()
{
animator = this.GetComponent<Animator>();
//通过状态条件切换动画
/* animator.SetFloat("条件变量名", 1.2f);
animator.SetBool("条件变量名", false);
animator.SetInteger("条件变量名", 1);
animator.SetTrigger("条件变量名");*/
//得到条件变量值
/* animator.GetInteger("条件变量名");*/
//直接切换动画 除非特殊情况不然不使用
//animator.Play("状态名");
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.A))
{
animator.SetBool("change", true);
}
if (Input.GetKeyDown(KeyCode.S))
{
animator.SetBool("change", false);
}
}
}