我有一个SCNNode,并且正在使用.dae文件使用以下方法将其应用于几何:

func addNode(gridPosition: SCNVector3, row: Int, gamePlaneHeight: Float, sceneArray: [ObjectInfo]) -> SCNNode {

    // Create a material using the model_texture.tga image
    let carMaterial = SCNMaterial()
    carMaterial.diffuse.contents = UIImage(named: "assets.scnassets/Textures/model_texture.tga")
    carMaterial.locksAmbientWithDiffuse = false

    // Create a clone of the Car node of the carScene - you need a clone because you need to add many cars
    var carNode: SCNNode!
    let randomNumb = AppDelegate().randRange(0, upper: sceneArray.count - 1)
    let selectedObject = sceneArray[randomNumb]
    carNode = selectedObject.objectscene.rootNode.childNodeWithName(selectedObject.objectname, recursively: false)!.clone() as SCNNode

    carNode.scale = SCNVector3(0.5, 0.5, AppDelegate().randomBetweenNumbers(0.8, secondNum: 2.2))
    carNode.name = selectedObject.objectname
    carNode.position = gridPosition
    carNode.position.y = carNode.position.y + gamePlaneHeight

    // Set the material
    carNode.geometry?.firstMaterial = carMaterial

    return carNode
}


该方法大部分时间都有效,但偶尔会崩溃

carNode.geometry?.firstMaterial = carMaterial


与错误

fatal error: unexpectedly found nil while unwrapping an Optional value
warning: could not load any Objective-C class information from the dyld shared cache. This will significantly reduce the quality of type information available.


我不明白为什么会这样,因为大多数时候它都起作用。

最佳答案

carNode是从selectedObject.objectname构建的。
如果场景中不存在selectedObject.objectname,则childNodeWithName将返回nil。因为carNode是一个隐式解包的可选内容,所以Swift将尝试解包nil并崩溃。

您应该使carNode为可选(var carNode: SCNNode?)或添加诸如if carNode == nil { ... }的测试,并尝试调试输入(selectedObject)是什么以及为什么输入不正确。

关于ios - 设置SCNNode几何属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36073353/

10-11 15:48