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

用作SCNNode材质的SKScene内SKShapeNode旋转动画不生效问题

问题排查与解决方案

以下是可直接验证的排查点和修复方案:

  • SKScene被自动暂停:当SKScene作为SCNMaterial的contents使用时,SceneKit会默认暂停SKScene的渲染循环,导致SKAction不会执行。你需要在两个节点主动设置isPaused = false:
    1. 在loadSKscene方法加载完场景后,添加scene.isPaused = false
    2. 把apu_display赋值给SCNMaterial的contents属性后,再次手动设置apu_display?.isPaused = false
  • 旋转锚点位置错误:你当前创建的SKShapeNode默认锚点为(0,0),会绕节点自身左下角旋转,很可能旋转后超出场景可视范围,导致看起来没有动画。建议修改线的生成逻辑,把旋转中心设置为EGT_POINT的位置:
    修改makeLineEGT方法如下:
    func makeLineEGT(){
        guard let apu_display = apu_display else {
            return
        }
        guard let centerEGT = apu_display.childNode(withName: "EGT_POINT") else  {return}
        guard let zeroEGT = apu_display.childNode(withName: "EGT_POINT_ZERO") else  {return}
        // 计算终点相对于中心点的偏移
        let offset = CGPoint(
            x: zeroEGT.position.x - centerEGT.position.x,
            y: zeroEGT.position.y - centerEGT.position.y
        )
        let line = makeLine(startPos: .zero, endPos: offset, name: "EGT_LINE")
        // 线的位置直接对齐中心点,默认锚点(0,0)就是旋转中心
        line.position = centerEGT.position
        apu_display.addChild(line)
    }
    
  • 动画调用时机错误:如果在ECAM_APU实例初始化完成后立刻调用animate(),此时SKScene还没有被附加到SceneKit的渲染循环中,动作会无法触发。建议在SKScene被赋值给SCNMaterial的contents之后,再调用animate()方法。

如果以上操作后仍有问题,可先添加调试代码验证线是否正常显示:在animate()方法中临时加一行line.strokeColor = .red,看材质上的线会不会变色,排除节点查找失败的问题。

内容的提问来源于stack exchange,提问作者Damiano Miazzi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 08:06:05