You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SpriteKit 如何动态调整运行中SKAction动画的播放速度

SpriteKit 运行中SKAction参数修改问题解答

核心疑问解答

  1. 已经启动运行的SKAction参数确实无法直接修改,你对自己持有的SKAction实例的属性修改,不会作用到节点上正在运行的动作实例。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 19:48:00