首页 > 解决方案 > SCNSceneRendererDelegate - 未调用渲染器

问题描述

在 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()

标签: swiftxcodescenekit

解决方案


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

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

@objc func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval)
{
    print("eeee")
}

推荐阅读