首先我应该确认CoreAnimation
框架及其一些方法,例如animation(forKey:)
实例方法在 iOS 和 macOS 中实际上已被弃用。但有些部分CoreAnimation
框架现已实施到SceneKit
和其他模块。在 iOS 11+ 和 macOS 10.13+ 中,您可以使用SCNAnimation
class:
let animation = CAAnimation(scnAnimation: SCNAnimation)
和这里SCNAnimation
类有三个有用的初始化器:
SCNAnimation(caAnimation: CAAnimation)
SCNAnimation(contentsOf: URL)
SCNAnimation(named: String)
另外我应该补充一点,你不仅可以使用烘焙的动画.dae
文件格式,而且还可以是.abc
, .scn
and .usdz
.
另外,您可以使用SCN场景源 https://developer.apple.com/documentation/scenekit/scnscenesource类(iOS 8+ 和 macOS 10.8+)来检查 a 的内容SCNScene
文件或有选择地提取场景的某些元素,而不保留整个场景及其包含的所有资源.
这是代码的实现方式SCNSceneSource
可能看起来像:
@IBOutlet var sceneView: ARSCNView!
var animations = [String: CAAnimation]()
var idle: Bool = true
override func viewDidLoad() {
super.viewDidLoad()
sceneView.delegate = self
let scene = SCNScene()
sceneView.scene = scene
loadMultipleAnimations()
}
func loadMultipleAnimations() {
let idleScene = SCNScene(named: "art.scnassets/model.dae")!
let node = SCNNode()
for child in idleScene.rootNode.childNodes {
node.addChildNode(child)
}
node.position = SCNVector3(0, 0, -5)
node.scale = SCNVector3(0.45, 0.45, 0.45)
sceneView.scene.rootNode.addChildNode(node)
loadAnimation(withKey: "walking",
sceneName: "art.scnassets/walk_straight",
animationIdentifier: "walk_version02")
}
...
func loadAnimation(withKey: String, sceneName: String, animationIdentifier: String) {
let sceneURL = Bundle.main.url(forResource: sceneName, withExtension: "dae")
let sceneSource = SCNSceneSource(url: sceneURL!, options: nil)
if let animationObj = sceneSource?.entryWithIdentifier(animationIdentifier,
withClass: CAAnimation.self) {
animationObj.repeatCount = 1
animationObj.fadeInDuration = CGFloat(1)
animationObj.fadeOutDuration = CGFloat(0.5)
animations[withKey] = animationObj
}
}
...
func playAnimation(key: String) {
sceneView.scene.rootNode.addAnimation(animations[key]!, forKey: key)
}