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秒以内には収めたい。

2017年7月18日火曜日

【Unity】RTS : Bwars2 ゲームのルール

 地形やセクターの生成ができるようになったので、今はユニットの性能を基本の値から上下させるブーストシステムを作っている。このブーストの例としてはあるセクター内のユニットの移動速度が上昇したり、特殊ユニットの近くにいるユニットの武器の命中率が上昇することなどが挙げられる。ブーストは基本的にある条件を満たす場合のみ適用され、条件が満たされなくなると効果は取り除かれる一過性のものだ。これはなかなか難しいもので旧プロジェクトでも実装時にあれこれ考えたことがある。上の例に沿うとあるユニットがあるセクターに入ったときに速度を上昇させ、出ていったときにその上昇分の速度を取り除く必要がある。そこで今回はブーストのチケットを発行し、適用対象のユニットに渡して以後条件が満たされ続ける限り同じチケットをユニットに渡し続ける仕組みを考えた。ユニットの方としてはチケットを初回に受け取ったときにブースト効果を適用するとともにチケットを保存し、以後同じチケットが来る限りなにもしない。チケットが来なくなったら保存していたチケットの効果を取り除きチケットも破棄する。この仕組によって後に書くようなセクターやヒーローによるブースト効果の仕様を実現しようと考えている。

 前回のプロジェクトが破綻した理由の一つは制御系と操作系のプログラムがくっついてしまったことだが、他にも大きな要因としてゲームのルール・方向性が決めきれなかったことがある。今回いろいろ考えて、新しく以下のような仕組みで行こうと考えている。

セクター
セクターは戦場を複数のエリアに区分けられたもので戦場のあらゆる地点はどれかのセクターに属している。セクターでは補給物資が産出されるが、あまりの多くのユニットを1つのセクターに配置すると補給物資を食い尽くしてしまい、ユニットは行動にペナルティを受ける。1つのセクターは1つのコントロールポイントを持つ。コントロールポイントにユニットを移動させることでセクターを占領でき補給や戦闘などでセクター内の友軍ユニットがメリットを受けることができる。

エース
前プロジェクトでは指揮官は複数のユニットを管理する立場としたが、今回は1ユニットを指揮するエースとしての立場を考えている。位置づけとしてはWarcraftのようなヒーローユニットのように自身の戦闘や周囲のユニットになにかしらのブーストを与える。ユニット自体をエースとしてもいいが、キャンペーンを想定した場合ユニットの技術ツリーなどを考えないといけなくなるので、あくまであるタイプのユニットに搭乗(指揮)できる独立した個人を考えている。例えば第2次大戦でティーガー重戦車で多くの戦果を上げた戦車乗りオットー・カリウスを考えたら分かりやすいだろう。

勝利条件
勝利条件はいくつか設定できる。代表的なものはスコアでユニットの撃破やセクターの占領維持で得られるスコアで相手を上回ると勝利となる。他には特定セクターの占領や特定ユニットの撃破が条件になる。勝利条件がスコアのみ場合は様々な方法でスコアが稼げるのでいろいろな方法で勝利が狙えるようになるだろう。


2017年7月12日水曜日

【Unity】RTS:Bwars2 外部からの火器管制


動的にユニットと地形を生成し、移動・戦闘が出来るようにした。今回のプロジェクトの一番重要な目標はコアとなるクラス群は必要最小限のゲーム進行しか担当しないということにある。これは地形の生成においては地形データを画像を始めとするデータを与えることで仕組みで叶えている。上の写真は予め準備した画像を与えて地形を生成させた結果を示している。コアクラス群において地形のデータ自体を生成することはない。ユニットの生成についても前回の投稿の通りJSONデータにより生成しているがここで少し詰まった。当初、最初にユニットの雛形を作成し、ユニットが必要になった時点で雛形をInstantiateしてユニットを複製する仕組みを作った。ユニットの基本性能値はユニットの種類ごとにおいて共通だから別途MonoBehaviourを継承しない普通のクラスで性能値を定義し、個々のユニットを管理するクラスに紐付けることで個々のユニットの性能を定義しようとした。しかしInstantiateはコンポネントしか複製しないようで、雛形でユニットの管理クラスに紐付けていたはずの性能定義クラスはそのユニットの複製品ではリンクが切れていた。仕方がないので複製後に性能定義クラスを紐付けることにした。


 今回コアクラス群では最低限のことしかしないのでユニットのどの武器を使ってどの敵を攻撃するかは別途命令してやる必要がある。ユニットの管理クラスは攻撃面においてはユニットが所持する武器と補足した敵の情報を与えるメソッドと個々の武器に攻撃目標を割り当てるメソッドを提供しており、これを利用して攻撃の指示を出すことが出来る。本プロジェクトでは必要な情報を提供し、命令を受け取る機能を用意すればコアの外部からでも十分操作可能であるはず、という考えを採っている。そこで攻撃範囲に入った敵を攻撃するというパッシブな外部AIを作成してうまく動作させることが出来た。これは前のプロジェクトではユニット管理クラスに内蔵されていた機能で、このために操作と処理の機能が混ぜ合わさりどうにもできなくなっていたが、本プロジェクトではそれを分離し操作は外部からすべて行うことで解決しようとしている。この火器管制AIの成功は本プロジェクトの指針が正しいこと示しているように思える。

