SwiftのGameplayKitでAIに追いかける、避ける、逃げる処理を追加するには:ゲームの「敵」キャラで分かる「人工知能」の作り方(2)(1/4 ページ)
iPhone向け鬼ごっこアプリを作りながら人工知能(AI)について学んでいく連載。今回は、SwiftのGameplayKitでAIの敵キャラに、追いかける、避ける、逃げる処理を追加する方法を解説する。
本連載『ゲームの「敵」キャラで分かる「人工知能」の作り方』では、iPhone向け鬼ごっこアプリを作りながら人工知能(AI)について学んでいきます。鬼の動きにAIを活用して、自動でプレイヤーを追いかけるようなAIを作りたいと思います。
前回の「iOS GameplayKitの「Agents, Goals, and Behaviors」で作る、鬼ごっごの鬼AI」では「Agents, Goals, and Behaviors」を使って、鬼がプレイヤーを追いかける処理を実装しました。
今回はAIをさらに進化させて、「追いかける」だけではなく「避ける」「逃げる」といった挙動をするAIを作ろうと思います。
前回のソースコードはこちらです。今回はこのソースコードを元に機能追加していきます。
フィールドに障害物を配置する
まずはAIに「避ける」動作を追加します。フィールド上に障害物を配置し、鬼がそれを避けるような実装をしていきます。
その前に画面に障害物を設置します。今回は障害物は5つランダムに配置される仕様とします。「GameScene.swift」を以下のように修正してください。
class GameScene: SKScene {
// 省略
override func didMove(to view: SKView) {
player.fillColor = UIColor(red: 0.93, green: 0.96, blue: 0.00, alpha: 1.0)
addChild(player)
createObstacles() // 今回追加
setCreateEnemyTimer()
physicsWorld.gravity = CGVector()
}
// ここから今回追加
func createObstacles() {
guard let viewFrame = view?.frame else {
return
}
var obstacleNodes = [SKShapeNode]()
while obstacleNodes.count < 5 {
let point = CGPoint(
x: CGFloat(arc4random_uniform(UInt32(viewFrame.width))) - viewFrame.width / 2,
y: CGFloat(arc4random_uniform(UInt32(viewFrame.height))) - viewFrame.height / 2)
let radius = CGFloat(arc4random_uniform(50) + 50)
// 障害物かPlayerが衝突していたら設置しない
let isObstacleOverlapped = obstacleNodes.contains {
let dx = (point.x - $0.position.x)
let dy = (point.y - $0.position.y)
if sqrt(dx*dx + dy*dy) < $0.frame.width + radius {
return true
}
return false
}
let dx = point.x - player.position.x
let dy = point.y - player.position.y
let isPlayerOverlapped = sqrt(dx*dx + dy*dy) < radius + player.frame.width
if isObstacleOverlapped || isPlayerOverlapped {
continue
}
let obstacleNode = SKShapeNode(circleOfRadius: CGFloat(radius))
obstacleNode.fillColor = UIColor(red: 0.7, green: 0.7, blue: 0.7, alpha: 1.0)
obstacleNode.position = point
obstacleNode.physicsBody = SKPhysicsBody(circleOfRadius: CGFloat(radius))
obstacleNode.physicsBody?.pinned = true
addChild(obstacleNode)
obstacleNodes.append(obstacleNode)
}
}
// ここまで今回追加
// 省略
}
アプリを起動すると、画面上に5つの障害物が配置されていることが分かります。
プレイヤーが障害物と重ならないようにする
次はプレイヤーを修正します。今はプレイヤーが障害物と重なるところができてしまうので、重ならないように修正します。
GameScene.swiftのdidMoveメソッドに処理を追加します。
class GameScene: SKScene {
// 省略
override func didMove(to view: SKView) {
player.fillColor = UIColor(red: 0.93, green: 0.96, blue: 0.00, alpha: 1.0)
player.physicsBody = SKPhysicsBody(circleOfRadius: 10) // 今回追加
addChild(player)
createObstacles()
setCreateEnemyTimer()
physicsWorld.gravity = CGVector()
}
// 省略
}
これでプレイヤーが障害物と重ならなくなりました。
コラム physicsBodyとは
今回追加したphysicsBodyは物理演算に使うプロパティーです。Node同士の衝突時の挙動をコントールしたり、重力などの外部からの力を加えるときに使います。
今回はプレイヤーと障害物にphysicsBodyを設定することで、お互いが衝突して重ならないようにしました。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
iOS 9の最新機能で自動ルート検索を簡単にゲームに組み込む
iPhoneゲームをSwift言語で作成してみたいという初心者向けにiOSのゲームフレームワークを使った作り方を一から解説する入門連載。今回は、敵の動きを改善する。GameplayKitのPathfindingを使ったルートの自動探索の使い方についてSpriteKitのSKActionでの実装と比べて解説。
iOS 10 SDKの新機能SiriKit、音声認識、iMessage拡張を自作アプリに生かすには
iOS 10で開発者にAPIが解放されたと話題の音声アシスタント「Siri」。その実態はどんなものなのか。SiriKit、Speech/Messages Frameworkの使い方と併せて、簡単なアプリを作りながら解説します。
スマホ世代でも分かるMacの基本的な使い方&Xcodeをインストールする手順
本連載では、これからプログラミングやiPhoneアプリ開発を始めてみたい方を対象に、開発に必要な知識を基礎から解説していきます。今回は、プログラミングを学び始める前に、まずはMacの基本的な使い方を学び、Xcodeをインストールし、Playgroundを起動してみましょう。


