GameplayKit>场景编辑器导航图>如何使用它进行寻路?

不久前,苹果向Xcode的场景编辑器引入了GameplayKit元素,这非常棒。 但是,我似乎有导航图元素的问题: 场景编辑器导航图

我试图实现的是从场景编辑器中绘制GKGraph,在代码中检索它,并将其用作寻路的基础。

所以我先画一个GKGraph:

场景编辑器绘制GKGraph

然后我像这样在GameScene.swift中检索它:

graph = self.graphs.values.first 

其中graphics是Apple预定义的arrays,用于存储场景编辑器中的GKGraph。 到现在为止还挺好。

然后我希望玩家在屏幕上find水龙头位置的path。 为此,我使用以下callback方法使用UITapGestureRecognizer

 var moving = false func moveToLocation(recognizer: UITapGestureRecognizer) { var tapLocation = recognizer.location(in: recognizer.view!) tapLocation = self.convertPoint(fromView: tapLocation) guard (!moving) else { return } moving = true let startNode = GKGraphNode2D(point: vector_float2(Float(player.visualComponent.node.position.x), Float(player.visualComponent.node.position.y))) let endNode = GKGraphNode2D(point: vector_float2(Float(tapLocation.x), Float(tapLocation.y))) NSLog(graph.nodes.debugDescription) graph.connectToLowestCostNode(node: startNode, bidirectional: true) graph.connectToLowestCostNode(node: endNode, bidirectional: true) NSLog(graph.nodes.debugDescription) let path: [GKGraphNode] = graph.findPath(from: startNode, to: endNode) guard path.count > 0 else { moving = false; return } var actions = [SKAction]() for node: GKGraphNode in path { if let point2d = node as? GKGraphNode2D { let point = CGPoint(x: CGFloat(point2d.position.x), y: CGFloat(point2d.position.y)) let action = SKAction.move(to: point, duration: 1.0) actions.append(action) } } graph.remove([startNode, endNode]) // Convert those actions into a sequence action, then run it on the player node. let sequence = SKAction.sequence(actions) player.visualComponent.node.run(sequence, completion: { () -> Void in // When the action completes, allow the player to move again. self.moving = false }) } 

使用这种方法,我让玩家去水龙头的位置。 问题是由GameplayKit返回的path只包括startNodeendNode ,这意味着玩家不会在预绘制的GKGraph上行走,而是直接走到endNode

注意:当我第一次运行NSLog(graph.nodes.debugDescription)时,它列出了所有10个预先绘制的节点。 当我在graph.connectToLowestCostNode之后再次运行时,我得到了所有12个节点。 所以我的图似乎包含寻路所需的一切。

你认为是什么问题? 为什么graph.findPath不使用预先绘制的10个节点来定义path? 您的答复将不胜感激。

看起来像GameplayKit的.findPath方法在从场景编辑器创build的GKGraph上调用时无法正常工作。 我所做的是,我将节点从预绘制的GKGraph克隆到以编程方式创build的GKGraph:

 let newGraph = GKGraph() for drawnNode in graph.nodes! { newGraph.add([drawnNode]) } 

然后,它的.findPath工作得很好:

 newGraph.connectToLowestCostNode(node: startNode, bidirectional: true) newGraph.connectToLowestCostNode(node: endNode, bidirectional: true) let path: [GKGraphNode] = newGraph.findPath(from: startNode, to: endNode) 

可变path现在包含考虑所有10 + 2节点生成的path。

总结:您无法直接使用在场景编辑器中创build的导航图进行寻路。 我的解决scheme是首先将其节点克隆到以编程方式创build的GKGraph中,然后使用最新版本完成剩下的工作。