daedalus_indiegame’s diary

インディーズゲーム開発の日々の進捗等について書き綴ります!

超絶ざっくり高速振り返り

過去を振り返ってみようじゃないか

さてさて、デジゲー博も終わりましたよ〜。
余韻というか、疲労感に浸っている今日この頃。歳かな?w
現在開発しているRogueライクなゲームを開発しはじめてから最初の一里塚まで到達した感がありますね。しみじみ。
というわけで、ここまでの開発の足跡ついて、いまいちど振り返ってみるとします。

1月

一年の計は元旦にあり!今年は何か作るぞ!何を作ろう?そうだ、Rogueライクゲームを作ろう!!決定!
くらいのノリで開発を決定。
1/2 から設計に着手し、1/3 には製造を開始。

ダンジョンの自動生成処理にほぼ1ヶ月を費やす。
シンプルに効率良く回れ過ぎるダンジョンでは、ダンジョンっぽさに欠ける。
ほどほどの複雑さを出すにはどうしよう?という点で悩み、結構時間がかかる。
この時点では、ダンジョンが分断されてしまい到達不可能なエリアができる、といった問題はあるものの、何となく動く程度の品質。

2月

SDユニティちゃんを投下!
生成したダンジョンにMainCharacterとしてご登場いただく。
動的に生成したダンジョンに対してNavMeshを動的にbakeして、タップした場所まで動くようにする。
この時点では、二次元のマス目構造の概念を無視して自由に移動できる。
(二次元のx,y座標のマス目構造に沿って動いて欲しいが、まだ先の話。)

次にA*による経路探索のアルゴリズムを実装し、タップしたマスまで探索した経路に沿って動くようにする。
むむ、経路探索自体は動くがマス目に沿って動かす、というのがどうにもやりにくい。。
というわけでDOTWeenの登場!NavMeshAgentによる移動方式は、泣く泣く捨てる。あぁ〜。悲し。
Rogueライクゲームといえば、こっちが動くと敵も動くというターンによる法則に支配されている。
このターン制御システムを実装する。

3月

8方向の矢印を主人公を中心とした位置に表示し、方向を指定することで移動する機能を実装。
フロアにランダムに階段を設置して触れると強制的に全てを再構築する。

4月

階段に触れると次のフロアへ進む、というのをUIも含めて作成する。
Subカメラによる簡易的なMiniMapを実装。
上空高くからフロア全体を見下ろして、画面の端っこに小さく表示する。
「敵」の概念を実装するが、まだまだ魂が入っていない。(動かないw)

5月

「敵」に魂を込める。思考ロジックを洗練させてゆくが、まだまだ未熟。
部屋の中を無意味に漂うのみ、壁も無視してすり抜ける。w
この時点では、まだ「攻撃」の概念が実装されていないので「移動」周りを中心に。
壁にめり込まないように、部屋の中に滞留せずに部屋間を積極的に移動するように、通路で詰まらないように、主人公を発見したら追いかけるように etc..
バグとの戦い。
下旬頃、「攻撃」、「ダメージ」、「死」の概念を導入する。

6月

メッセージ表示機能の追加。
(「〜を倒した。」、「〜ポイントのダメージを与えた。」のような。)
Swipeによる高速移動(ターンの高速再生といってもいい)を実装。
通路内では折れ曲がっていても道なりに高速する自動航行処理を追加。
ダンジョンの「壁」が見えるように建てる。(これまでは床しかなかった。w)
光と影の調整。

7月

ダンジョン自動生成処理を洗練させる。隣接リストを作りフロアが分断される問題を解決。
動的に生成するにあたりパラメータを追加。(部屋の大きさとか、通路の長さとか)
これでフロア毎に特徴のある自動生成が可能になる。
Subカメラによる簡易的なMiniMapを卒業。
はい、横着しないでちゃんと作ります。w
テクスチャにドットをポチポチと置いていく感じでMiniMapを実装。
今現在見えているところ、既に見たが今は見えないところ、まだ見てないところ、等々の制御に一苦労。
「休憩、待機」の概念を実装。

8月

