El Nodo no archivado no aparece cuando se lo agrega al padre en SpriteKit

Previamente estaba cuestionando si podía usar el editor de escenas para crear SKSpriteNodes complejos, y solo usarla para diseñar SKScenes. Con la ayuda de @Anton Rogachevskyi, la pregunta anterior empecé a usar unarchiveNodeFromFile para localizar el file .SKS. Carga el file sks como era de esperar, pero cuando bash agregarlo a la escena actual, no aparece nada. Si rompo la línea addChild y previsualizo el object que se muestra correctamente en la window de vista previa, entonces sé que está encontrando el file correcto. Dentro del file sks hay una class de dialog personalizada y se configuran puntos de interrupción en "inicio requerido (codificador aDecoder: NSCoder)" Puedo decir que el object personalizado se inicializa correctamente.

diálogo creado en el editor de escena

dentro de la class de dialog, agrego programáticamente un cuadro rosa al object para mostrar que llega al inicio de la class

class TeamDialog: SKSpriteNode { init(size: CGSize) { super.init(texture: nil, color: .networking, size: size) } requinetworking init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) setup() } func setup() { let pinkBox = SKSpriteNode(color: .magenta, size: CGSize(width: 100, height: 100)) pinkBox.zPosition = 500 addChild(pinkBox) } } 

Y en la escena así es como encuentro el object e bash agregarlo a la escena, aparece en la vista previa pero no aparece nada en la pantalla

 private func displayDialog() { if let wtf = unarchiveNodeFromFile(file: "TeamDialog")! as SKNode? { let layer = SKSpriteNode(color: .clear, size: self.size) layer.zPosition = 5000 layer.position = CGPoint(x: self.size.width / 2, y: self.size.height / 2) addChild(layer) for child in wtf.children { print("child \(child.name)") if let teamDialog = child as? TeamDialog { teamDialog.removeFromParent() layer.zPosition = 1 layer.addChild(teamDialog) } } } } func unarchiveNodeFromFile(file: String) -> SKNode? { if let path = Bundle.main.path(forResource: file, ofType: "sks") { let fileData = NSData.init(contentsOfFile: path) let archiver = NSKeyedUnarchiver.init(forReadingWith: fileData as Data!) archiver.setClass(SKNode.classForKeyedUnarchiver(), forClassName: "SKScene") let node = archiver.decodeObject(forKey: NSKeyedArchiveRootObjectKey) as! SKNode archiver.finishDecoding() return node } else { return nil } } 

vista previa de ruptura del objeto

Una vez más, puedo verlo en la window de vista previa, pero no aparece nada cuando se agrega a la escena.

¿Tengo que manejar un object que no se ha archivado de manera diferente o hacer algo con él antes de que pueda agregarlo a la escena?

Saqué el código y lo puse en un proyecto de testing con los mismos resultados.

He intentado agregar el file sks (como un nodo) a la escena sin suerte, y he intentado aislar el dialog del file sks y agregarlo sin suerte

El problema no era si lo cargaba como un file no archivado o si lo cargaba como un SKReferenceNode. Aunque después de descubrir e investigar este SKReferenceNode es EXACTAMENTE el path a recorrer y probablemente fue creado para este propósito.

El problema era que en el editor de escena el object personalizado se colocaba al lado de la escena (x = -1500) porque cuando originalmente estaba construido estaba en el file scene.sks y no lo quería encima de los objects de escena. Cuando lo transferí a su propio file sks, mantuvo su posicionamiento. No pensé que esto era un gran problema porque después de cargar el file sks en una variable, establecí su position en CGPoint (x: 0, y: 0) en el código. El problema es que NO puede mover el object de escena cargado alnetworkingedor de la escena existente, por lo que si está apagado, permanecerá fuera de la pantalla. Establecer la position no hizo nada, y no importaba si era un file no archivado o SKReferenceNode, no se movería.

¡Entonces hice reference al primer niño en el file sks y configuré su position y viola!

Si alguien está interesado en lo que se puede hacer con esta configuration, puede crear y diseñar objects personalizados complejos en su propio file sks y luego cargarlos en su file de escena. La belleza de hacerlo de esta manera es que tus files sks no se vuelven desorderados y, a continuación, los sks de tu object personalizado pueden ser references en múltiples escenas diferentes.

  let path = Bundle.main.path(forResource: "TeamDialog", ofType: "sks") let dialogScene = SKReferenceNode (url: URL (fileURLWithPath: path!)) if let teamDialog = dialogScene.childNode(withName: "//teamDialog") as? TeamDialog { teamDialog.setup(scene: self) teamDialog.position = CGPoint(x: 0, y: 0) dialogScene.zPosition = 5000 addChild(dialogScene) }