PathfindingというiOS9からの機能を使ってみました。
Gameplaykitとは
Gameplaykitとは、iOSの出しているゲームエンジンであるSpriteKit/SceneKitを強化してくれるライブラリです。
ルート検索・AI作成の手伝い・Stateパターンの簡単な実現などの機能があります。
Pathfindingとは
Pathfindingとはルート検索機能です。
下の図のように障害物を考慮した上での最短ルートを取得する事ができます。
Pathfindingを使ってみる
まずは障害物インスタンスを作ります。
let points = [vector_float2(0, 0), vector_float2(20, 0), vector_float2(20, 20), vector_float2(0, 20)] let obstables = [GKPolygonObstacle(points: UnsafeMutablePointer(points), count: 4)]
それを使ってGKObstacleGraphを初期化します。
GKObstacleGraphはパスを探すクラスで、ここに障害物情報や始点・終点情報を登録します。
let graph = GKObstacleGraph(obstacles: obstables, bufferRadius: 0.0)
スタート地点・終了地点を作成してgraphに登録します。
位置情報はGKGraphNode2Dというクラスを使います。
let start = GKGraphNode2D(point: vector_float2(-5, 10)) let end = GKGraphNode2D(point: vector_float2(25, 10)) graph.connectNodeUsingObstacles(start) graph.connectNodeUsingObstacles(end)
最後にfindPathFromNode
メソッドを使えば始点から終点へのルートを取得できます。
先ほど登録したGKPolygonObstacleを避ける形のルートになっている事が分かるかと重います。
let nodes = graph.findPathFromNode(start, toNode: end) print(nodes) // →[GKGraphNode2D: {-5.00, 10.00}, GKGraphNode2D: {-0.00, -0.00}, GKGraphNode2D: {20.00, -0.00}, GKGraphNode2D: {25.00, 10.00}]
他にGKPolygonObstacleでできること
GKGraph
今回はGKObstacleGraphを使ってルート検索しましたが、GKGridGraphというルート検索もあるようです。
obstaclesFromNodePhysicsBodies
今回は自分で障害物を作りましたが、SKNodeのobstaclesFromNodePhysicsBodiesというメソッドを使えばSKSpriteNodeから障害物情報を取得できるようです。