2018年7月19日木曜日

【Unity】RTS Bwars2 至近の課題

Bwars2開発にはやるべきことがたくさんあるが、至近のやることは3つある。それは射撃処理の洗練化、地物の生成、道路だ。


射撃処理の洗練

射撃は今は1つの砲弾ごとに命中・ダメージ判定を行っているが、高レートで連射した場合処理負荷が集中する可能性がある。例えばシルカ対空戦車は機銃を4門装備し一斉に射撃すると毎分数千発を射撃することになり、1秒あたり50発以上を発射する。これ1発1発について命中を判定しダメージを適用するのはあまり賢くなさそうだ。そのためある程度ゴマカシが必要になる。

そこで一定時間内に発射される砲弾をまとめて1つの砲弾として扱う。(まだ手法は考えていないけど)処理を一括して行うことで負荷の軽減が見込める。 この方法は弾の着弾地点が1箇所になる欠点がある。つまりきちんと1発ずつ計算していいれば複数弾の着弾地点はバラけ、様々な場所のユニットにダメージを与える可能性があるがこの方法では範囲が限られてしまう(その分範囲内のユニットには複数弾の合計されたダメージが入る)。そのためあまり多くの砲弾をまとめるべきではない。一方で簡略化は避け得ないのでやむを得ない方法だ。

また砲弾の処理に用いる入力パラメータを使い回すことでも処理を軽減できる。厳密に言うと敵味方のユニットが移動している場合、距離などのパラメータは刻一刻変化するので砲弾の発砲ごとに最新のパラメータを入力して命中判定などを行うのが望ましい。しかしパラメータの変更は計算のやり直しを招く(判定のしきい値がその都度再計算必要になる)。そのためある程度の時間内は同じパラメータを続けて使用するようにする。もちろん時間が経過することに状況は変化するのでなるたけ短時間の使用が望ましい。この同じパラメータを利用する連射を同一射撃と言うことにしよう。同一射撃時間は例えば1秒とする。この場合1秒の間はたとえ目標が破壊されたりロストしてもとにかく同じパラメータを利用して撃ち続ける。そして射撃開始から1秒後まだ目標が有効であり、かつリロードなどもクリアしていれば最新のパラメータを取り込み再び1秒撃ち続ける(パラメータは別のゲームループで更新されているので前回と同じ場合もありうる)。この場合見た目上はひたすら計算を行い連射しているように見えるが実際には1秒毎に計算が行われていることになる。同一射撃時間はそのままクールダウン時間となり、射撃開始後、同一射撃時間内は新たな発砲はできない。

以上2つの方法を用いる場合、射撃レートごとに以下のように利用することになる。

・高レート
同一射撃を開始する。例えば100発を同一射撃時間内に発砲するとしよう。それを25発ごとに1つの砲弾として同じパラメータを使って処理を行う

・低レート
同一射撃を開始する。4発を同一射撃時間内に発砲するとして、個々の砲弾ごとに同じパラメータを使って判定を行う。

・単発
戦車砲など毎分10発前後の場合は同一射撃終了後、リロードを挟んで再度射撃を行うことになる。

こうした処理を行うために、射撃制御クラスを作る。各ユニットの武器クラスは同一射撃時にパラメータを制御クラスに渡しあとはお任せすることになる。


地物の生成

今は地形の特性はテクスチャに描かれた図形で表現されているが、やはり立体のほうがいい。ただしBwarsは低スペック・旧PCにも対応したいのでGPUをブン回して描写を行うことは避けたく、またユーザーが手軽にmodを作れることを目指しており、加えて基本的には遠くから俯瞰しながらプレイするゲームであることから地物はとても簡略した描写に抑えたい。市街地や森ではたくさんの建物や木を並べて高密度さを表現したいがGPUインスタンシングでも数が多いと負荷は馬鹿にならない。そこでこうした高密度オブジェクトは連続したポリゴンを生成し描くようにする。これはGoogle Mapの3Dと同じような感じになる。郊外や茂みなど低密度な地域は一つ一つ地物描くようにする。ポリゴンの生成とLOD処理が課題になる。また地物ポリゴンが省略された場合でも自然に見えるマップテクスチャの生成も必要だ。


道路

