SCNSceneRendererDelegate-渲染器未被调用

问题描述 投票:0回答:2

在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()
swift xcode scenekit
2个回答
0
投票

您需要使用@objc attribute使SceneKit可以看到委托方法。

objc属性告诉编译器声明可用在Objective-C代码中使用。

@objc

0
投票

您需要保留对渲染器的引用,在设置函数返回后,该渲染器将立即被释放。

例如

@objc func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval)
{
    print("eeee")
}
© www.soinside.com 2019 - 2024. All rights reserved.