2016-03-17 4 views
0

У меня SCNNode и я применяю к нему геометрию из .dae файла с помощью этого метода:Настройка геометрии SCNNode свойство

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. 

Я не понимаю, почему, как и большую часть времени он работает.

ответ

2

carNode строится из selectedObject.objectname. Если selectedObject.objectname не существует на сцене, тогда childNodeWithName вернет nil. Поскольку carNode неявно разворачивается дополнительно, Swift попытается развернуть nil и сбой.

Вы должны сделать carNode дополнительный (var carNode: SCNNode?) или добавить тесты, такие как if carNode == nil { ... } и попытаться отлаживать, что ваш вход (selectedObject) и почему это неправильно.

Смежные вопросы