Unity动画控制

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就可以进入混合树的编辑界面。

右击我们的混合树添加3Motion,如下:

https://images2015.cnblogs.com/blog/223374/201509/223374-20150924111323053-1520574703.jpg

同时我们设定好3个方向的跑动动画:

https://images2015.cnblogs.com/blog/223374/201509/223374-20150924111600490-1545899459.jpg

我们还需要设定一个名为DirectionFloat类型的参数来控制这个混合树:

https://images2015.cnblogs.com/blog/223374/201509/223374-20150924112710553-1027459644.jpg

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上都会触发,资源和事件是唯一对应关系,复用资源也必须使用其绑定的事件

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值