淘先锋技术网

首页 1 2 3 4 5 6 7

首先:百度到的Animator倒放方法可以用(https://jingyan.baidu.com/article/d713063593f99f13fdf475e1.html)。

 

但是 该方法需要在controller中添加参数,如果项目中有很多动画需要倒播,这么做出错率很高,重复劳动也很令人焦虑。

 

在网上一番搜索找到这位仁兄的方法:https://blog.csdn.net/qq_41752435/article/details/90113402#commentBox

 

一番测试之后确实可以使用,但是有几点需要补充说明一下:

 

  1. Animator的播放速度由 Animator.speed 控制,断点后发现,如果不先执行 Animator.StartPlayback()方法,speed的值是不可以被赋负值的,会被置0。所以很多人问为什么speed置-1动画暂停了,因为其实是置0了。
  2. Animator.StartPlayback()方法应该是配合StartRecording()等方法用于动画的录制和回放的,不知道为什么会影响到speed的赋值。
  3. 注意,如果需要倒放动画,需要从最后一帧往前放,和正常播放是相反的,所以需要执行:                                                         ani.Play(clipInfo.clip.name, 0, 1) , 正常的播放是ani.Play(clipInfo.clip.name, 0, 0)

 

 

贴上测试代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AnimatorTest : MonoBehaviour {

    Animator ani;

	// Use this for initialization
	void Start () {
        ani = GetComponent<Animator>();
	}
	
	// Update is called once per frame
	void Update () {

        if(Input.GetKey(KeyCode.A))
        {
            Play(1);
        }
        else if(Input.GetKey(KeyCode.B))
        {
            Play(-1);
        }
        else if (Input.GetKey(KeyCode.C))
        {
            Play(0.5f);
        }
        else if (Input.GetKey(KeyCode.D))
        {
            Play(-0.5f);
        }
        else if (Input.GetKey(KeyCode.E))
        {
            Stop();
        }
    }

    void Play(float speed)
    {
        if (ani != null)
        {
            //ani.enabled = false;
            ani.enabled = true;

            AnimatorClipInfo[] temps = ani.GetCurrentAnimatorClipInfo(0);
            AnimatorClipInfo clipInfo = new AnimatorClipInfo();
            if (temps.Length > 0)
            {
                clipInfo = temps[0];//获取动画clip
            }

            ani.StartPlayback();

            ani.speed = speed;

            ani.Play(clipInfo.clip.name, 0, speed < 0 ? 1 : 0);
        }
    }

    void Stop()
    {
        AnimatorClipInfo[] temps = ani.GetCurrentAnimatorClipInfo(0);
        AnimatorClipInfo clipInfo = new AnimatorClipInfo();
        if (temps.Length > 0)
        {
            clipInfo = temps[0];
        }
        ani.Play(clipInfo.clip.name,0,0);
        ani.speed = 0;
    }
}