swift - 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()
解决方案
@objc
您需要使用属性使 SceneKit 可以看到委托方法。
objc 属性告诉编译器可以在 Objective-C 代码中使用声明。
@objc func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval)
{
print("eeee")
}
推荐阅读
- django - 如何将引导程序添加到 Django Form,py?
- python-3.x - 如何从电影数据集中提取用户评分
- amazon-kinesis-analytics - 如何对 Kinesis Analytics SQL 应用程序进行故障排除?
- java - 第一个基于文本的 Java 程序
- javascript - 在条件渲染中发出数据绑定 (Vue.js)
- jira - 如何在jira任务中添加与“受让人”相同的字段?
- c++ - C++20 概念:如何在 `requires` 子句中引用类名?
- windows - MongoDb 连接初始化和查询很慢,同时使用 Electron
- java - 如何在 OSX 上启动时运行多个 gradle bootRun?
- vba - 抄送收件人不会更新,无需检查姓名,回复所有