ぬるーむ

Unity初心者が誰もが知っているゲームの模倣をしています。個人的な備忘録ですが、入門書を読み終えたばかりの初心者の方は「こんなへなちょこでもいいのか!」「俺の方がうまく作れる」と作成意欲がわいたりするかもしれません。

Unityによるパックマンの作り方 ~ゴーストのAI~


スポンサードリンク

概要

Waypointに到達するごとに次のWaypointを取得するこで経路を決定します。以下のものが必要になります。

  • Waypoints:ゴーストが移動できる全座標のリスト。
  • Tile:Waypoint同士のつながりを表すクラス。
  • TileUtility:ゴーストの現在地からTileを取得するクラス。
  • AAI:TileUtilityを使ってゴーストの現在地からTileを取得し、移動方向を決定する抽象クラス。これを継承してゴーストごとのAIを作成します。
  • 各ゴーストのAI:追跡対象を取得するクラス。

処理の流れは以下の通りです。

  1. TileUtilityを使ってゴーストの現在地からTileを取得します。
  2. TileからAIを使って移動先のWaypointを決定します。

Waypointsの取得

ゴーストが移動できる全座標を手作業で座標を書き出してもよいのですが、迷路のColliderMapの作成と同じ要領でWaypointsMapを作成し、MazeUtilityを使いWaypointsを取得します(MazeUtilityについては下記参照)。

nullsuke.com

f:id:Nullsuke:20210504225518g:plain
WaypointsMapの描画

f:id:Nullsuke:20210506223417p:plain
WaypointsMap

MazeオブジェクトにWaypointsMapをセットし、ついでに迷路の幅と高さも設定します。

f:id:Nullsuke:20210505110831p:plain
Mazeオブジェクト(余計なものがいろいろついてますが気にしないでください)

TileUtilityの作成

Mazeオブジェクトが読み込まれたときにCreateTiles関数でTileのリスト作成し、それをもとにTileUtilityを作成します。

AAIの作成

処理の流れは以下の通りです。

  • GetNextTile関数で進行方向にあるTile(NextTile)を取得します。
  • NextTileが存在して、かつ交差点でない場合、そのTileの位置をWaypointとします。
  • NextTileが存在せず、かつ交差点でない場合、現在のタイルから進めるTileを探して、Waypointとします。
  • NextTileが存在せず、かつ交差点の場合ゴーストの状態によって方法が異なります。
    • 追跡状態:GetTarget関数で追跡対象のTileを取得し、そこまでの直線距離が最も短くなるTileの位置をWaypointとします。
    • 恐慌状態:現在のTileに隣接するTileからランダムでWaypointを決定します。
    • 帰還状態:巡回開始地点を目的地とし、そこまでの直線距離が最も短くなるTileの位置をWaypointとします。
    • 死亡状態:ゴーストの巣付近を目的地とし、そこまでの直線距離が最も短くなるTileの位置をWaypointとします。

パックマンなどの追跡対象への距離を単純な直線距離で計算しているため、場合によって遠回りしています(マヌケ)。気になる人は距離の求め方を修正するとよいと思います。

f:id:Nullsuke:20210515152246p:plain
マヌケなAI

各ゴーストのAIの作成

AAIを継承してゴーストごとのAIを作成します。追跡対象がいるTileを取得するGetTargetTileを実装します。

各ゴーストの追跡時の仕様については下記を参照してください。

nullsuke.com