最近在做一个项目,通过socket通信,给业务端提供接口调用unity这边的状态机,就遇到了几个奇葩的场景。
1.用户快速点击音乐播放和暂停按钮,音乐播放,模型也会跟着舞动,停下,模型恢复默认态,然后发现快速点击后会出现音乐播放,但是模型是默认态,查log发现发送顺序是对的,不过在同一帧或者很短的时间内收到了两次,播放->暂停->播放,然后日志也确实证明了我最后执行的是对的状态,但是状态机表现不对,采用的settriger实现跳转。
解决思路经历:
1.开始是发现一帧收到了两条,在同一帧给不同的trigger都设置了true,那么我的思路之一就是由接口直接驱动状态变更修改为了接口记录一个状态,每帧去设置这个状态,这样实现了一次过滤,每帧播放的是最新的且只有一次。
2.为什么有2,因为失败了,很显然,短时间内播放都会出现这个问题,跟状态机有关吧,后来查了个api,resettrigger,每次播放前再reset一下上一次trigger,完美解决(1的步骤还是需要的)。
回顾:由于animator代码封装了,实现不得而知,但是查了资料发现和所谓的trigger的优先级相关(我需要的是打断)所以,下次这种场景用的trigger记得reset一下吧。
第二个问题,类似的,播放音乐跳舞还会有音符特效,但是同一个场景出现了播放音乐但是音符只播了一个消失的动画,然后不见了,很奇怪,和上面的问题有点关系,但不多,因为特效是播了的,但是播的不是开始播放,而是播了退出动画。
解决:又是一番查找,采用了上面的resettrigger没好,因为不是没播放,而是播了退出?有一种说法是settrigger多个状态时,下一帧会遍历所有的trigger,根据优先级和当前状态是否可以跳转,然后直到把trigger执行完,可能会存在冲突导致执行未知,其次还可能相关的就是我的特效prefab只有一份,所以在消失动画播完前是无法再次播放的(这个勾选can transition to self解决了)。
总的来说trigger尽量不要短时间内触发多次。