ゲームAIの基本と実装:シンプルなAIの作り方
「敵がちゃんと動かない…」
「もっと賢いAIを作りたい!」
ゲーム開発を進めると、AI(人工知能)をどう実装するかで悩むことが多くなります。
特にインディーゲーム開発では、「強すぎず、弱すぎず、楽しい敵AI」を作るのが大きな課題になります。
そこで今回は、「ゲームAIの基本とシンプルな実装方法」について、
初心者でも理解しやすい形で解説していきます!
1. ゲームAIとは?
ゲームAIとは、プレイヤーの相手となるキャラクターや敵を動かすためのプログラムです。
✅ FPSなら「敵がプレイヤーを探して攻撃する」
✅ 格ゲーなら「相手の攻撃に合わせてガードやカウンターを取る」
✅ パズルゲームなら「コンピューターが適切な手を選ぶ」
現実のAI(機械学習など)とは異なり、ゲームAIはルールベース(手続き的な処理)が中心です。
つまり、学習するのではなく、「こういう時はこう動く」というルールを決めて動かします。
2. ゲームAIの基本的な種類
1. スクリプト型AI(決め打ち)
✅ あらかじめ決めたパターンで行動する。
✅ 一番シンプルなAIの作り方。
例:2Dアクションゲームの敵
- 右へ歩く
- 端に着いたら反転して左へ歩く
- プレイヤーが近づいたら攻撃
pythonコピーする編集するif player_in_range():
attack()
else:
move_forward()
✅ メリット:簡単に作れる!
❌ デメリット:動きが単調で読まれやすい。
2. ステートマシン(状態遷移)
✅ 状態(攻撃・移動・逃走など)を分けて管理する。
✅ ゲームAIの定番手法。
例:敵AIの状態遷移
状態 | 条件 | 次の状態 |
---|---|---|
待機 | プレイヤーが近づく | 追跡 |
追跡 | プレイヤーに攻撃可能 | 攻撃 |
攻撃 | プレイヤーが離れる | 追跡 |
攻撃 | HPが少なくなる | 逃走 |
Pythonでのシンプルな例(擬似コード)
pythonコピーする編集するclass Enemy:
def __init__(self):
self.state = "WAIT"
def update(self):
if self.state == "WAIT":
if player_is_near():
self.state = "CHASE"
elif self.state == "CHASE":
if can_attack():
self.state = "ATTACK"
elif player_is_far():
self.state = "WAIT"
elif self.state == "ATTACK":
attack()
if player_is_far():
self.state = "CHASE"
✅ メリット:管理しやすく、柔軟なAIを作れる。
❌ デメリット:状態が増えると複雑になりやすい。
3. パスファインディング(経路探索)
✅ AIが「最適な道を探す」ための技術。
✅ 代表的な手法:A*(Aスター)アルゴリズム。
A*アルゴリズムの基本
- スタート地点からゴールまでの「コスト」を計算。
- 一番効率の良いルートを選択して進む。
例:2Dタイルマップでの敵移動
pythonコピーする編集するpath = a_star(start_position, target_position)
for step in path:
move_to(step)
✅ メリット:迷路のようなマップでも敵がスムーズに移動できる。
❌ デメリット:計算量が増えると処理が重くなる。
4. ビヘイビアツリー(行動ツリー)
✅ 「条件分岐」のようにAIの行動をツリー状に組み立てる。
✅ ステートマシンよりも拡張しやすい。
pythonコピーする編集するif enemy_near():
if can_attack():
attack()
else:
move_closer()
else:
patrol()
✅ メリット:複雑なAIでもスッキリ管理できる。
❌ デメリット:初めて使うときは少し難しい。
3. シンプルな敵AIを作ってみよう!
ターゲットを追いかけるシンプルな敵
pythonコピーする編集するclass Enemy:
def __init__(self, x, y):
self.x = x
self.y = y
self.speed = 2
def update(self, player_x, player_y):
if self.x < player_x:
self.x += self.speed
elif self.x > player_x:
self.x -= self.speed
if self.y < player_y:
self.y += self.speed
elif self.y > player_y:
self.y -= self.speed
def draw(self):
print(f"Enemy at ({self.x}, {self.y})")
# プレイヤーの座標を想定
player_x, player_y = 100, 100
enemy = Enemy(50, 50)
for _ in range(10):
enemy.update(player_x, player_y)
enemy.draw()
✅ プレイヤーを自動で追跡する敵AIの基本形!
この形を発展させて、攻撃や逃走のロジックを追加すれば、もっと賢い敵が作れます。
4. AIを作るときのポイント
✅ 「完璧なAI」より「楽しいAI」を目指す
→ ゲームのAIは「プレイヤーにとって楽しい相手」であるべき。
→ 例えば、少しミスをするAIの方が、対戦が白熱することが多い。
✅ 処理の重さに注意する
→ パスファインディング(A*)を多用しすぎると、ゲームが重くなる。
→ 必要な場面だけ計算するように最適化する。
✅ デバッグ用の「AI可視化ツール」を作る
→ 敵の移動ルートや現在の状態を表示できると、デバッグがしやすい。
→ 例えば「現在の状態を画面に表示する」だけでも、バグが見つかりやすくなる。
まとめ:ゲームAIの作り方と選び方
AIの種類 | 特徴 | 使われるゲーム |
---|---|---|
スクリプト型 | 決められた動きをする | 2Dアクション、シューティング |
ステートマシン | 状態ごとに行動を変える | RPG、格ゲー、アクション |
パスファインディング | 最適なルートを探す | オープンワールド、RTS |
ビヘイビアツリー | 複雑な行動を管理 | FPS、ステルスゲーム |
結論:シンプルなAIから始めよう!
ゲームAIは「少しずつ改良する」のが大事!
まずは「スクリプト型」でシンプルに作り、徐々にステートマシンやパスファインディングを追加していくと、より自然で面白いAIが作れます!
あなたのゲームに合ったAIを作って、より楽しいプレイ体験を提供しましょう!
コメント