2017-09-01 96 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的相同動畫效果很好。任何我可以測試的東西? –

相關問題