yumeの日記: メデューサ・ゲーム改・7
◉兵士 - 経路探索
Soldierの経路探索を実装する。
使うのはやはり前回同様A* Pathfinding Projectだ。
ただ、今回はターンベース・グリッドベースな仕組みなので、前回のように外部のサンプルスクリプトそのまま走らせてうごくというものではない。
定義を考えておこう。
経路探索移動は、呼び出されたとき:
・経路探索を呼び出し、現在地に隣接する目標座標、ないし方向を取得する。
・目標に向かって、ターンベースで1マス移動する。
経路探索は、呼び出されたとき:
・現在地とプレイヤー間の、障害物を避けて通れる経路を算出する。
・その経路から、現在地に隣接する1マスを目標地点として返す。
経路探索の準備にあたり、まずシーン上に障害物から計算した通行可能エリアを取り出さなければならない。
これは、A* Pathfinding ProjectのAstarPathクラス(コンポーネントとしてPathfinder)でシーン上の障害物から計算してくれるらしい。
そうして、通行可能エリアを割り出したら、SeekerクラスのStartPath関数でPathを計算する。
PathはGraphNodeのリストを持っている。
GraphNodeは見た感じ、ちょうどマス目ごとのポイント(WayPoint的な)を持っている。
ということは、このリストの1番目の座標目指してStepすれば、うまく動くはずだ。
まだ問題が残っている。この経路探索は、ステージ開始時のマップの障害物の状態をもとに経路を割り出しているが、可動式柱などによって、障害物の状態が変わる可能性がある。
AstarPathクラスには、経路を再スキャンする方法が載っている。
これによると、使用しているグラフに限定して更新した方が良いらしい。
サンプルにある通り、1番目のグリッドグラフだけを更新するコードを、柱が稼働するタイミングで呼び出す。
動く……。すげえあっさり動く。すごい。天才かもしれない。
◉兵士 - 捕獲動作
兵士がプレイヤーを捕獲する条件は:
・ターン終了時に、
・同一マスにプレイヤーが存在するとき
かな。つまり、プレイヤーと兵士が重なったなら、その瞬間だ。
この辺りはちょっと調整するかもしれないけど、一旦これで実装してみよう。
クラスCaptureは、ターン終了時に呼び出され、自身と重なるオブジェクトを調べる。
調べた結果が:
・Playerが重なっているなら、Captureを実行する。
Captureメソッドでは、対象のCapturableコンポーネントを探し、それがあるならCapturableのCaptureメソッドを実行する。
クラスCapturableは、捕獲可能なオブジェクト(プレイヤーなど)にくっついて、BeCapturedメソッドを持つ。このメソッドはCaptureクラスから呼び出され、捕獲時の捕獲された側の挙動を定義する。
これでOK。
メデューサ・ゲーム改・7 More ログイン