我有一个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/