1、Trigger控制动画状态重复播放
/// <summary>
/// 清除所有的激活中的trigger缓存
/// </summary>
public void ResetAllTriggers(Animator animator)
{
AnimatorControllerParameter[] aps = animator.parameters;
for (int i = 0; i < aps.Length; i++)
{
AnimatorControllerParameter paramItem = aps[i];
if (paramItem.type == AnimatorControllerParameterType.Trigger)
{
string triggerName = paramItem.name;
bool isActive = animator.GetBool(triggerName);
if (isActive)
{
animator.ResetTrigger(triggerName);
}
}
}
}
2、Animation 动画K帧循环动画过渡卡顿
3、禁用动画资源是自带位移的
4、控制动画播放 暂停加速倒播
倒播需要设置参数控制
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ZRAnimatorControl : MonoBehaviour {
/*
animator所处的state播放完毕,如果未进入下一个state,且没有循环,
则该state的normalizedtime会大于1(state末尾)或小于0(负数,倒播到开头处,speed为负数);
如果此时触发条件进入下一个state,则会由于normalizedtime不是1,或0,
有一段时间延迟(1.xxx-->1或-0.xxx---->0),要解决滞后,可以这样:
获取normalizedtime:animator.getcurrentanimatorstateinfo(layer).normalizedtime;
animator.play("statename".layernumber,normalizedtime);设置状态所处特定帧;
*/
Animator Animator;
// Use this for initialization
void Start () {
Animator = this.GetComponent<Animator>();
}
// Update is called once per frame
void Update () {
}
private void OnGUI()
{
if (GUI.Button(new Rect(0, 0, 100, 40), "正常从开始处播动画"))
{
// 1、设置动画机播放的动画名称,动画控制层,动画播放到某时刻
// 2、设置为最初的动画名称即重置动画到最初状态
// 3、Update(0)即是刷新 0 层的 动画机,默认新建的动画在 0 层
Animator.Play("01CZAnimation", 0, 0);//刷新动画到某个时刻
Animator.Update(0);
Animator.SetFloat("speed",1);
}
if (GUI.Button(new Rect(0, 40, 100, 40), "正常结束后反播动画"))
{
//这样会有等待延迟因为NormalizedTime在一直录制增加,并没有在动画播放完时停止,倒放需要等待录制时间回退完
//Animator.ForceStateNormalizedTime
Animator.Play("01CZAnimation",0,1);
Animator.Update(0);
Animator.SetFloat("speed", -1);
}
}
}
5、动画融合和动画混合
主要是用骨骼遮罩,暂时没搞这么麻烦的动画
6、动画混合树Blend Tree 就是一个参数控制多个随机状态
一个Blend Tree其实也就是一个状态,和状态不同的地方就是一个状态只能设定一个动画,而一个Blend Tree则可以设定为多个动画的混合。
双击Run就可以进入混合树的编辑界面。
右击我们的混合树添加3个Motion,如下:
同时我们设定好3个方向的跑动动画:
我们还需要设定一个名为Direction的Float类型的参数来控制这个混合树:
7、动态绑定动画事件(不建议这样使用)
//动画事件不能检测到父物体脚步;
//动态事件要检测只绑定一次
RuntimeAnimatorController ranimator;
AnimationClip[] clips = null;
//自动播放的动画通过exit退出回到idle后为该动画片段添加事件重置动画状态
public void RegisterAnimationEvent()
{
// 获取运行时运行时动画器控制器ResetAnimationState()
ranimator = animator.runtimeAnimatorController;
clips = ranimator.animationClips;
for (int i = 0; i < clips.Length; i++)
{
//Debug.Log(clips[i].name);
//if (clips[i].events.Length == 0)
//{
switch (clips[i].name)
{
case "Idle":
{
//Debug.Log("重置动画状态");
//这里演示注册三个函数分别在动画开始,中途,结尾
AnimationEvent m_animator_Start = new AnimationEvent();
//AnimationEvent m_animator_Running = new AnimationEvent();
//AnimationEvent m_animator_End = new AnimationEvent();
//对应事件触发相应函数的名称
m_animator_Start.functionName = "ResetAnimationState";
//m_animator_Running.functionName = "ResetAnimationState";
//m_animator_End.functionName = "ResetAnimationState";
//设定对应事件在相应动画时间轴上的触发时间点
m_animator_Start.time = 0;
//m_animator_Running.time = clips[i].length * 0.5f;//中间
//m_animator_End.time = clips[i].length;
//把事件添加到时间轴上
clips[i].AddEvent(m_animator_Start);
// clips[i].AddEvent(m_animator_Running);
// clips[i].AddEvent(m_animator_End);
//clips[i].events = default(AnimationEvent[]);//注销
}
break;
}
//}
//这里绑定音效后有延迟原因不明
//AnimationEvent m_animator_StartAudio = new AnimationEvent();
//m_animator_StartAudio.functionName = "PlayerAudio";
//m_animator_StartAudio.time = 0;
//clips[i].AddEvent(m_animator_StartAudio);
}
animator.Rebind();
}
8、动画资源绑定的事件,在所有引用的prefab上都会触发,资源和事件是唯一对应关系,复用资源也必须使用其绑定的事件