2017年6月27日火曜日

【Unity】RTS: Bwars2 新しいプロジェクト

 Bwarsの開発は以前は力強く、いまもよちよちと続いている。いい知らせもある。以前のプロジェクト「バターチョコレート」に変わって新たに「レッドパイ」プロジェクトが始動した。バターチョコレートの膨大なコードはいっさい捨て去られ、レッドパイの綺麗な鼻がカーテンから突き出ている。―つまり、いちからBwarsを作り直している。


 バターチョコレートの死は避けられなかった。ユニットの制御系スクリプトとそれに指示を出す操作系スクリプトがぜんざいの餅と小豆のように融合して分離は不可能だった。シナリオの演出は出来ない。動的にユニットを組み立てる仕組みも貧弱でユニットの追加には対応できそうにもなかった。
 レッドパイはこうしたことへの反省をもとに制御系と操作系を明確に分離している。制御系への指示は特定のプロトコルで窓口を通さないとできない。バターチョコレートでは制御系のスイッチをオンにすると魂がないのにさまようお化けのようにユニットが動いていたがレッドパイではオンにしても明確に指示しない限り指一本動かない。ユニットも動的に組み立てる仕組みを最初から前提として組み込んでいる。下の写真はJSON設計データをもとにメッシュだけのゲームオブジェクトにスクリプトを適切に貼り付けてユニットになった戦車を示している。


2017年3月13日月曜日

【Unity】RTS:Bwars 2 戦術ヘクス


 ボードゲームではおなじみのヘクス(六角形)の仕組みを導入することにした。ヘクスはルート検索やユニットの影響力の評価に使われる、地形上の最小単位となる。これを戦術ヘクスと呼ぶ。ただしAIの処理の関係上より大雑把な戦況の評価に用いるには戦術ヘクスは小さすぎるので戦術ヘクスを集めたより大きな統合戦術ヘクスも実装した。マップ全体を区分けするゾーンはヘクスの導入以前に作っていたものでヘクスとは関係がないので両者を関係づけるのに相当苦労した。上の写真では2つのゾーンにまたがる戦闘が発生し、戦闘地域に指定された統合戦術ヘクスが表示されている。この戦闘地域内の統合戦術ヘクスに属する戦術ヘクスのなかでのみユニットは展開・移動ができる。基本的には戦闘グループのAIが管理下のユニットに統合戦術ヘクスへの移動を指示して、各ユニットのAIが指定の統合戦術ヘクス内のどこの戦術ヘクスに移動するか決める仕組みにする予定だ。

2017年2月21日火曜日

【Unity】RTS: Bwars2 戦略モード


戦略モードにおけるターン制の基礎部分が実装できた。戦略モードでは両軍はそれぞれの戦闘グループをゾーン単位で移動させることができる。一つのゾーンに2つ以上の戦闘グループは存在できない。ただし敵がいるゾーンには現状だと複数の戦闘グループを送り出せるので攻撃側が有利になっている(防御側は常に1戦闘グループ)。これについては防御側に恩恵を与えるなどの改良が必要かもしれない。移動は各戦闘グループに設定されるイニシアティブが高い順に行われる。このあたりはターンベースのタクティカルゲームによくあるものだ。一つのゾーンに敵味方が移動しようとすると戦闘が発生する。戦闘は複数ゾーンで発生する可能性があり、戦闘を開始すると戦術モードに移行しリアルタイムでの戦闘となる。
 AIは戦略モードでの移動について影響マップを利用し戦闘グループの移動先を決定している。上の写真では左側中央あたりに青、赤軍の戦闘グループの望ましい移動先が優先度順に緑の濃淡で示されている。

