CocosCreator3.8.3序列帧动画需求

我有个序列帧动画需求,从当前的Animation接口来看好像实现不了,也可能是我还不知道怎么用,需求具体如下:
在循环播放一个序列帧动画的时候,由于业务的特殊性,随时可能需要调整这个动画的尺寸。
我这边通过了3种测试方法验证:
方法1:如果动画正在播放,通过node.getComponent(UITransform)!.setContentSize(new Size(xx, xx))调整了动画节点的尺寸后,发现这个尺寸只作用了这个循环播放的动画的部分序列帧,有些序列帧还是原来的尺寸在播放。
方法2:如果在执行node.getComponent(UITransform)!.setContentSize(new Size(xx, xx))前,先调用node.getComponent(Animation)!.stop(), 在改完动画节点尺寸后再调用node.getComponent(Animation)!.play()或者node.getComponent(Animation)!.resume()方法的话,这次尺寸修改才能作用到所有动画帧,但这样的话,我的动画播放只能重新从第一帧开始播,显然这样是违背我的需求。
方法3:我也尝试了在执行node.getComponent(UITransform)!.setContentSize(new Size(xx, xx))前,先调用node.getComponent(Animation)!.pause(), 在改完动画节点尺寸后再调用node.getComponent(Animation)!.resume()方法, 但这样做的结果和上面“方法1”的结果一样,这个尺寸修改只作用了这个循环播放的动画的部分序列帧,有些序列帧还是原来的尺寸在播放。
官方是否有方法可满足我的需求?如果没有,能否加一个API,如果我在序列帧动画播放的过程中修改了动画节点的尺寸,我通过调用Animation组件的一个类似“refresh”的方法就能直接把尺寸也同步到所有的序列帧上面?

有个疑问:为啥不在序列帧里做呢?如果尺寸不不是同比的,你改尺寸不会变形吗?如果是等比的,为嘛不用缩放属性呢?如果特殊条件需要在代码里修改,插入帧事件不香吗?

改尺寸不会变形吗?为啥不用缩放属性?
答:我这个动画的Sprite的type是“Sprite.Type.SLICED”切片类型的,需要部分区域在节点拉伸的时候不改变指定区域的大小。
如果特殊条件需要在代码里修改,插入帧事件不香吗?
答:我这个“业务特殊性”可能不是你理解的“特殊条件”,我这样举一个例子吧,比如有个英雄会使用“激光”技能攻击怪物,英雄和怪物都会动态移动,而这个“激光”技能动画就是需要在技能没有结束、或者英雄和怪物之间某一方没有死亡的情况下,一直播放(就是激光的一头连着英雄,另一头连着怪物),但在这个过程中,怪物或者英雄位置移动后,这条激光动画的长度就需要根据他们之间的距离进行动态调整。

没测试你说的那些方案。给条建议就是如果官方的不能实现就自己实现一个,帧动画播放无非就是图片切换,写个简单的满足要求的动画组件也就是分分钟的事,没必要死磕自带的组件。

如果官方当前确实没有解决方案,那只能先自己实现了。
希望官方能看到这个帖子,在后续版本能提供这方面的便利方案。

直接判断距离和Sprite的尺寸比例去做缩放不行吗,如果觉得缩放(技能动画)会变粗啥的,在外面包一层Mask去setMaskContentSize呢?

屏幕录制2024-06-27 上午10.48.17_1

如果激光动画首尾两端都不能进行缩放,只有中间部位可以拉伸尺寸(例如激光的样子是这样的“±---------+”,首端和尾端有些气波效果),那么通过Mask的方式也无法在不拆分首或者尾端和中间部分的情况下实现,如果把原本一个动画拆分多段进行组合拼装,我认为这种异构会导致其他内容(配置以及美术)也需要调整。当前Animation组件没有方便的接口刷新尺寸变更的情况下,我还是更倾向于自己简单实现一个序列帧动画组件(“定时器+按序切换Sprite的SpriteFrame”)替换官方的Animation组件对序列帧动画的使用,这样对结构的调整是最小的。
最后还是感谢你对本帖的关注,你的方法也很赞。 :+1:

这并不是一个帧动画, 这是多个帧动画 拼接而成。

我的需求是一个帧动画完成

既然是帧动画那么自己一张一张图片切换也没有问题吧 这样改起来就很方便了

是的,在官方的Animation组件没有合适的接口满足我上面提到的需求之前,只能这样自己封装一个组件

今天自定义封装了下序列帧动画组件,发现在修改动画节点的contentSize后,定时器切换Sprite的SpriteFrame依然存在部分序列帧尺寸在显示的时候没有改变为动画节点的contentSize尺寸,后面发现Sprite类对象有一个“sizeMode”属性,我尝试把“sizeMode”设置为“Sprite.SizeMode.CUSTOM”后,定时器切换Sprite的SpriteFrame的尺寸才能和动画节点的contentSize尺寸保持一致。
后面,我想了下,可能我没必要自行封装序列帧动画组件,只需要在动画节点上绑定的“Sprite”组件的“sizeMode”设置为“Sprite.SizeMode.CUSTOM”,然后直接使用官方的Animation组件可能也能达到目的,于是我验证了下自己想法,最终结果确实是这样的。
有遇到同样需求且不清楚解法的可以通过这种方法解决。

默认不就是CUSTOM么,你改过参数啊,破案了。 :joy:
image