読者です 読者をやめる 読者になる 読者になる

しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

GameplaykitのPathfindingを使ってみる

PathfindingというiOS9からの機能を使ってみました。

Gameplaykitとは

Gameplaykitとは、iOSの出しているゲームエンジンであるSpriteKit/SceneKitを強化してくれるライブラリです。
ルート検索・AI作成の手伝い・Stateパターンの簡単な実現などの機能があります。

Pathfindingとは

Pathfindingとはルート検索機能です。
下の図のように障害物を考慮した上での最短ルートを取得する事ができます。

f:id:llcc:20151206142645p:plain

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から障害物情報を取得できるようです。