用作SCNNode材质的SKScene内SKShapeNode旋转动画不生效问题
问题排查与解决方案
以下是可直接验证的排查点和修复方案:
- SKScene被自动暂停:当SKScene作为SCNMaterial的contents使用时,SceneKit会默认暂停SKScene的渲染循环,导致SKAction不会执行。你需要在两个节点主动设置
isPaused = false:- 在
loadSKscene方法加载完场景后,添加scene.isPaused = false - 把
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
相关产品推荐
相关产品推荐

