【Godot4】ゲームを作ったので振り返る:Hextrategy
0. この記事の内容
Hex(Nashとも呼ばれる)を題材にしたローカルマルチプレイ戦略ゲームHextrategyを作ったので、制作に伴う学びや反省点をまとめました。システマチックなゲームを作るのは初めてで、内心「これでいいのか?」と思いながら作成を進めた点もあるので、今後のゲーム作りに活かせるように苦労した点・工夫した点を振り返りたいと思います。
作ったゲームはitch.ioで公開しています。ブラウザから気軽に遊べますが、ローカルマルチプレイ専用です。対戦AIを作るのがめんどくさかったので。
1. Hexを題材にしたきっかけ
ゲームの題材を探すにあたって色々と調べていたら、Shotgun King: The Final Checkmateと言うゲームを知ります。チェスを題材にしたローグライトな戦術ゲームで、「自分もボードゲームを基にしたゲームを作ってみよう」と思いました。色々なボードゲームを検討した結果、世界のアソビ大全51にも収録されているHexを、シンプルなゲーム性ながら他では題材にしているゲームが見つからなかったため、採用しました。
2. 開発について
2.1. 開発期間
開発を初めてから完成するまでの期間は一ヶ月弱くらいですが、集中的に作業を行ったのは五日程です。最初は対戦AIも作成するつもりでしたが、いざ作ろうとすると思っていたよりも複雑なゲームであることに気がついたので、一旦保留にしました。気が向いたら機械学習でもさせてみようかなと思っています。
Godotで機械学習するやつ
2.2. 事前準備
ボードゲームを題材にしていることもあり、必然的にイベント駆動の設計になりました(コードを見返したら一回も_process
を使っていませんでした)。事前にシーケンス図をかいて流れを整理してから、開発に取り掛かりました。「オブジェクト数が少ないし、シーケンス図だけで大丈夫だろう」と横着してクラス設計はしませんでした。
事前に作成したシーケンス図
2.3. 実際に作り始めて
2.3.1 ゲームの流れ
実際に制作に取り掛かってみると想像以上に複雑なことに気が付きました。ボードゲームににおいてどのオブジェクトがどんな機能を持つのかの切り分けが難しく、色々と迷走してしまいました。結果として、石を置くBoard
クラスに機能が集中してしまい、神クラスまではいかないまでも、多機能なクラスになってしまいました。
また、ゲームの進行にはシンプルなステートマシンを用いて管理を行っていたのですが、ゲーム進行のステートマシンとプレイヤのステートマシン(先手と後手で×2)が独立して存在するというややこしい事態になってしまい、後々後悔しました。階層構造が可能なステートマシンシステムを作り直すべきでした。
色々と反省点の多い制作過程でしたが、結果として以下のような流れになりました。
Alpha
が先攻、Bravo
が後攻で、Turn*
はゲーム進行のステート、*Hand
がプレイヤのステートマシンです。実際はもう少し複雑ですが、省略しています。
実際のシーケンス図
シーケンス図にしてみるといい感じに見えますね。実際はぐちゃぐちゃなのですが…
2.3.2 戦闘の流れ
また、戦闘処理の流れにも苦労しました。ゲーム内には、
- 敵を倒したら倒した場所に移動するPaladin
- マスが空いていれば攻撃時に敵を押し出すGuardian
- 攻撃対象の左右の石にもダメージを与えるArcher
という特殊能力を持つ石が存在するのですが、これらの処理を実装するための仕組み作りに苦労しました。処理はBoard
側ではなく各クラスに持たせたかったので、柔軟に対応できる戦闘システムにする必要がありました。
最終的には以下のような流れになりました。
戦闘のシーケンス図
こうやって見てみると簡単に思えますが、実際一から作ろうと思うと大変でした。Paladin
が敵を倒しても移動してくれなかったり、体力がゼロになっても消えないゾンビ石や攻撃範囲外なのに反撃してくるチート石が発生したりと頭がこんがらがってしまいましたが、なんとか完成させられました。
2.3.4 こだわりポイント
2.3.4.1 アニメーション
UIアニメーションや遷移エフェクトにはこだわりました。メインメニューや設定などの画面はBento UIをモチーフとして各グリッドが別々にアニメーションするようにしています。画面遷移のエフェクトはシェーダーを自作(といっても十数行の簡単なもの)しています。
技術的には特筆するような点は無いのですが、強いていうのであればシーン切り替えの際はThread
を用いて非同期処理を行っており、カクつきが発生しないようにしています。
2.3.4.2 ドット絵
絵は得意では無いのですが、頑張って描きました。一番左は麦わら帽子を被った農家ではなく、兜と楔帷子を纏った兵士です。
左から、Soldier、Knight、Witch、Paladin、Guardian、Archerです。
2.3.4.4 タッチ対応
最初はマウスを使った操作にのみ対応していたのですが、Webでプレイできる以上タッチ操作にも対応するべきだと思い実装しました。このゲームではマウスカーソルのホバー操作で選択している石の攻撃範囲を確かめることができるのですが、タッチ操作の場合マウスのホバーにあたる入力がありません。そこで、一回目のタップで範囲を表示し、二度目のタップで石を置くようにしました。攻撃対象の選択の際も、二度目のタップで入力を確定するようにしており、誤入力が発生しないようにしています。
3. 改善点
- 攻撃や死亡などの演出が地味
- 石の種類が少ない
- 対戦AIがない
演出が地味な点は、作り込もうと思えばよりジューシーなゲームにもできると思いますが、際限のないことなので、一旦満足ということにします。
対戦AIはどう考えてもあるべきですね…
4. おわり
ゲーム性自体は割と面白いものができたと感じています。元ネタのHexは先手必勝であることが証明されているため、先手後手のバランスを崩す要素としてランダム要素を入れるのは噛み合った仕様なのではないでしょうか。今回はHexに寄せて石を用いましたが、よりストラテジゲームライクにしても面白そうです。ボードの形を変えたり、置ける場所の制限や再移動要素など、発展の余地が色々と考えられるため、今後より大きなゲームを作る際の種として温めておこうと思います。
Discussion