2016年4月19日火曜日

【Unity】RTS:前線の拡大縮小



形成される前線点への戦力の割当を改善した。パラメータによって前線の位置に応じて戦力の分配度を調整できる。これで例えば前線が自陣に近い時は戦力を集中して守りを固め、遠い場合は戦力を分散して半包囲攻撃を目指すというようなことができる。あわせて前線の位置から前線の幅も変わるようにした。前線が中央にある時は下の写真のように幅が広い(丸い点とそれを結ぶ線が前線)。


 一方でどちらか片方に前線が偏ると幅が狭くなる。このため守備側も攻撃側も無駄なく戦力を集中することができる。


こうしたパラメータは変更可能なので指揮官ごとに性格づけることができる。

 前にも書いたかも知れなけど、指揮官AIの状況判断は各ユニットからの情報を吸い上げて分析した情報で判断する以上、どのような処理をどのタイミングで実行するかがとても大事になる。そのため1ユニットに至るまでどのような処理を実行するかは中央で管理したほうが都合がいい。これはスター・ウォーズでの司令船とバトルドロイドの関係に似ている。大局的な判断はドロイドから収集した情報を元に司令船が行い、ドロイドはその命令に応じて個々の処理を行う。司令船が破壊されるとドロイドは動かなくなる。

 いまAIは指揮官AIとユニットのAIの二つがあるが、実際にはユニットは数個で1つのチームとして扱われているのでチームAIを新たに作り指揮官AIの一部の権限を以上することを考えている。こうすることでよりチームが一丸となって行動できるが、一方でユニットの行動により深く介入することになるので、ユニットAIとの機能衝突が起きる可能性が高くなる。

2016年4月9日土曜日

【Unity】RTS:地形など


 前回から手動で拠点を設定し(まだ手動)前線点がそれに引きずられるようにした。またマス目ごとに地形を規定するようにした。緑の部分が森を示している…たぶんそこに木が生えるようなるだろう。地形を捜査するメソッドも実装してユニットは一定距離内のある程度定まった方向の地形をスキャンできるようになって防御に適した地形を発見できるようになった。今後はユニットが移動目標地点を予約して混雑を防ぐようにする。



2016年3月29日火曜日

【Unity】RTS:前線への部隊配備


 前回の両軍の影響範囲を計算するマップを使って前線を設定し、ユニットを配置することに成功した。ユニット情報が更新されると影響マップ作成され、各指揮官AIはそのマップをもとに適当な数の前線点を設定する。前線点の位置に応じて要求戦力が決められ、優先度の高い前線点から複数のユニットから構成されるチームが割り振られていく。下の写真では左からのブルー軍と右からのレッド軍がマップ中央で対峙している。ブルー軍のほうがやや戦力が優越しているので影響範囲が広い。


しばらくするとレッド軍が優勢になりブルー軍を追いやってしまった。


 戦術の決定の仕方も改め、まず指揮官AIがチームの状態を確認した上でチームごとに一番攻撃的な戦術の上限を決定して、ついで各ユニットが自身の状態に応じてチームの戦術の上限を超えない内で戦術を決定して振る舞うようになった。これで一応AIによる最低限の作戦行動が可能となった。

 現在は両軍の戦力とその位置によってのみ前線が決定しているので、今後これに地勢上の拠点による重みを加味するように改善していく。

2016年3月23日水曜日

【Unity】RTS:戦況マップ


このあたりを見ながらほそゞゝとAIが判断材料とする戦況マップを実験している。青丸と赤丸が部隊の位置で距離に応じて影響度が低下する。黒い部分は両軍の影響力が拮抗しているか、ない場所を示している。基本的に黒い戦線が遠ければ進軍する…という方法がとれそう…と考えている。

2016年3月12日土曜日

【Unity】RTS:AI


 引き続きAIを作っている。撤退したユニットが司令部近くで回復できるようにしたのでAI同士の軍勢が押し合いへし合いするようになり見ていて面白くなった。 近い目標地点には微速で移動しながら回転したり、退却時の移動を最適化。ここに来てこつこつ作っていたユティリティクラスが役に立ち始めた。例えば指定地点まで移動するのにかかる時間を返す関数は複数の移動先の選択肢から最適なものを選んだりするのに幅広く役立っている(単に距離をスピードで割っているだけだが)。他にもある地点は何時方向になるだの、何時方向にいくら移動した地点はどこだのといったことを調べる関数が役立っている。戦術的に正しい動きを実装する上でストレスなくアイディアを表現できるのは嬉しい。
 当然といえば当然だが、機能と思考を徹底的に分離して実装することが大切だと常々感じるようになった。例えばシャーシクラスはユニットの移動を担当するが、あくまで目標地点まで円滑に移動するだけの機能しかない。ユニットがダメージを負って退却するのを命令するのはユニットAIクラスだ。またシャーシクラスには近隣の味方を発見して回避する関数があるが、自身で発火させることはない。これもユニットAIクラスが適切なタイミンで発火させる。もし自動で回避するようにしていたら敵前で横っ腹を向けるような運動をしかねないからだ。このように各機能はあくまで命令を与えられた時のみ稼働して最適な方法で目標を達成することにとどめ、一つの思考をもったクラスで各機能を集中管理・使用するのが望ましい。

2016年3月8日火曜日

【Unity】RTS:AI


 Behavior Designerを使ってビヘイビアツリーによるAIの実装を始めた。AIは指揮官AIとユニットAIに分かれている。まずユニットAIでステータスのリセット、ヒットポイントや攻撃してくる敵の火力などの状況に基づいたステータスの更新を行う。次に指揮官AIでユニットAIのステータスを確認した上で戦術の基本方針―攻撃・防御・撤退―を決定する。最後にユニットAIが指揮官AIの決めた戦術に従って行動を起こす。これを1ルーチンとして定期的に実行される。今日で一応AI対AIの戦闘ができるようになった。上の写真ではブルー国とレッド国がそれぞれのAIに従って戦っている。ときどきフシギな振る舞いが観察される。

ツリーのデザインはオンラインでチャートを作成できるCacooを使って先週の金曜に設計した。指揮官AIは指揮下のユニットを幾つかのチームに分けて運用することができる予定であり、今後はチーム運用の機能を実装していく。

2016年3月3日木曜日

【Unity】RTS:AIとナビメッシュ


ユニットにナビエージェントをくっつけて障害物を避けれるようにした。また個々のユニットの処理の開始は最上位クラスの委員会で集中して取り扱うことにした。委員会は全ユニットにまず索敵から攻撃目標のタレットへの割り振りを実行させた後、AIに思考させる処理を定期的に実行する。ユニット単体では行動を実行する仕組みを持っているが発火させる者がいないのでなにも出来ない。この仕組を使うことでAIは最新の索敵データを利用できることが保証されている。
 AIは現在のところユニットに搭載され索敵の評価や退避などを行うユニットAIとユニットの集合体を指揮する指揮官AIの二つがある。AIにはビヘイビアツリーを利用する予定だ。少し変わっているのはプレーヤーの操作するユニットにもAIがあることで、これは実際にユニットを動かすことはないが、敵味方のAI同士が交信してより的確な戦術決定を下す助けになることを狙っている。これは別にプレーヤーが不利になるということではない。このゲームには戦場の霧はないし、あったとしてもその場合はAIが共有する情報に適切な制限をかければいいだけだ。