2017年10月17日火曜日

【Unity】RTS Bwars2 UIの実装の続き


多少UIのデザインを考えたのでUIの実装をしている。その一環で地形上のセクターの境界に線を引くように改良した。またいくつかユニットの種類も増やした。ユニットの追加はユニットを3Dモデルからイメージに変えたので、もともと動的にデータからユニットを生成する仕組みと相まって比較的容易だ。一方でどうしても3Dモデルの臨場に比べると迫力の無さは否めない。ユニットのイメージは描く予定でいま絵を練習している。この後もう少しUIの実装に努めたところで再度AIの改善に戻るだろう。その前にはユニットや地形などもろもろの設定を一度きちんと決めてやる必要がある。その情報を使ってAIがもう少しマシな判断が下せるように助けるようにしよう。


2017年10月4日水曜日

【Unity】RTS Bwars2 地形とUIの実装の開始

前回行っていたクラスの再編成が完了した。クラス大きく分けてゲームの運用を行うGame空間とゲームの情報から戦術判断を下し命令するAI空間に二分された。両空間は疎結合でAI空間からGame空間に指示を出してユニットを動かすことに成功した。上の写真はAIが指示したユニットの移動先や敵ユニットの予想位置を赤青のシンボルで示している。
 これで一応ゲームは動くので外見上の改善に手を付け始めた。ひとまず旧プロジェクトから回収したコードを使ってマップに木を生やした(同じく上の写真)。次にユニットのシンボルを実装しようと思う。下の写真はイラレで作成したデザインの案だ。



ユニットのシンボルは距離によって変更する予定だ。より近づくとシンボルから具体的な絵や写真に変わる。ひとまず遠目から見たUIを実装して満足しよう。

2017年9月16日土曜日

【Unity】RTSゲーム Bwars2 クラス再編成

戦術AIがユニットの配置とセクターの制御点の占領ができるようになった。これで(一応)ゲームが可能になった。そこでこの機会に現状のクラスを再編成しゲーム運営部分とAIの完全な分離を目指し始めた。クラスは名前空間Game, Agent, AIのいずれかに所属するようになる。Gameはユニットの移動や攻撃の命中判定などゲーム全般の運営を行う。AgentはGame空間からユニットの位置などAIの判断に必要な情報を吸い出してAI空間に渡す。AIは受け取った情報を元に決定を下し、Agent空間に決定事項を伝達する。Agentはその内容をGame空間に命令する。GameとAIの間にAgentをかませるのは将来的にAIは外部アプリケーションに任せてBwarsから完全に独立させようとしているからだ。こうすることで誰でも彼でもAIのカスタマイズが可能になる。この再編成は最高に面倒な作業だ。

2017年9月5日火曜日

【Unity】RTSゲーム Bwars2 戦術AIの実装


 前回各セクターにユニットが配られるようになったのでセクターごとに与えられたユニットに指示を出す戦術AIの実装を始めた。戦術AIは与えられたユニットを効果的に利用し戦闘を有利に進めなければならない。戦術AIの仕事は究極的には1つしかない―ユニットに任意の場所への移動命令を出すことだ。そのためおおまかに2つの演算を行う。1つ目は敵ユニットの位置の予測で、2つ目はその位置に対する効果的な味方の配置場所を計算することだ。1つ目については隣り合うセクターの支配権や実際に確認されている敵に応じて候補地(理想的にはセクター全域が対象となるが演算コストの理由から相当間引いている)にスコアを与えスコアの高い順から敵予想値位置とする。2つ目は味方ユニットの現在位置と移動速度、敵味方の攻撃範囲の内外などの要素から同じくスコアにより移動先位置を決定する。上の写真では敵の予想位置に球体が置かれている。決して現状精度が高いものではない。しかしプロセスは正しいと感じている。ゲームの他の部分との開発と二人三脚でAIもよりましなものに変わっていくだろう。

2017年8月30日水曜日

