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 值作为动画暂停条件(写条件的时候可以设个范围)。

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

相关文章

  • 基于Unity Line Renderer组件的常用属性说明

    基于Unity Line Renderer组件的常用属性说明

    这篇文章主要介绍了基于Unity Line Renderer组件的常用属性说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • C#如何通过QQ邮件发送验证码到指定邮箱

    C#如何通过QQ邮件发送验证码到指定邮箱

    在程序设计中发送验证码是常见的一个功能,用户在注册账号时或忘记密码后通常需要发送验证码到手机短信或邮箱来验证身份,这篇文章主要给大家介绍了关于C#如何通过QQ邮件发送验证码到指定邮箱的相关资料,需要的朋友可以参考下
    2024-01-01
  • C#利用com操作excel释放进程的解决方法

    C#利用com操作excel释放进程的解决方法

    最近利用Microsoft.Office.Interop.Excel.Application读取一个excel后,进程中一直存在excel,在网上找了一阵子,其中有几个解决方案
    2013-03-03
  • C#无边框窗体实现以及拖动代码

    C#无边框窗体实现以及拖动代码

    我们给大家分享了关于C#无边框窗体实现以及拖动代码,大家在程序设计的时候如果用的到一起跟着小编学习下吧。
    2018-03-03
  • C# 匿名方法基础回顾

    C# 匿名方法基础回顾

    本篇文章主要介绍了C#的匿名方法的参数使用范围以及委托示例。具有一定的参考价值,下面跟着小编一起来看下吧
    2017-01-01
  • 浅谈Unity中的Shader

    浅谈Unity中的Shader

    Shader,中文名为着色器,对很多开发者来说它是一个神秘的存在。Shader其实就是专门用来渲染图形的一种技术,通过shader,我们可以自定义显卡渲染画面的算法,使画面达到我们想要的效果
    2021-06-06
  • C#视频转换类分享

    C#视频转换类分享

    这篇文章主要为大家分享了C#视频转换类,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • Unity技术手册之Toggle切换使用实例

    Unity技术手册之Toggle切换使用实例

    这篇文章主要为大家介绍了Unity技术手册之Toggle切换使用实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • 关于C#结构体 你需要知道的

    关于C#结构体 你需要知道的

    这篇文章主要介绍了关于C#结构体的相关知识,以及使用方法,文中代码非常详细,帮助大家更好的参考和学习,感兴趣的朋友可以了解下
    2020-06-06
  • 使用Unity3D实现选中物体消融特效的方法详解

    使用Unity3D实现选中物体消融特效的方法详解

    消融特效中基Shader Graph实现了消融特效,本文将基于 Shader 实现消融特效,当前实现消融特效的方法主要有 Alpha 测试消融、clip(或 discard)消融,它们的本质都是随机丢弃一些片元,以实现消融效果,文中有详细代码示例,需要的朋友可以参考下
    2023-10-10

最新评论