2017-09-01 28 views
6

我与iOS 11(为ARKit)和工作,而许多人指出,为SceneKit苹果与狐狸一个示例应用程序,我有它在样本项目(file)添加动画使用扩展问题:替代动画(forKey :)(现在不推荐)?

extension CAAnimation { 
    class func animationWithSceneNamed(_ name: String) -> CAAnimation? { 
     var animation: CAAnimation? 
     if let scene = SCNScene(named: name) { 
      scene.rootNode.enumerateChildNodes({ (child, stop) in 
       if child.animationKeys.count > 0 { 
        animation = child.animation(forKey: child.animationKeys.first!) 
        stop.initialize(to: true) 
       } 
      }) 
     } 
     return animation 
    } 
} 

看来这个扩展非常方便,但我不确定如何迁移它,现在它已被弃用?现在是否默认内置到SceneKit

该文档没有真正显示为什么它被弃用或从这里去哪里的很多信息。

感谢

回答

6

TL; DR:如何使用新的API的例子可以在苹果的sample game(搜索SCNAnimationPlayer


即使animation(forKey:),并与工作的姐妹方法来发现CAAnimation已在iOS11中被弃用,您可以继续使用它们 - 一切都会生效。

但是,如果您想使用新的API并且不关心向后兼容性(无论如何您不需要使用ARKit,因为它仅在iOS11之后可用),请继续阅读。

与其前身相比,新推出的SCNAnimationPlayer提供了更方便的API。现在更容易实时处理动画。 This videoWWDC2017将是一个很好的起点来了解它。

快速总结:SCNAnimationPlayer允许您即时更改动画的速度。与添加和删除CAAnimation相比,它使用诸如play()stop()等方法为动画播放提供更直观的界面。 您还可以将两个动画混合在一起,例如,可以用它们在它们之间进行平滑过渡。

你可以在Fox 2 game by Apple找到如何使用所有这些的例子。


这里是您发布扩展适用于使用SCNAnimationPlayer(你可以在福克斯2示例项目Character类查找):

extension SCNAnimationPlayer { 
    class func loadAnimation(fromSceneNamed sceneName: String) -> SCNAnimationPlayer { 
     let scene = SCNScene(named: sceneName)! 
     // find top level animation 
     var animationPlayer: SCNAnimationPlayer! = nil 
     scene.rootNode.enumerateChildNodes { (child, stop) in 
      if !child.animationKeys.isEmpty { 
       animationPlayer = child.animationPlayer(forKey: child.animationKeys[0]) 
       stop.pointee = true 
      } 
     } 
     return animationPlayer 
    } 
} 

您可以使用它,如下所示:

  1. 加载动画并将其添加到相应的节点

    let jumpAnimation = SCNAnimationPlayer.loadAnimation(fromSceneNamed: "jump.scn") 
    jumpAnimation.stop() // stop it for now so that we can use it later when it's appropriate 
    model.addAnimationPlayer(jumpAnimation, forKey: "jump") 
    
  2. 使用它!

    model.animationPlayer(forKey: "jump")?.play() 
    
+0

尼斯,感谢将检查这些资源了:)。 –

+1

非常感谢。我已经遵循了你的链接,完成了它,用SCNAnimationPlayer替换了我的CAAnimation代码,但是我无法让它在我的生活中发挥作用。网格跳转到动画的第一帧,所以我知道它正在加载它。我可以记录动画并查看正确数量的帧,但play()什么也不做。 使用CAAnimation的相同动画效果很好。任何我可以测试的东西? –

相关问题