Unity 如何设定 Animator分割播放

 更新时间:2021年04月10日 15:33:22   作者:玉速林疯  
这篇文章主要介绍了Unity 设定 Animator分割播放的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

项目有个需求,一整段非常长的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 值作为动画暂停条件(写条件的时候可以设个范围)。

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

相关文章

  • 解析C#中断言与异常的应用方式及异常处理的流程控制

    解析C#中断言与异常的应用方式及异常处理的流程控制

    这篇文章主要介绍了C#中断言与异常的应用方式及异常处理的流程控制,一般来说断言用于修正程序员自己的错误而异常用于应对程序运行过程中可能出现的错误,需要的朋友可以参考下
    2016-01-01
  • C#特性(Attribute)

    C#特性(Attribute)

    这篇文章介绍了C#的特性(Attribute),文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • Unity多屏幕设置的具体方案

    Unity多屏幕设置的具体方案

    多屏幕指的是一个电脑主机,连接多个显示器,本文主要介绍了Unity多屏幕设置的具体方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • C#中txt数据写入的几种常见方法

    C#中txt数据写入的几种常见方法

    这篇文章主要给大家介绍了关于C#中txt数据写入的几种常见方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • C# TreeView从数据库绑定数据的示例

    C# TreeView从数据库绑定数据的示例

    这篇文章主要介绍了C# TreeView从数据库绑定数据的示例,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下
    2021-03-03
  • C#读取计算机CPU及HDD信息的方法

    C#读取计算机CPU及HDD信息的方法

    这篇文章主要介绍了C#读取计算机CPU及HDD信息的方法,涉及C#读取计算机CPU及硬盘信息的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • C#通过html调用WinForm的方法

    C#通过html调用WinForm的方法

    这篇文章主要介绍了C#通过html调用WinForm的方法,涉及html页面中使用JavaScript访问C#的相关技巧,需要的朋友可以参考下
    2016-04-04
  • C#利用File方法对文件的操作总结(字节写入和读取)

    C#利用File方法对文件的操作总结(字节写入和读取)

    使用C#语言中的File类我们能够非常轻松的使用一些文件操作的函数来完成对文件简单的读写操作,这篇文章主要给大家介绍了光宇C#利用File方法对文件的操作的相关资料,包括字节写入和读取,需要的朋友可以参考下
    2021-08-08
  • 12306奇葩验证码引发思考之C#实现验证码程序

    12306奇葩验证码引发思考之C#实现验证码程序

    春运最高峰来了!明天通过网络将能买到小年夜的车票,本周四就将开售除夕日车票,但不少人被首次在春运期间使用的图片验证码搞得很火大,小编也正在对验证码进行研究,编写了由C#实现验证码程序,分享给大家
    2015-12-12
  • C#栈和堆的区别浅谈

    C#栈和堆的区别浅谈

    理解堆与栈对于理解.NET中的内存管理、垃圾回收、错误和异常、调试与日志有很大的帮助
    2013-02-02

最新评论