SceneKit渲染器功能不起作用Swift?

时间:2016-11-02 03:11:08

标签: swift xcode scenekit

我目前正在使用Swift 3和SceneKit。我的问题似乎是我的渲染器功能无法正常工作。我不知道自己做错了什么。程序运行但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()
    }

如果有任何我遗漏或做错的事,请告诉我。谢谢!

2 个答案:

答案 0 :(得分:0)

我还没有看到你的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()方法中的某个地方。

希望对你有所帮助。

答案 1 :(得分:0)

OHHH !!!!我觉得自己像个白痴。我将sceneView.delegate = self作为可选的AKA:sceneView.delegate? = self

一旦我删除了问号,一切都完美无缺。谢谢你的帮助!