2016年10月30日日曜日

【Unity】 Bwars 2 (RTS) 地形テクスチャの刷新

インスタンシングでのビルボードの表示ができるようになったので、これを機会にずっと借り物だった地形のテクスチャを作って刷新した。あわせてシェーダーも改良してゲームの見た目は以前よりずっと良くなった。


 テクスチャはPhotoshopで制作した。まあ適当に画像を重ねていけばなんとかなる。畑の部分はフィルターの「水晶」が役に立った。ボロノイ図的な絵柄ができあがる。



 街を近くで見るとこんな感じ。テクスチャを工夫して街っぽくしている。遠目で見るとそれらしく見える。木はビルボードだが雰囲気は良い。そもそもあまり拡大しないゲームなので遠目で見た目が良ければ十分だ。


 夕刻の様子。今後はAIの補給がややうまく行ってないのでそれを改善する。またスコアの仕組みも実装する。スコアは頭の痛い話でどういう勝利条件を決めるかも含めて思案中。

2016年10月20日木曜日

【Unity】 Bwars2(RTS) 街と遺跡と


前回のマス目に基づく補給システムは止めてしまった。変わって各所に配置されたフラッグ周辺でユニットは補給できるようになった。従ってユニットは昼間は戦闘を行い、夜はフラッグの近くに戻ることになる(キャンプファイヤーのようだ)。
 森に続いて街も実装した。まず適当な多角形で街の範囲を決めて塗りつぶし、そこにポアソンディスクサンプリングで家を生やしている。


動的に街を生成する方法もあるが、そこまで手がまわらないので後日の課題になるだろう。あわせて前のBwarsでもおなじみの廃墟も配置するようにした。地形は生成されるごとにランダムに変わる。こうした巨大構造物を置くのは僕の好みだ。


リング状の廃墟はベジエ曲線上に並ぶようにしてある。


今後は地形による射線の遮りを実装していく。

2016年10月8日土曜日

【Unity】RTS:補給と昼夜


 補給と補充、昼夜の仕組みを導入した。戦場はマス目に分割されて、昼の時点で自軍の占領が確定する。周囲に敵がいると占領できないので敵味方が対峙する前線のマス目は中立を維持する。ユニットは補給・補充を受けるためには朝の時点で自軍のマス目にいる必要がある。従って昼間は前線の中立地帯で戦い、夜には一旦後退して自軍のマス目に戻るというのが1日のサイクルになる。


 一日の時間に応じて照明の色が変わる。UIも改善して、多言語化に対応した。ユニットをマウスオーバーするとそのユニットがリアルタイムで表示されるようした。


 さらに改善したポアソンディスクサンプリングによって木を生やした(詳しくはここ)。木はハードウェアインスタンシングで描写している。

今後は地形の生成アルゴリズムの改善、グラフィックの改善を行う予定。

ポアソンディスクサンプリング (poisson disk sampling)


ゲームで木をまんべんなく生やしたいと思いポアソンディスクサンプリング(poisson disk sampling)を利用しようとしたが技術がないのでアルゴリズムの短い論文を読んで実装するのに非常に時間がかかったので、ここに要約を書こうと思う。ポアソンディスクサンプリングとは点同士が一定以上の間隔を保って面を覆うために使われる技法で、間隔を調整することで濃淡から絵を描くこともできる

論文の要旨

確定した点のリスト、将来性のある点のリスト、及び2次元のグリッドを用意する。確定した点のリストには最終的に出力される点、将来性のある点のリストにはその点を基準に更に点を配置できる点が入る。グリッドは点同士の距離を計算する際に計算を簡略するために用いられる。点同士の最低間隔をrとする。

1 まずランダムな点を1つ生成する。これは直ちに確定した点のリストに入る(1つ目の点だから)。同時にこの点は将来性のある点のリストにも入る(周りにはまだ1つの点もないのでこの点を基準に新しい点を生成できる可能性があるから)。 確定した点はグリッドに登録し点同士の距離の比較に備える。
2 この点を基準点とする。この点の周囲半径r~2rのリングに収まる範囲に新しい点を生成する。この点とすべての確定した点との距離を計測し、間隔が小さすぎれば(グリッドを利用し計算を簡略する)その点を破棄する。確定した点たちと十分な間隔がある点は確定した点リストおよび将来性のある点リストに入りグリッドにも登録される。こうしてリング内に均等に点を生成し続ける(10~30回程度)。この試みの後、もしリング内に生成した点がすべて確定した点たちとの間隔の不足から破棄されていれば基準になった点にはもう将来性がないということなので、この基準になった点は将来性のある点リストから除かれる。
3 次の基準点は将来性のある点のリストの最後尾にする。そうしてまた2の処理を行う。
4 将来性のある点リストがカラになるまでこの処理を繰り返す。

この方法で素早く点を生成しゲームで指定範囲内に木を生えさせた。


 この場合点は白黒のテクスチャ上で黒のエリアの部分に生成されている。黒の部分が複数あり互いに白で隔てられている場合、アルゴリズムの特性上一つの塊の黒の部分でしか点が生成できない。そこでまず大雑把に全体に点を生成し、その各々の点を基準に2度目の点を生成することですべての黒の塊に点を生成している。