作者:XC一米_623 | 来源:互联网 | 2023-01-20 12:50
我正在使用iOS 11(for ARKit
),虽然许多人指出SceneKit
来自Apple 的示例应用程序与Fox,我在该示例项目(文件)中使用的扩展程序有问题,以添加动画:
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
现在是默认内置的吗?
该文档并未真正显示有关其被弃用的原因或从何处开始的详细信息.
谢谢
1> Lësha Turkow..:
TL; DR:Apple的示例游戏中可以找到如何使用新API的示例(搜索SCNAnimationPlayer
)
即使animation(forKey:)
它的姐妹方法CAAnimation
已被弃用iOS11
,你可以继续使用它们 - 一切都会奏效.
但是如果你想使用新的API并且不关心向后兼容性(ARKit
无论如何你都不需要它,因为它只在以后可用iOS11
),请继续阅读.
SCNAnimationPlayer
与其前身相比,新推出的API提供了更方便的API.现在可以更轻松地实时处理动画.
这部影片从WWDC2017
将是一个很好的起点,以了解它.
快速摘要:SCNAnimationPlayer
允许您动态更改动画的速度.它使用诸如提供了更直观的接口,用于动画的播放play()
和stop()
相比添加和删除CAAnimation
秒.您还可以将两个动画混合在一起,例如,可以使用它们在它们之间进行平滑过渡.
您可以在Apple的Fox 2游戏中找到如何使用所有这些的示例.
这是您发布的适合使用的扩展SCNAnimationPlayer
(您可以Character
在Fox 2示例项目的课程中找到):
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()