2017-09-01 28 views
6

私は(ARKit用)のiOS 11として働いていますフォックスとアップルから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を使用する方法の例は、Appleのsample gameSCNAnimationPlayerの検索)


でもanimation(forKey:)かかわらずとして働く姉妹の方法で見つけることができますCAAnimationは、iOS11で廃止されました。引き続き使用できます。すべて動作します。

iOS11以降でのみ利用可能であるため、新しいAPIを使用し、下位互換性については気にしないでください(これは、とにかくARKitの場合は必要ありません)。

新しく導入されたSCNAnimationPlayerは、その前身と比較してより便利なAPIを提供します。アニメーションをリアルタイムで処理する方が簡単になりました。 This videoからWWDC2017を学ぶのは良い出発点です。

簡単な要約として:SCNAnimationPlayerは、アニメーションの速度を即座に変更することができます。 play()stop()などのメソッドを使用して、アニメーション再生のためのより直感的なインターフェイスを提供し、CAAnimationを追加および削除するのに比べてより直感的なインターフェイスを提供します。 2つのアニメーションを一緒にブレンドすることもできます。たとえば、アニメーションをスムーズに切り替えることができます。

Fox 2 game by Appleには、このすべての使用方法の例があります。


ここであなたは(あなたがフォックス2サンプルプロジェクトでCharacterクラスで見つけることができます)SCNAnimationPlayerを使用するようになって投稿した拡張子です:

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. アニメーションをロードし、対応するノード

    に追加
  2. それを使用してください!

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

ニース、おかげで:)それらのリソースをチェックアウトします。 –

+1

これは本当にありがとうございます。私はあなたのリンクに従って、ちょうどそれを行って、私のCAAnimationコードをSCNAnimationPlayerに置き換えましたが、私の生活のために再生することができません。メッシュはアニメーションの最初のフレームにジャンプするので、それがロードされていることがわかります。私はアニメーションを記録し、適切な数のフレームを見ることができますが、play()は何もしません。 CAAnimationを使用した同じアニメーションが正常に動作します。私がテストできるものは何ですか? –

関連する問題