Search code examples
iosswiftswift3sprite-kitgameplay-kit

How to access the object of Navigation graph in SpriteKit scene editor


I am working with SpriteKit and draw a scene by the help of the scene editor in xcode. According to SpriteKit, we can use Navigation graph to draw the paths and I am able to draw a path using navigation graph but i am not able to access this object in swift back-end.

enter image description here

How to access this Navigation graph object from the scene.


Solution

  • In the default SpriteKit template the GameViewController has a section in the viewDidLoad function that copies over the Scene Editors Entities and Graphs.

    class GameViewController: UIViewController {
        private var sceneNode: GameScene!
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            // Load 'GameScene.sks' as a GKScene.
            if let scene = GKScene(fileNamed: "GameScene") {
    
                // Get the SKScene from the loaded GKScene
                if let sceneNode = scene.rootNode as! GameScene? {
                    self.sceneNode = sceneNode
    
                    self.sceneNode.entities = scene.entities // <-- entities loaded here
                    self.sceneNode.graphs = scene.graphs // <-- graphs loaded here
    
                    // ... other scene loading code
                }
            }
        }
    }
    

    These Entities and Graphs array variables are declared in the GameScene. Then retrieve the graph from the array.

    class GameScene : SKScene {
        var entities = [GKEntity]()
        var graphs = [String : GKGraph]()
        var navigationGraph: GKGraph<GKGraphNode>!
    
        override func didMove(to view: SKView) {
           self.navigationGraph = self.graphs.values.first // <-- get a reference to your graph
        }
    }
    

    If there is more than one graph in the SpriteKit Editor, then use a query to retrieve it by name.

    self.navigationGraph = self.graphs.values.first(where: {$0.name == "GraphName"})