個人的には道がないテラインは梅干しがない白米みたいだと思っていて、道路の実装は必須だ。道路はノードで定義され、各ノードは座標と接続ノードの情報を持っている。課題がいくつかある。1つは道路のノードの編集で、エディターなどを整備しないといけない。また実際にノードから地形に沿って目に見える道路を生成する必要がある。これには橋やトンネルも含まれる。最後に道路を全体の経路探索に組み込み、ユニットが道路に対応し道路上を移動できるようにしなければならない。課題は多いがRTSゲームではコンプレックスな道路の実装は少なく(せいぜい川に橋がかかるだけ、都市系シムと比べると特に見劣る)、実装できればマップの表現や戦術に新しい光を当たることができるだろう。


2018年6月26日火曜日

【Unity】RTS Bwars2 ベータ版ver3 公開


ベータ版3を公開しました。

https://sites.google.com/view/bwars2/%E3%83%9B%E3%83%BC%E3%83%A0/%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89

・士気の実装。士気はユニットアイコンの枠線で示され、低下するとユニットが逃亡する。
・アタックムーブの実装。Qキー+左クリックでユニットは移動を行い、途中攻撃範囲に敵が入ると停止する。
・AOE(範囲ダメージ)の実装。いくつかの攻撃は着弾地点周辺のユニットにもダメージ・士気の低下を及ぼす。
・新ユニット特殊部隊追加。3つの武装を持ち、内グレネードランチャーは士気を低下させる効果が大きい

2018年6月12日火曜日

【Unity】RTS Bwars2 ベータ版ver2 公開


ベータ版ver2を公開しました。


・視界システム・戦場の霧を実装
・地形による遮蔽:射線や視界は地形で制限される
・新しいユニットスペック

2018年5月20日日曜日

【Unity】RTS Bwars2 ユニットパラメータの刷新


嫌で仕方がなかったユニットのパラメータの仕組みを刷新した。攻撃力や移動速度などユニットのパラメータはJSONで指定できるが、以前からあまりいい設計と感じていなかったので変える必要があった。今回の変更で例えば攻撃力はターゲットの防御属性の種類の数の分存在することになった。別の例では射程距離と命中率も回避属性分存在(車両とか飛行機とか)する。この変更をしたくなかったのは設定読み込み処理の加えて火器管制AIや対戦AIなど広範囲な修正が必要だったからだ。しかし避け得ないことだった。

また数時間を費やして汎用的で視覚的なデバッガも改良して以前よりゲームの状態を掴めやすくした。上の写真ではAIが適切と考えるユニットの配置場所が立方体の大きさで示されている。

2018年3月21日水曜日

Bwars2 アルファ版2公開


アルファ版2を公開しました。ポータルサイトも開設。

前回からの変更点
・地形の立体化(射線が地形で遮られます)
・ユーザーが地形を追加可能(ポータルサイトのそのほかを参照)

デフォルトでマップは富士山で、関連ファイルを交換することでスコットランドのマップでも遊べます。

ダウンロードはポータルサイトから
ポータルサイトはこちら

2017年12月20日水曜日

Bwars2 α版

Bwars2 α版を公開しました。ダウンロードしてプレイすることが出来ます。



重要:α版でありまだまだ開発途中まっただなかのバージョンです。バグもあり機能も未実装のものがたくさんあります。


ダウンロードや遊び方などはポータルサイトに移動しました。以下の内容は古い場合があります

・Bwars2について
Bwars2はRTS(リアルタイムストラテジー)ゲームです。上空視点から戦場を俯瞰し、戦車などのユニットに指示をだし敵をやっつけるゲームです。

【動作環境】
・Windows (Directx12推奨)
・リファクタリングもしていないので全体的に動作が重いです。5年以内のPCのならなんとか動くでしょう。Macはまだ。ごめんね。





【視点操作方法】
・一般的なFPSに同じくWASDで移動
・マウスホイールで拡大縮小
・マウス中ボタンで角度変更

【ユニット操作方法】
・青が自分、赤が敵(AIが操作)
・ユニットにカーソルをかざすと攻撃範囲を示す円が表示される。
・ユニットシンボルをマウス左クリックでユニットを選択
・マウス左ドラックで範囲選択、複数のユニットを選択


