SceneKit 渲染器功能不工作 Swift?
SceneKit Renderer Function Not Working Swift?
我目前正在使用 Swift 3 和 SceneKit。我的问题似乎是我的渲染器功能无法正常工作。我不知道我做错了什么。该程序运行但 none 中的代码:func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval)
似乎在执行。
这是渲染器函数的代码。
import UIKit
import QuartzCore
import SceneKit
class GameViewController: UIViewController, SCNSceneRendererDelegate
{
let scene = SCNScene()
let cameraNode = SCNNode()
var person = SCNNode()
let firstBox = SCNNode()
var goingLeft = Bool()
var tempBox = SCNNode()
var prevBoxNumber = Int()
var boxNumber = Int()
override func viewDidLoad() {
self.createScene()
}
func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {
let deleteBox = self.scene.rootNode.childNode(withName: "\(prevBoxNumber)", recursively: true)
if (deleteBox?.position.x)! > person.position.x + 1 || (deleteBox?.position.z)! > person.position.z + 1{
prevBoxNumber += 1
deleteBox?.removeFromParentNode()
createBox()
}
}
这是我的 creatBox() 函数:
func createBox(){
tempBox = SCNNode(geometry: firstBox.geometry)
let previousBox = scene.rootNode.childNode(withName: "\(boxNumber)", recursively: true)
boxNumber += 1
tempBox.name = "\(boxNumber)"
let randomNumber = arc4random() % 2
switch randomNumber {
case 0:
tempBox.position = SCNVector3Make((previousBox?.position.x)! - firstBox.scale.x, (previousBox?.position.y)! , (previousBox?.position.z)!)
break
case 1:
tempBox.position = SCNVector3Make((previousBox?.position.x)! , (previousBox?.position.y)! , (previousBox?.position.z)! - firstBox.scale.z)
break
default:
break
}
self.scene.rootNode.addChildNode(tempBox)
}
这是我的 createScene()
self.view.backgroundColor = UIColor.white
let sceneView = self.view as! SCNView
boxNumber = 0
prevBoxNumber = 0
sceneView.delegate? = self
sceneView.scene = scene
//Create Box
let firstBoxGeo = SCNBox(width: 1, height: 1.5, length: 1, chamferRadius: 0)
firstBox.geometry = firstBoxGeo
let boxMaterial = SCNMaterial()
boxMaterial.diffuse.contents = UIColor(red: 0.2, green: 0.8, blue: 0.9, alpha: 1.0)
firstBoxGeo.materials = [boxMaterial]
firstBox.position = SCNVector3Make(0, 0, 0)
scene.rootNode.addChildNode(firstBox)
firstBox.name = "\(boxNumber)"
for _ in 0...6 {
createBox()
}
如果我遗漏了什么或做错了什么,请告诉我。谢谢!
我没有看到你的 createScene()
方法所以我在这里猜测 :)
您是否已将 GameViewController
作为委托添加到您的 SCNView
实例?
当你创建你的 SCNView
时,可能是这样的:
let scnView = self.view as! SCNView
您需要将自己添加为委托人,如下所示:
scnView.delegate = self
然后你应该看到你的
func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval)
正在执行中。
编辑(在看到您的 createScene()
代码之后)
尝试更改:
sceneView.delegate? = self
至
sceneView.delegate = self
(省略?
)
如果这样做,我可以看到您的 renderer
委托方法至少被调用了两次。要使其继续被调用,您可以添加:
sceneView.isPlaying = true
在你的 createScene()
方法中的某处,如果这是你的目标。
希望对你有所帮助。
哦哦哦!!!!我觉得自己像个白痴。我有我的 sceneView.delegate = self
作为可选的 AKA:sceneView.delegate? = self
删除问号后一切正常。感谢您的帮助!
我目前正在使用 Swift 3 和 SceneKit。我的问题似乎是我的渲染器功能无法正常工作。我不知道我做错了什么。该程序运行但 none 中的代码:func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval)
似乎在执行。
这是渲染器函数的代码。
import UIKit
import QuartzCore
import SceneKit
class GameViewController: UIViewController, SCNSceneRendererDelegate
{
let scene = SCNScene()
let cameraNode = SCNNode()
var person = SCNNode()
let firstBox = SCNNode()
var goingLeft = Bool()
var tempBox = SCNNode()
var prevBoxNumber = Int()
var boxNumber = Int()
override func viewDidLoad() {
self.createScene()
}
func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {
let deleteBox = self.scene.rootNode.childNode(withName: "\(prevBoxNumber)", recursively: true)
if (deleteBox?.position.x)! > person.position.x + 1 || (deleteBox?.position.z)! > person.position.z + 1{
prevBoxNumber += 1
deleteBox?.removeFromParentNode()
createBox()
}
}
这是我的 creatBox() 函数:
func createBox(){
tempBox = SCNNode(geometry: firstBox.geometry)
let previousBox = scene.rootNode.childNode(withName: "\(boxNumber)", recursively: true)
boxNumber += 1
tempBox.name = "\(boxNumber)"
let randomNumber = arc4random() % 2
switch randomNumber {
case 0:
tempBox.position = SCNVector3Make((previousBox?.position.x)! - firstBox.scale.x, (previousBox?.position.y)! , (previousBox?.position.z)!)
break
case 1:
tempBox.position = SCNVector3Make((previousBox?.position.x)! , (previousBox?.position.y)! , (previousBox?.position.z)! - firstBox.scale.z)
break
default:
break
}
self.scene.rootNode.addChildNode(tempBox)
}
这是我的 createScene()
self.view.backgroundColor = UIColor.white
let sceneView = self.view as! SCNView
boxNumber = 0
prevBoxNumber = 0
sceneView.delegate? = self
sceneView.scene = scene
//Create Box
let firstBoxGeo = SCNBox(width: 1, height: 1.5, length: 1, chamferRadius: 0)
firstBox.geometry = firstBoxGeo
let boxMaterial = SCNMaterial()
boxMaterial.diffuse.contents = UIColor(red: 0.2, green: 0.8, blue: 0.9, alpha: 1.0)
firstBoxGeo.materials = [boxMaterial]
firstBox.position = SCNVector3Make(0, 0, 0)
scene.rootNode.addChildNode(firstBox)
firstBox.name = "\(boxNumber)"
for _ in 0...6 {
createBox()
}
如果我遗漏了什么或做错了什么,请告诉我。谢谢!
我没有看到你的 createScene()
方法所以我在这里猜测 :)
您是否已将 GameViewController
作为委托添加到您的 SCNView
实例?
当你创建你的 SCNView
时,可能是这样的:
let scnView = self.view as! SCNView
您需要将自己添加为委托人,如下所示:
scnView.delegate = self
然后你应该看到你的
func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval)
正在执行中。
编辑(在看到您的 createScene()
代码之后)
尝试更改:
sceneView.delegate? = self
至
sceneView.delegate = self
(省略?
)
如果这样做,我可以看到您的 renderer
委托方法至少被调用了两次。要使其继续被调用,您可以添加:
sceneView.isPlaying = true
在你的 createScene()
方法中的某处,如果这是你的目标。
希望对你有所帮助。
哦哦哦!!!!我觉得自己像个白痴。我有我的 sceneView.delegate = self
作为可选的 AKA:sceneView.delegate? = self
删除问号后一切正常。感谢您的帮助!