Unity 如何设定 Animator分割播放

 更新时间:2021年4月10日 20:00  点击:1843

项目有个需求,一整段非常长的Animator 动画, 分割成一份份的播放,我们点击相应的按钮就播放某个时间点的动画,废话不多说

新建一个空物体加上toggle group,

下面是一堆的toggle并在Group里加上父亲

 private Animator myAnimator;
    public List<Toggle> myTogglesList;
    private float playTime;
    public void Awake()
    {
        myAnimator = GameObject.Find("XXX/xxx").GetComponent<Animator>();
        myTogglesList.AddRange(transform.GetComponentsInChildren<Toggle>());
    }
    public void Start()
    {
        base.Start();
        for (int i = 0; i < myTogglesList.Count; i++)
        {
            Toggle go = myTogglesList[i];
            myTogglesList[i].onValueChanged.AddListener((bool value) => OnClickBtn(go.gameObject, value));
        }
    }

void Update()
    {
     //playTime  得到当前时间点
        playTime = myAnimator.GetCurrentAnimatorStateInfo(0).normalizedTime;
        Debug.Log(playTime);
        if (myTogglesList[0].isOn && playTime > 0.1f)
        {
         //Animator.Play("ANI1", 0, 0f)  第一参数 ANI1动画名  第二参数0,为0层, 第三参数 0f,为开始时间
            myAnimator.Play("ANI1", 0, 0f);
        }
        if (myTogglesList[1].isOn && playTime > 0.3f)
        {
            myAnimator.Play("ANI1", 0, 0.1f);
        }
        if (myTogglesList[2].isOn && playTime > 0.5f)
        {
            myAnimator.Play("ANI1", 0, 0.3f);
        }
        if (myTogglesList[3].isOn && playTime > 0.8f)
        {
            myAnimator.Play("ANI1", 0, 0.5f);
        }
  .........................
    }
    private void OnClickBtn(GameObject go, bool value)
    {
        switch (go.name)
        {
            case "btn01 (1)":
                myAnimator.Play("ANI1", 0, 0f);
                break;
            case "btn01 (2)":
                myAnimator.Play("ANI1", 0, 0.1f);
                break;
            case "btn01 (3)":
                myAnimator.Play("ANI1", 0, 0.3f);
                break;
            case "btn01 (3)":
                myAnimator.Play("ANI1", 0, 0.5f);
                break;
                .........................
        }
    }

补充:Unity animator不剪辑动画实现 分段播放动画

我就废话不多说了,大家还是直接看代码吧~

public Animator anim;
    private AnimatorStateInfo animInfo;    
    /// <summary>
    /// 控制动画暂停和播放
    /// </summary>
    int playSpeed = 0;
    void Update()
    { 
        animInfo = anim.GetCurrentAnimatorStateInfo(0);
        //判断正在播放Take 001动画
        if (animInfo.normalizedTime < 0.99f && animInfo.IsName("Take 001"))
        {
            //第一段动画
            if (animInfo.normalizedTime > 0.19 && animInfo.normalizedTime < 0.2)
            {
                //达到条件时暂停播放动画
                print("暂停播放1");
                anim.speed = playSpeed; 
            }
            //第二段动画
            else if (animInfo.normalizedTime > 0.39 && animInfo.normalizedTime < 0.4)
            {
                print("暂停播放2");
                anim.speed = playSpeed;
            }
            else
            {
                //自动设置回停止播放条件
                playSpeed = 0;
            } 
        }
     }
 
    /// <summary>
    /// 开始播放动画
    /// </summary>
    private void PlayAnim()
    {
        //设置播放动画条件
        playSpeed = 1;
    }

animInfo.normalizedTime 动画状态标准化时间,一段动画值为从0~1。到1则动画播放完毕

animInfo.IsName("Take 001") 当前播放的动画,Take 001是动画名称

原理:首先要知道每段动画结束帧,然后该段动画结束帧除于总帧得到该结束帧在animInfo.normalizedTime 的值,最后作为条件暂停动画,继续播放动画可实现下一段动画的启停。

比如:有一个动画100帧,不剪辑,需要播放多段动画。

得知第一段的结束帧在20帧,那么20/100=0.2,0.2则为normalizedTime 值作为动画暂停条件(写条件的时候可以设个范围)。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持猪先飞。如有错误或未考虑完全的地方,望不吝赐教。

[!--infotagslink--]

相关文章

  • python使用pandas按照行数分割表格

    本文主要介绍了python使用pandas按照行数分割表格,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-08-13
  • Unity时间戳的使用方法

    这篇文章主要为大家详细介绍了Unity时间戳的使用方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • 如何使用JavaScript实现无缝滚动自动播放轮播图效果

    这篇文章主要介绍了如何使用JavaScript实现“无缝滚动 自动播放”轮播图效果,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-08-20
  • 详解Howler.js Web音频播放终极解决方案

    这篇文章主要介绍了详解Howler.js Web音频播放终极解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-08-24
  • vue+video.js实现视频播放列表

    这篇文章主要为大家详细介绍了vue+video.js实现视频播放列表,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-10-29
  • Unity中 ShaderGraph 实现旋涡传送门效果入门级教程(推荐)

    通过Twirl 旋转节点对Gradient Noise 梯度噪声节点进行操作,就可得到一个旋转的旋涡效果。具体实现代码跟随小编一起通过本文学习下吧...2021-07-11
  • Unity延时执行的多种方法小结

    本文主要介绍了4种延时执行的方法,主要包括Update计时器,Invoke,协程,DoTween,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-07-07
  • Unity shader实现遮罩效果

    这篇文章主要为大家详细介绍了Unity shader实现遮罩效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • unity 如何判断鼠标是否在哪个UI上(两种方法)

    这篇文章主要介绍了unity 判断鼠标是否在哪个UI上的两种实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-10
  • Unity实现换装系统

    这篇文章主要为大家详细介绍了Unity实现换装系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-04-11
  • 利用unity代码C#封装为dll的步骤分享

    这篇文章主要给大家介绍了关于利用unity代码C#封装为dll的相关资料,文中通过图文将实现的方法介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
  • unity 实现摄像机绕某点旋转一周

    这篇文章主要介绍了unity 实现摄像机绕某点旋转一周,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-12
  • Vue+node实现音频录制播放功能

    这篇文章主要介绍了Vue+node实现音频录制播放,功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-25
  • Unity Shader实现径向模糊效果

    这篇文章主要为大家详细介绍了Unity Shader实现径向模糊效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-08-09
  • Unity实现截图功能

    这篇文章主要为大家详细介绍了Unity实现截图功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • TensorFlow2.0:张量的合并与分割实例

    今天小编就为大家分享一篇TensorFlow2.0:张量的合并与分割实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-22
  • Oracle 两个逗号分割的字符串,获取交集、差集(sql实现过程解析)

    这篇文章主要介绍了Oracle 两个逗号分割的字符串,获取交集、差集的sql实现过程解析,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下...2020-07-11
  • Unity Shader实现2D水流效果

    这篇文章主要为大家详细介绍了Unity Shader实现2D水流效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • Unity 按钮添加OnClick事件操作

    这篇文章主要介绍了Unity 按钮添加OnClick事件操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-10
  • Unity使用EzySlice实现模型多边形顺序切割

    这篇文章主要为大家详细介绍了Unity使用EzySlice实现模型多边形顺序切割,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-11-03