・任意の場所でマウス右クリックすることで選択したユニットにその場所に移動させる
※ユニットは攻撃範囲の敵を自動で攻撃する。攻撃目標の指定はできない。

【セクター】
・戦場はいくつかのセクターに分割されていて、セクターの中央にある円のなかにユニットを移動させると占領できる。



・セクターは味方セクターに隣接していないと占領できない。またユニットが戦闘できるのは味方セクターとそれに隣接するセクターのみ。

【収入とユニット購入】
・一定時間ごとに占領しているセクターからの収入がゲーム画面左上の資金に追加される。
ユニットを購入するにはゲーム画面左上のガテゴリー(infなど)をクリックしユニットの種類をクリックしてそのあと戦場の任意の場所をクリックする(このときshiftキーを押しながら戦場をクリックを繰り返すと資金の許す限りユニットを配置できる)


・購入したユニットは次回収入が入る時に配備される。

【そのほか】
・勝利判定はない。
F12キーでスクリーンショット。画像ファイルはBwars2_ではじまりデスクトップに保存される

【ヒント】
・基本的に森・街でユニットの回避率が上昇
・ゲーム開始時は赤軍のユニットがちょっと多い。でもAIは賢くないのでセクターを順当に占領しユニットを作り続ければ勝てる
・1つセクターにあまりに多くのユニットを配置すると攻撃速度が低下する

【今後の予定】
 * 経路探索
 * 地形の立体化
 * 地形による遮蔽、射線・視界の判定
 * ユニットパラメータの刷新
 * 火器管制システムの改善
 * AIの改善
 * ベータ版
 * 間接・範囲攻撃
 * シナリオイベント

2017年11月23日木曜日

【Unity】RTSゲーム Bwars2 エフェクトやユニット購入やAI


ささやかなエフェクト―砲火や爆発―を追加した。自分同様慎ましいので誰も気づかないかもしれない。
 セクターから収入が得られるようにして、一定時間ごとに資金に加算されて購入したユニットが戦場に現れる。上の写真でも購入用のUIやセクターごとの情報を表示するUIを確認できる。これは試み的な工夫の一つで比較的長い間隔による更新でRTSにありがちな刻々増える資金に常に注意を払いお金が貯まるやいなや購入コマンドを押す操作を軽減する目的がある。初心者にとって戦場で戦闘の指揮を行いつつ随時ユニットを追加する操作は難しい。この仕組なら一定時間内の好きなときに資金を確認し必要ならユニットを購入することができる。購入実装に伴いAIもユニットが購入できるようにした。
 戦力をセクターに分配するアルゴリズムを新しい理屈に基づいて改善した。セクターへの戦力分配は大まかにセクターの重要度と危険度で決定される。重要度はセクターからの収入や生産施設の有無で変化する。危険度はステップ数に基づくセクター間の経路探索を実装したことで敵セクターまでに経由するセクターとステップ数を調べることが可能になったので、例えば敵セクターとの間に味方セクターを挟む場合は危険度を低下させることができるようになった。実はこれまでセクターの重要度などは与えていたが、これでAIが動的にセクターの価値を測定し戦力を決定できるようになった。
 火器管制システムをGame空間に移管させた。話すと長いしつまらないのでこれは省こう。
 ユニットに属性を設定することを考えている。例えば回避率は戦車であれ装甲車であれ地形別の変化量は同じ傾向になると仮定することができる。そこでこれを属性とすることで各ユニットでは基本回避率と属性を指定するだけで手軽に各地形での回避率を設定することができるだろう。

* エフェクトの強化
    * 火器管制システム
    * セクターUI強化
    * セクター兵站制限によるペナルティ
    * ユニットの生産
    * --------------↑やった↑------------------
    * AI改善
        * セクター戦力分配
        * 地形の効果的な利用
    * ユニット駒モデル
    * LOD
    * 操作性の改善
        * UIの改善
            * ユニット選択
            * ユニット購入
    * ゲームスタート・終了機能
    * アルファ版
    * 経路探索
    * 地形の立体化
    * 射線・視界の判定
    * AIの改善
    * ベータ版
    * 間接・範囲攻撃
    * シナリオイベント

マップを大きくしたら木を描画しきれなくなたのでLODを実装する必要がある。
うまくすれば来年の1月にα版を公開できる。