Unity 如何设定 Animator分割播放
程序员文章站
2022-03-18 17:38:43
项目有个需求,一整段非常长的animator 动画, 分割成一份份的播放,我们点击相应的按钮就播放某个时间点的动画,废话不多说新建一个空物体加上toggle group,下面是一堆的toggle并在g...
项目有个需求,一整段非常长的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 值作为动画暂停条件(写条件的时候可以设个范围)。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。