SpriteKit 如何动态调整运行中SKAction动画的播放速度
SpriteKit 运行中SKAction参数修改问题解答
核心疑问解答
- 已经启动运行的SKAction参数确实无法直接修改,你对自己持有的SKAction实例的属性修改,不会作用到节点上正在运行的动作实例。
- SKAction的设计确实是「配置一次,多次运行,运行后参数不可修改」的「发射即忘记」逻辑:当你调用节点的
run(_:)方法时,SpriteKit会自动复制一份你传入的SKAction实例用于实际执行,你持有的原始实例和节点上正在运行的实例是完全独立的两个对象,对原始实例的任何修改都不会影响正在运行的副本。
另外你代码中修改playerAnimation的duration本身也不会生效:你把动画用repeatForever包装后,外层repeatForever类型动作的duration是.infinity(无穷大),修改这个属性没有任何实际意义。
可行实现方案
方案1:通过动作key调整运行中动画的速度(无需重建动作)
如果只是要调整播放速度,不需要修改单轮动画的原始时长,你可以给运行的动画添加唯一标识key,直接调整对应动作的运行速度即可,无需移除重建:
class GameScene: SKScene { var thePlayer: SKSpriteNode = SKSpriteNode() // 固定动作的唯一key,避免硬写错 private let playerWalkActionKey = "playerWalkAnimation" func setInitialAnimation() { let walkAnimation = SKAction.repeatForever(SKAction(named: "PlayerWalk", duration: 1)!) // 运行时指定唯一key self.thePlayer.run(walkAnimation, withKey: playerWalkActionKey) } /// 调整动画播放速度 /// - Parameter speed: 速度系数,大于1为加速,小于1为减速 func changeAnimationSpeed(to speed: CGFloat) { // 直接修改指定key的运行中动作的速度 thePlayer.setSpeed(speed, forKey: playerWalkActionKey) } }
方案2:精确调整单轮动画时长
如果你需要修改的是单轮纹理动画的原始时长,那你目前使用的「先移除旧动作,再创建运行新动作」的方案就是官方支持的标准实现方式。
内容的提问来源于stack exchange,提问作者MassMover
相关产品推荐
相关产品推荐

