2012年12月6日木曜日

【Unity】RTS AI 6 攻撃円と展開

以前考えたAIの設計では最適の攻撃目標を選ぶことができても、どのような戦術で目標を打ち破るのかまた実際に攻撃した場合の敵の反撃を考慮することが出来なかった。そこで攻撃円という考え方を導入した。各部隊は攻撃円という円形エリアを前方に持っている。攻撃のためにはこの円内に敵を収める必要がある。包囲や側面攻撃など連携攻撃を行う場合には各部隊ごとに計算された位置に攻撃円が設置される。
各部地は攻撃円上に敵を補足できるように展開し補足したら敵に攻撃を開始する(つまり攻撃円は一種のトリガーである)。展開に際し各部隊は敵の攻撃円内に立ち入らないよう注意すべきである。また敵の攻撃円は味方の攻撃円で中和が可能である。AIは敵の連携攻撃を想定した敵の攻撃円を計算し、常に味方が不用意に敵の攻撃円に立ち入らないようにする。

2012年12月2日日曜日

【Unity】RTS:AI 5 脅威度の算出

プレーヤーの部隊(左)とAIの部隊(右)。
前回に続きAIの設計に基づき脅威度を導入した。脅威度は以下のプロセスを経て算出される。
脅威度算出プロセス

上の写真では総合戦闘力が上回っているユニットに対してAIのユニットから黄色いラインが引かれている。特に脅威度が高いと赤線になる。一方戦力投入コストについては以下のようなプロセスで算出することを予定している。うまくすると脅威度と戦力投入コストは統合できるかもしれない。関数を追加するごとにCPU負荷が高まっている。心配だ。

戦力投入コスト算出プロセス



【Unity】RTS:AI 4 総合戦闘力を算出する



前回の設計に基づき総合戦闘力関数を導入した。ユニットに表示される数値がそのユニットの総合戦闘力を示している。上の写真では孤立した左上のユニットは155と他の右下3つのユニットに比べ低い数値を示している。下の写真では真ん中のユニットは左右のユニットから支援を得れるので一番高い総合戦闘力を示している。従って特別な理由がない限りこのユニットを攻撃目標にするのは割に合わないとAIは判断するだろう。

【Unity】RTS:AI 3 攻撃目標の選定


複数の敵の中から攻撃目標を選ぶ場合、基準が必要となる。戦闘において努むるべきは味方の損害を最小にし敵の損害を最大にすることだとすると、「撃破しやすい敵」か「味方を撃破しうる敵」が優先目標となる。「撃破しづらくかつ味方を撃破し得ない敵」はほっといても大丈夫である。問題は常に「撃破しやすい敵」=「味方を撃破しうる敵」ではないということだ。以上を踏まえて攻撃目標評価関数を導入する。


まずAIが攻撃目標を評価する上で基本となるユニットのスペックを規定する。「戦闘移動コスト」は速度・射程・目標座標までの距離をパラメータに持つ関数である。「支援戦闘力」はパラメータに攻撃力と戦闘移動コストを持ち、味方を支援できる力を示す。例えユニットの攻撃力が大きくとも低速なら支援戦闘力は低くなる。「総合戦闘力」はユニット自身の攻撃力+周辺の味方のこのユニットへの支援戦闘力を示しており、これがAIが各ユニットの戦闘力を評価する際の基準となる。攻撃力が低いユニットでも群れていれば戦闘力評価は高くなるのだ。
この総合戦闘力をもとにさらに2つの関数を設定する。一つは「戦力投入コスト」である。これは敵の総合戦闘力をもとに敵を撃破するのに必要な味方戦力を動員するコストを示す。味方の総合戦闘力が劣っている場合追加の戦力が必要となるが戦力の集結には時間がかかるため戦力投入コストは高くなる。「脅威度」は敵が近く、強大なほど大きくなる。同一状況下でも戦力投入コストと脅威度は敵について相反する評価を示す場合がある。これら2つの評価を調整し最終的な評価を下すのが「攻撃目標評価」である。

2012年11月30日金曜日

【Unity】RTS:AI 2 概念図



AIを考える上でこの記事この記事は役に立った。試しにAIの役割について簡単なチャートを描いてみた。AIは上級から下級にかけて「師団」「旅団」「大隊」としている。ユニットに搭載されているスクリプトは大隊クラスだ。最終的にはには第二次大戦のRTSを目指しているのでこのような構成にしてみた。ただし今回は戦国時代が舞台なので大規模な部隊運営は想定しておらず師団AIと旅団AIはほとんど融合することになる。図を見ると簡単に見えるが実際には戦況の把握・分析、戦術の決定をこなせばならず更に時間軸が関わってくるのでAIの組み立てには相当苦労するだろう。

2012年11月29日木曜日

【Unity】RTS:AI 1 単純な移動

AIが指定した座標(赤いボール)に向けて移動する敵歩兵隊(右奥)。手前は味方
AIの開発を始めた。まずAIが特定の地点にユニットを移動させるようにした。これはプレーヤーがマウスクリックで座標を指定してユニットを移動させていたプロセスから、マウスクリックを省いただけの代物である…

2012年11月25日日曜日

【Unity】RTS:遠隔攻撃の付与

矢を目標に放っているところ
大部隊構想はもろくも敗れた。演算に負荷がかかりすぎるのだ。しかたがない。
ユニットが矢を放てるようになった。これでユニットのスクリプト開発はひと通り完了したことになる。これまでの開発でユニットは以下の様なことが可能になった。
  • 指定された座標への移動
  • 障害物を回避する
  • 近接、間接攻撃
  • ダメージ計算
これであとはAIを実装すればゲームとして機能するようになる。尤もそのAIが一番の関門なのだが。

さて、とにかくもここまで来ればどんなゲームを目指して開発をしているのか表明することもあながち場違いではないと思う。

ゲームのコンセプトアート
ゲームを作る上で最終的に目指しているのは第2次大戦モノのRTSだが、その前段階として戦国時代の合戦のRTSを作る予定だ。シングルプレーでAIと対戦する。足軽や鉄砲隊が登場するだろう。で、女の子でもおじさんでもいいんだがここぞと云う時にスパロボの様にカットシーンが入る(「撃て!」とか「全面攻勢に移る」みたいな)。

来年度中に完成すれば万々歳だろう。