デジゲー博に申し込んだのが、この辺りだったはず。
まだ抽選あるし〜、出れるかわからないし〜、と少し余裕がある。w

「道具」という汎用的な概念を実装。
一歩掘り下げて「武器」、「盾」、「矢」の概念を実装。
さらに掘り下げて具体的な武器、盾、矢のマスタデータを作成。(この時点ではベタ書き。)
「道具を拾う」、「道具の一覧を表示」、「道具の詳細を表示」、「道具を装備」、「道具を置く」、「道具を投げる」といった概念を実装。
「経験値」、「LV」の概念を実装。
マスタデータをScriptableObjectへ移行。

9月

9/14 デジゲー博当選のお知らせメールが届き、戦慄が走る。もう、逃げられない。w

マスタデータをExcelへ移行。ExcelImporterを導入。
ExcelデータをScriptableObjectへ変換してくれるツール。)

github.com

矢に「本数」の概念を実装。1スロットでn本の矢をまとめることが可能に!
アイテム落下ポイント探索の実装。例えば矢を撃って落ちた場所に既に何かが置いてあったら!?という処理。
敵をSpawnさせる処理を暫定的なものから作りかえ!
「金」の概念を実装。(店が欲しいね。)
「満腹度」の概念を実装。(食料が欲しいね。)
道具の種類を増やす。「食料」、「薬」、「オーブ」、「杖」の概念を追加。
ロジックが異なるアイテムで処理がごちゃごちゃしないようにOOPな感じでクラスデザイン。

10月

敵の種類を増やす。3DモデルはAssetStoreにて調達!
武器と盾を装備すると外観にも反映されるように実装!3Dモデルは(同上!)
外観やパラメータのみでなく、行動パターン、攻撃パターンも多様化する。
2回移動、2回攻撃の敵を実装。
「状態異常」の概念を導入。(モンスターハウス用に)
デジゲー博用にFirebaseのAnalytics & Realtime DatabaseのSDKを導入。
スコアランキング機能の実装。(前述のRealtime Databaseを利用して。)
モンスターハウス」の概念を実装。
「ダンジョンクリア」の概念を実装。
「トレジャーアイテム」の概念を実装。
ダメージ計算をなんとかする。
マスタデータを調整してゲームバランスを整える。

11月

デジゲー博に出展!
デジゲー博を終えて真白になる、動けない。w
ので、新調したMacBookProの環境セットアップ。
今更ながらPJ管理ツールの導入。AWSRedmine

まとめ

超絶ざっくりに高速で振り返って見ました!ざっくり高速に書いていますがバグとの戦いです。
新しい概念の実装直後は色々と未熟なところもあるので、その後も長い時間をかけて品質を向上させていく必要があります。
ゲームなので触り心地が大切!その辺には気を使いつつ。まだまだ要改善ポイントは多いので頑張ろう。

そして、設計がよろしくない箇所は思い切ってリファクタリングをする勇気も必要ですね。捨てる勇気。
デジゲー博出展が決定した後は、それ以前と比較して生産性が上がったと思います。
終了して反動もあり動けなくなっていますが。そろそろ復活の兆し!

難しい処理、アルゴリズムは先人達の知恵をお借りしましょう。車輪の再発明は時間が勿体無い。
今回、先人達の知恵を大いに拝借したのは、以下の3点です。

  1. 経路探索
     これはA*と呼ばれるアルゴリズムを拝借しています。
     最初、正しくC#化できていなくてバグってましたが。w

  2. グラフのデータ構造、隣接リストによる分断の検知
     動的に自動生成したダンジョンは分断されることもあります。
     (最初から分断しないように生成することは恐らく可能だが、そのようには作っていないので。)
     これを解決するために隣接リストという方法でグラフのデータ構造を構築し、深さ優先探索にて分断を検知するという処理を実装しました。

  3. ダメージ計算
     トルネコ不思議のダンジョンの計算式を大いに拝借致しました。
     どうやってあんな難しい式に到達したのだろうか、、、
     何を考え、何を思い、あの式に到達したのか聞いてみたいものです。
     数字に弱い私には理解できぬ。。。w

さて、完成するのはいつになることやら?