欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Unity 如何设定 Animator分割播放

程序员文章站 2022-03-18 17:38:43
项目有个需求,一整段非常长的animator 动画, 分割成一份份的播放,我们点击相应的按钮就播放某个时间点的动画,废话不多说新建一个空物体加上toggle group,下面是一堆的toggle并在g...

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

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

Unity 如何设定 Animator分割播放

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

Unity 如何设定 Animator分割播放

 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));
        }
    }

Unity 如何设定 Animator分割播放

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

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