久々に書きたくなったので、最近の制作状況など

前回から3年近く間が空いてしまったのだけれど
久々にネットの片隅で何かを言語化したい気分になったので
最近のゲーム制作について書こうと思う。


制作自体は色々と3年の期間の間にも行ってはいたが
あまり、形になっているのもないので
とりあえず、今作っているゲームのこれまでに作った部分やコンセプトあたりについて。

[制作のコンセプト]


  • どちらかというとリアルよりな感じの移動速度や操作感のFPS
  • 経験値を貯めてステータスを上げるような要素を入れずに
    装備の更新だけでキャラクターが強くなるようなRPG要素
  • 1つのブロックが小さめのボクセルベースの自動生成されたマップを舞台に
  • マップのボクセルを銃弾などで破壊したりと干渉できるように
  • ある程度、プレイヤーのような目的を持って行動しているように感じられるAIを持ったNPC

既存のゲーム名の組み合わせで表現すると
S.T.A.L.K.E.R + noita + 世界観がCodedArms
みたいなゲームを目指したい。

[プレイヤーの基本的な操作]


移動、ジャンプ、しゃがみ、スプリント、射撃などの操作・マップ上のボクセルの破壊


基本的な操作はどのFPSもほぼ変わらないので、特に説明する必要ない気がするので
書きたい部分だけ適当に。

・スプリントのアニメーション

アニメーション作るときに既存のゲームを色々参考にしたけど、両手をブンブン振って走るアニメーションが走っている感出ていて、いいなあということでこんな感じになった。
両手で持つライフル類とかだとまた別のアニメーションが必要にはなるけど
片手で持てる武器のときなどはこういう方向性で行きたい。

・武器の射撃精度・クロスヘアの広がり

動作やしゃがみ/立ちによって精度が変わってそれを、クロスヘアの広がりとして
画面上に反映させる、という止まっているときと動いているときで精度が変わるゲームで
よく見るシステムを自分なりに実装してみた。

・ボクセル破壊

  1. ブロックごとに耐久値を設定して着弾した位置のブロックにダメージを入れる
  2. 入ったダメージが耐久を上回っていたら余剰分のダメージを周りのブロックへ送る
  3. 1,2の流れをダメージを送った周りのブロックでも行う
というような手順でダメージの処理を行い、耐久値が0になっているブロックを破壊して
そうでないブロックは受けいているダメージ量によって色を変えつつ表示を更新。

という一連の処理を、ブロックにダメージが入るたびに行う必要があるので
処理が重くならないようにするのになかなか苦労した。

ボクセルのメッシュの生成の仕方の工夫や一連の処理を非同期処理にして
メインの部分のフレームレートに影響を与えないようにできた気がする。


[マップの自動生成]


上から見た全体図・建物内部


かなり中途半端な状態ではあるけれど、以下のような過程で生成している。

  1. 何もない地面を生成してそれを1つの区画とする
  2. すべての区画が小さすぎず、大きすぎないある程度の面積になるまで
    道を生成しながら区画を分割していく
  3. それぞれの区画に建物の外壁を生成
  4. 建物内を複数の部屋で区切り、すべての部屋がつながるようにドアを作り
    階段を生成する

サイバーパンク的なごちゃついた街並みを自動生成したいというのを
マップ生成部分での当面の目標にしているので
どんなアプローチで作ればいいかな、っていうのを考えるために
とりあえず街並みの自動生成の試作という感じだけど
今後の方向性はあまり決まってはいない。

このようなマップ生成をしようと思ったきっかけとして
steamのnextフェスで「Shadows of Doubt」のデモをやって
結構ワクワクしたというのがある。

キャラクターやマップがボクセル調で
建物や人など自動生成されるサイバーパンク世界で探偵するゲームで
サイバーパンク感のある街を建物の部屋などまで生成していて
街や建物を見て回るだけで結構楽しかった。

[参考になるかどうかわからないボクセル制作用メモ]


基本的な部分は「Unity minecraft」とかでググれば色んなサイトや動画で解説されていたり
するので、個人的に苦戦したところに関して。

  • メッシュ生成の最適化関連

しっかり理解できてはいないので、あっているかは怪しいが
頂点数を最も少なくするには同じテクスチャの並んだ複数のブロックの面を
1つの面としてメッシュにするのがいいが
同じテクスチャの面が並んでいるかの判定を2軸で行うとやや処理に時間がかかるので
多少、頂点数が増えても1軸で判定した方がパフォーマンス的にはいいみたいなことなどが
コード付きで丁寧に解説されているので良いサイト

  • テクスチャ・シェーダー関連

1つのマテリアルでブロックに応じて貼るテクスチャを変えるというのを
どんな感じでやればいいか色々見ていて、一番やりやすそうだなと思ったのが
テクスチャをTexture2DArrayにしてuvの使っていない値を利用して
テクスチャのインデックスを指定する方法だった。


自分の実装



こんな感じでブロックのテクスチャを一枚に集めたのを
Texture2DArrayの形で読み込んで


uv0.zにテクスチャのインデックス
uv1.xにダメージによる暗くなり具合を設定できるようにして
ボクセルシェーダー完成



とりあえずまとまりがない感じになったが、大体書きたいことかけたので満足

コメント