2017-09-01 2 views
6

Je travaille avec iOS 11 (pour ARKit) et alors que beaucoup le point à un exemple d'application pour SceneKit d'Apple avec un renard, je vais avoir un problème de l'extension, il utilise dans ce projet d'échantillonnage (file) pour ajouter des animations:Alternative à l'animation (forKey :) (maintenant obsolète)?

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 
    } 
} 

Il semble que cette extension est très pratique, mais je ne suis pas sûr de savoir comment la migrer maintenant qu'elle est obsolète? Est-il intégré dans SceneKit par défaut maintenant?

La documentation n'a pas vraiment montré beaucoup d'informations sur pourquoi il était obsolète ou où aller à partir d'ici.

Merci

Répondre

6

TL; DR: exemples de la façon d'utiliser les nouvelles API peuvent être trouvées dans sample game (la recherche de SCNAnimationPlayer) d'Apple


Même si animation(forKey:) et ses méthodes sœurs qui travaillent avec CAAnimation ont été abandonnés dans iOS11, vous pouvez continuer à les utiliser - tout va fonctionner. Mais si vous voulez utiliser de nouvelles API et ne vous souciez pas de la rétrocompatibilité (ce qui n'est pas nécessaire dans le cas de ARKit, car il n'est disponible que depuis iOS11), lisez la suite.

La nouvelle version SCNAnimationPlayer fournit une API plus pratique que ses prédécesseurs. Il est maintenant plus facile de travailler avec des animations en temps réel. This video de WWDC2017 serait un bon point de départ pour en apprendre davantage.

En bref: SCNAnimationPlayer vous permet de modifier la vitesse de l'animation à la volée. Il fournit une interface plus intuitive pour la lecture d'animation en utilisant des méthodes telles que play() et stop() par rapport à l'ajout et la suppression de CAAnimation s. Vous pouvez également mélanger deux animations, ce qui vous permet, par exemple, d'effectuer des transitions douces entre elles.

Vous trouverez des exemples d'utilisation de tout ceci dans le Fox 2 game by Apple.


Voici l'extension que vous avez posté adapté pour utiliser SCNAnimationPlayer (que vous pouvez trouver dans la classe Character dans la Fox 2 exemple de projet):

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 
    } 
} 

Vous pouvez l'utiliser comme suit:

  1. charge l'animation et l'ajouter au noeud correspondant

    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. Utilisez-le!

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

Nice, grâce vérifieront ces ressources hors :). –

+1

Un grand merci pour cela.J'ai suivi votre lien et fait exactement cela, en remplaçant mon code CAAnimation par SCNAnimationPlayer mais je n'arrive pas à le jouer pour la vie de moi. Le maillage saute à la première image de l'animation, donc je sais que c'est le chargement. Je peux enregistrer l'animation et voir le bon nombre d'images, mais play() ne fait rien. La même animation utilisant CAAnimation fonctionne correctement. Quelque chose que je peux tester? –