在Swift游乐场中将委托设置为SCNView时,未调用我的渲染器功能。
我已经看过这个问题:SceneKit SCNSceneRendererDelegate - renderer function not called
该页面上的所有解决方案似乎都无法解决我的问题。我已经尝试添加无意义的动画,启用isLooping
,启用isPlaying
,并确保渲染函数语法正确。
我对丢失的内容完全迷失了,因为看似相同的代码被用作PlaygroundBook的一部分并且可以工作。提前谢谢。
import UIKit
import SceneKit
import PlaygroundSupport
import Foundation
class TestingRenderer: NSObject, SCNSceneRendererDelegate
{
var tornadoCenter: SCNNode!
let gameScene = SCNScene()
var cameraNode: SCNNode!
public func awakening()
{
cameraNode = SCNNode()
cameraNode.camera = SCNCamera()
// place the camera
cameraNode.position = SCNVector3(x: 0, y: 0, z: 0)
cameraNode.camera?.zFar = 200
gameScene.rootNode.addChildNode(cameraNode)
tornadoCenter = SCNNode()
tornadoCenter.position = SCNVector3(x: 0, y: 0, z: 0)
gameScene.rootNode.addChildNode(tornadoCenter)
// meaningless animation
let animation = CABasicAnimation(keyPath: "rotation")
animation.toValue = NSValue(scnVector4: SCNVector4(x: Float(0), y: Float(1), z: Float(0), w: Float.pi * 2))
animation.duration = 30000
animation.repeatCount = MAXFLOAT //repeat forever
tornadoCenter.addAnimation(animation, forKey: nil)
}
func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval)
{
print("eeee")
}
func getScene() -> SCNScene
{
return gameScene
}
}
class TestingView: SCNView
{
public func setup()
{
let renderer = TestingRenderer()
renderer.awakening()
self.scene = renderer.getScene()
self.backgroundColor = UIColor.black
self.autoenablesDefaultLighting = true
self.allowsCameraControl = true
self.delegate = renderer
}
}
class MyViewController : UIViewController
{
var sceneView: TestingView!
override func loadView()
{
let view = UIView()
sceneView = TestingView()
sceneView.setup()
view.addSubview(sceneView)
self.view = view
}
override func viewDidLayoutSubviews()
{
sceneView.frame = self.view.frame
}
}
PlaygroundPage.current.liveView = MyViewController()
您需要保留对渲染器的引用,在设置函数返回后,该渲染器将立即被释放。
例如
@objc func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval)
{
print("eeee")
}