2017年2月11日土曜日

【Unity】 RTS :Bwars2 戦略モードと戦術モード


 マップを動的に幾つもの区画に分割する偽のボロノイ図の試験的な実装はうまくいったので、ゲームの新しい要素として戦略モードと戦術モードを導入する大きな改修を始めた。戦略モードはターン制で「戦闘グループ」と呼ばれる戦闘部隊の集合体を動かし、戦闘が始まると戦術モードに切り替わりリアルタイムの戦闘となる、RTSでよく見られるルールだ。現行のルールだと撤退や補給などの概念が生きにくいと感じたのでターン制の戦略モードを盛り込むことにした。これにより燃料や支援砲撃などの仕様も持ち込みやすくなる。
 このモードを盛り込むために区間単位の情報に基づいた戦闘グループの効果的な移動を研究していて、要衝や戦闘力に基づく影響マップによって各区画のポイントを計算し魅力的なポイントを持つ区画に移動する仕組みを仮実装した。上の写真では上段に様々な影響マップが表示され、下段に各戦闘グループにとって魅力的な区画が緑の濃淡で示されている。かなり大規模な改修になるので3月中旬のアップデートを目指しているが遅れる可能性が高い。

2017年2月5日日曜日

【Unity】 RTS:Bwars 2 偽のボロノイ図


いくつかの目的のためにボロノイ図を生成する機能を実装した。ボロノイ図とは簡単に言うと平面上に基準点を設置することで平面を基準点の数だけ分割し区画別に色分けた図である。
 もっともほんとのボロノイ図を作るには時間がかかるので、今回は基準点を起点に周りに色を塗り始めどんどん塗り広げて他の基準点の色と隣り合った時点で塗りをやめるという手法にしている。CPUをぶん回しているので処理は早くないが200 * 200ピクセルほどならすぐに生成できる。上の図はポアソンディスクサンプリングにより生成した基準点を与えて生成している。ボロノイ図っぽく見える。
 この図の生成時にそれぞれの区画のデータ、つまり区画の中心点(基準点)、区画の範囲(座標の配列)、区画の境界線(座標の配列)、隣接する区画のデータを生成している。この区画のデータを利用して地形の塗りつぶしを行ってみた。従来の地形生成に比べるとやや角ばっている。



 いまのところあまり見た目は冴えないがボロノイ図を利用したランダムな地形の生成の手法をおいおい適用できる準備が整ったといえる。隣接した区画のデータもあるので経路探索への利用も期待できる。
 一番期待しているのは「戦域」への利用で、これは地図上に戦域という区画を設置してAIの戦術決定の基準とすることを目指している。イメージとしてはCOHのマップが近い。


 ひとつの戦域には一つの中隊しか入れないなど制限を設けることになるだろう。AIの戦況評価も戦域が基準になる。つまりAIを大改造することになるということだ。これはやりたくないが避け得ない作業である。

Bwars2のダウンロードはここ

2017年1月30日月曜日

Bwars2 ダウンロード



2017/6ごろからまたいちから作り直しています。ここにあるのは旧版です

Bwars2はウォーシミュレーションゲームでプレイヤーは指揮官として地図上のユニットに指示を出して敵軍を攻撃して敗北させることが目的です。
遊び方はダウンロードしたフォルダに内包されているHelpを確認して下さい。
フィードバックはメールまたはブログにコメントをお願いします。

Bwars2 is war simulation game you command your units on map as a commander and defeate enemy units.
Please read Help included in downloaded foldar for how to play.
You can send feedback by mail or commenting on blog.

動作環境 / System Requirement 

 Windows  32bit / 64bit  解像度1920*1080以上
(Mac : 準備中!coming soon!)

ダウンロード / Download
ベータ版 Beta_1 ver





2017年1月2日月曜日

Bwars2 Support


Bwars2でバグを見つけたりゲームについてアイディアがあったらこのページにコメントしてね。
Please comment this page, if you find a bug or have ideas about the game.