スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

敵から逃げるAI

RTSを作っていた時にも少し考えていたのですが、
敵と自分の座標をもとに安全に逃げるAIはどういうものがあるのか考えてみました。
座標はドット単位、Y軸は下がプラスのウディタ式で書いています。
※ 座標系は、Xは右が正でYは下が正です。
  通常の数学で使う座標とYの正負が逆であることに注意してください。
  (WOLF RPG エディターの仕様に合わせています)

1.座標平均
ai1.png

まずは、座標の平均(重心の位置)を取る方法。
図の緑色の点ABCが重心です。
これでいくと、右下の方に逃げてしまうのでちょっと違いそうです。
同様に、角度の平均をとってみても230°ぐらいで似たような値になってしまいます。

近くの敵から優先的に逃げて欲しいので、そこも考慮して違う方法を考えてみます。


2.ベクトル合成
ai3.png

分かりやすいように、敵の周囲に半径10の円を当たり判定として描いてみました。
敵が近ければ影響を大きくしたいので、
【敵から自分方向へのベクトル】をとり、角度はそのままで大きさを
【ベクトル大きさの逆数】もしくは【定数-ベクトル大きさ】などにしてやります。
それらのベクトルを合計してやれば、図のように左上の方に逃げてくれます。

余談ですがベクトルの大きさの逆数をそのまま速度にすれば、
マグネットの反発みたいな動きをしてくれますね。


ちょっと逃げた後にまた判定してやれば、ABから少し離れてCの影響範囲に入るので、
次第に右上の方に進路を変更してくれます。
もう少し移動方法を工夫すれば、敵から一定距離を保とうとする(接近もする)AIにもなりそう。
遠距離攻撃型に良さそうです。


次に、敵が多い場合の考え方。
これまでは分かりやすいように3体のみの敵でしたが、
大量に敵がいる場合についても考えてみます。

3.空間分割
ai2_2014030519165680a.png

空間を4分割、8分割ぐらいに分けて、そこにいる敵の数をカウントします。
それで敵が少ない方に進むだけの簡単AIです。
敵から逃げるというよりは、敵陣の薄い場所に突撃するイメージでしょうか。
この例なら真下が1体しかいないので、そちら方面に進んでいきます。
これぐらいの数なら、4分割ぐらいでもいいかもしれません。

これもただ分割するだけでなく、一定の距離範囲だけ判定してやればおかしな動きをせずに済みそうです。


空間分割は「逃げる」というお題のために放射状にしましたが、
グリッド状に区切ってそこに全員集合するパターンや、
敵が密集していれば陣形を保ちつつ接近して一網打尽にする、などもできそうです。


どれが良いとか悪いとかでなく、こういうAIをいくつか組み合わせて使うのが
賢さ的にも処理の重さ的にもいいんじゃないかなと思いました。

例えば、
・ヒーラーは【空間分割で敵から離れる】【ベクトル合成で味方に一定距離で近づく】
・遠距離攻撃は【ベクトル合成で敵と一定距離を保つ】
・盾役は【空間分割(グリッド)で敵と味方の中間に位置する】【ベクトル合成でなるべく敵に近づくが、味方から離れすぎない】
・守られ役NPCは【マップ座標の一点を目指す】【ベクトル合成でちょっと敵を避ける(効果弱め)】
など。


AIは基本的に【して欲しい行動を数値化する】ものだと思ってるので、
どういう行動をして欲しいかを書き出して整理してみるといいものが作れそうです。
唯一マトモに作ったビリヤードのAIを作った時も、
手球が的球に当たる>クッションを使う>途中で違う球に当たる>手球がポケットに入る……
のように得点化し、点数が大きい行動を取らせたりしていました。

他のゲームはAIが無かったり、ランダムで行動させたり、予め決められた行動しかしなかったりで、まともにAIを作った記憶が無いのでいい勉強になりました。
これから作るゲームに反映できそうです。
きっかけありがとうございました。


もし根本的に違う考え方や、役に立つサイトなどあればぜひ教えてください。
関連記事

Comment

Post a comment

非公開コメント

お知らせ

記事移行完了

記事をFC2からcatgames.16mb.comへ移行完了しました。

このサイトは更新されません。

カウンター

2012/09~

メールフォーム

名前:
メール:
件名:
本文:

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。