【Unity】 RTS : Bwars2 ユニットをセクターに送り込む


 前回AIがセクターごとに戦力の配分を決定できるようにしたので、その戦力配分に従い管理するユニットを実際に各セクターに派遣できるようにした。セクター無担当のユニットからセクターが割り当てられていく。戦力配分は随時更新されるので戦力要求に対して過剰なユニットを抱えるセクターはユニットを「クビ」にする。クビになったユニットは別のセクターが割り当てられてそこに向かう(Bwasは優しい世界なのだ)。敵が担当セクターにいる場合は当然戦闘になる。いまのところユニットはセクターの制御点を目指すので戦術も何もないが、これでセクターの奪い合いができるようになった。上の写真は同じセクターで鉢合わせした敵味方のユニットの戦闘の様子を示している。

 上の写真を載せててアレだが、ユニットは3Dモデルでなく絵(シンボル)にしようと考えている。モデルを作るのは大変な手間で1つのモデルを作る間に同じクオリティの絵が10枚はできる。加えてモデルは戦闘時の効果の設定(例えばモデルのどの部位から砲火が生成されるかなど)やアニメーションまで含めると大変厄介だ。もちろんモデルを使用した場合の臨場感・迫力は素晴らしい。でも個人のリソースでは市販のゲームには敵いっこないのだ。また今回はmodの利用を前提にしている。Rimworldなどのmodを見て思ったのはちょいちょいと絵を描いてちょいちょいとxmlを書いてできるような手軽さが理想的と感じた。モデルを利用した場合作るのも読み込む仕組みを作るのもとても手間がかかってしまう。シンボルのデザインはまだ考えていないが多分カメラの距離の応じてシンボルや兵種の表記が変わるようになるだろう。

 現状ではセクターごとの戦力の配分しか決められないので各セクターごとに戦術AIが思考し担当セクターに与えられたユニットを効果的に使えるようにする必要がある。ここはいま仕組みを考えているところだ。話はそれるが考えを練るときにMacではOmni Outlinerを愛用していたがWindowsでは気にいるものが見つからなくて諦めていた。しかしあらためて探したところUV Outlinerという良さそうなソフトが見つかり最近利用し始めた。とても使いやすいソフトだ。


2017年8月21日月曜日

【Unity】RTS Bwars 2 : セクターごとの戦力の割当


戦場を区切るセクターごとにどの程度の戦力を割り当てたらいいか計算する仕組みを実装した。ここでの戦力とはユニットのコストのことでコストが高いユニットほど強いという前提に立っている。この戦力の割当に応じて全体を管理する戦略AIが管理下のユニットの担当セクターを決めていく。さらにセクターごとの戦術AIが割り当てられたユニットをうまくつかってなんとかする。

戦力の割当は大まかにまず当該セクターとその隣接するセクターの支配陣営を調べて安全度を算定し戦力を分配する。そのうえで更にセクターごとの彼我の現在の戦力に応じて調整を行う。この調整についてはデバッガーを作成し、テストデータを入力・保存できるようにした。特に保存は重要で似たようなテストを繰り返すのでそのたびにいちから入力していると大変な手間になる。

戦力の割当に基づくユニットの担当セクターの割り当てはデリケートな問題だがひとまず要求戦力に比して現有戦力が少ないセクターは近い無担当ユニットから割り当てられていくように今実装している。

新規まき直しからの目標である制御系と操作系の明確な分離の原則に従いAIが処理で必要な情報は直接ユニットやセクターのクラスに書き込まず、別途完全に独立したクラスで管理するようにしている。


2017年7月28日金曜日

【Unity】RTS : Bwars 2 ゲームループ

 
死んだ戦車が黒色になっている

セクターを実装し、データファイルから生成されたセクターの制御点にユニットを置くとセクターを占領できるようにした。まだ効果はないが産出するスコアや補給量の指定もできるようになっている。またデバッガークラスを開発して様々なクラスから気軽にギズモやテキストを表示できるようにした。これは今後の開発に役立つだろう。
 
セクターごとの制御点の有効範囲が赤の円で示されている

 ゲームループ(ゲーム中に実行される定期的な処理)は3つに落ち着きそうだ。一つ目はごくごく普通のUnityの毎フレーム呼ばれるUpdateでここでユニットの移動や砲塔の回転などを行う。二つ目は1秒毎に実行される処理でセクターの占領状況やスコアの更新を行う。最後が不定期な処理でここでは全ユニットのステータス更新・索敵の実行とその最新の状況を分析したAIによる指揮処理を行う。不定期なのはAIの処理が終わるのを待って次の更新を行うからだ。このAIの処理は別スレッドで実行している。今のところパッシブな役割の火器管制AIのみだが、これに能動的にユニットを動かすいわゆるゲームAIが加わるので処理時間は長くなるだろうがそれでも1秒以内には収めたい。