我正在使用iOS 11(适用于ARKit),虽然许多人指向Apple的SceneKit示例应用程序与Fox,我在该示例项目(
file)中使用的扩展程序有问题,以添加动画:
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中吗?
该文档并未真正显示有关其被弃用的原因或从何处开始的详细信息.
谢谢
解决方法
TL; DR:Apple的
sample game(搜索SCNAnimationPlayer)中可以找到如何使用新API的示例
尽管在iOS11中已经弃用了动画(forKey :)及其使用CAAnimation的姐妹方法,但您可以继续使用它们 – 一切都会起作用.
但是如果你想使用新的API并且不关心向后兼容性(无论如何你都不需要ARKit,因为它仅在iOS11之后可用),请继续阅读.
与之前的产品相比,新推出的SCNAnimationPlayer提供了更方便的API.现在可以更轻松地实时处理动画.
来自WWDC2017的This video将是了解它的一个很好的起点.
作为快速摘要:SCNAnimationPlayer允许您动态更改动画的速度.与添加和删除CAAnimations相比,它使用play()和stop()等方法为动画播放提供了更直观的界面.
您还可以将两个动画混合在一起,例如,可以使用它们在它们之间进行平滑过渡.
您可以在Fox 2 game by Apple中找到如何使用所有这些的示例.
这是您发布的适用于使用SCNAnimationPlayer的扩展(您可以在Fox 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 } }
您可以按如下方式使用它:
>加载动画并将其添加到相应的节点
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")
>使用它!
model.animationPlayer(forKey: "jump")?.play()