Unity 1週間ゲームジャム「密」開発記録
unityroom で2020年5月に開催されたUnity 1週間ゲームジャム「密」に参加しました。
「コロニーズ」公開です!
— るっちょ / ruccho (@ruccho_vector) 2020年5月3日
細菌たちが色素を撃ち合い、仲間を増やして大バトル。密集と分離を繰り返し、全ての細菌を染め上げよう!https://t.co/Jn37OWLvfi#unity1week #unityroom #コロニーズ pic.twitter.com/YpDym3PKmX
「コロニーズ」は、細菌を操作して、仲間の細菌との密集や分裂を繰り返しながら数を増やしていくシューティングゲームです。
開発記録
月曜から日曜までの開発記録を連ねてきます。
月曜日
今日はこのくらいにしてゲームします #unity1week pic.twitter.com/89yuUTfhCX
— るっちょ / ruccho (@ruccho_vector) 2020年4月27日
とりあえずテーマを「分離と密集を繰り返すシューティング」とし、プレイヤーの移動や弾の発射などの基本的なアクションを整えていきました。
あと、今回はレンダリングパイプラインにUniversal Render Pipelineを使用しました。URPにはスプライトに対しライティングを適用することができるLights 2Dが搭載されており、Lights 2Dを使った絵作りをやってみたかったのです。
火曜日
撃った弾で仲間を増やしたり、仲間とくっついたりできるようになりました。
タイトルとか顔とか吸収とか #unity1week pic.twitter.com/k8bW3tZ286
— るっちょ / ruccho (@ruccho_vector) 2020年4月28日
そしてこの日、問題が発生します。試しにWebGLビルドして動かしてみたところ、Lights 2Dの影が一切出なくなるという事態に。「Lights 2D、実はWebGL未対応だったりして……」などという不穏な考えが頭をよぎったりしてめちゃくちゃ焦りましたが、いろいろと条件を変えて検証したところ、「プロジェクト作成時にURPテンプレートで開始するとビルド後にLights 2Dが無効になる」ということがわかりました(自分でもよくこんな条件を見つけたなと思います……)。
原因がわかったので、あとはURPテンプレートでないプロジェクトと今回のプロジェクトで設定などを比較し、WebGLビルドでLights 2Dを動作させることができるようになりました。本当によかった!!
前回の参加(Unity1週間ゲームジャム「あつめる」に参加したよ - るっちょ らいつ)のときもビルド後に初めていろいろな問題が発覚したりしたので、そういった経験を踏まえて早い段階でWebGLビルドを行ったのですが、功を奏したようです。早期のWebGLビルド、大事!
水曜日
さて、このゲームの操作プレイヤーは一人ですが、自分以外の細菌たちはすべて勝手に敵を撃ち、集合や分裂を行います。このAIをうまく作れるかが今回の鍵でした。
AIの思考は、基本的には一定間隔で画面内の細菌を取得し、それらに対して距離・体力・サイズ・仲間の数などを考慮して重みづけを行い、優先度の高い敵をターゲットとして設定し、あとは撃つというものです。ゲームAI開発に関する予備知識が全然ないので、度々「こんな作り方でいいのか……?」と思いながらの開発でしたが、そこそこいい感じに動いてくれるようになったと思います。
AIの基本的な動作ができたので、ふと思い立ってAI同士で戦わせてみました。するとこれが結構面白く、ずっと眺めていられるのです!そこでゲームに「観察モード」を入れ、タイトル画面の背景ではAI同士のバトルを展開し、またプレイヤーが敗北した後もバトルの続きを眺めていられるような仕組みをつくりました。また、「このゲームは細菌を観察しているという体」をコンセプトとし、オープニングやアートスタイルに反映させていきました。この「観察」というアイデアは自分でも結構気に入っています。
AI実装したので完全観察モードを作った。たのしい #unity1week pic.twitter.com/7Fp4kwa2jq
— るっちょ / ruccho (@ruccho_vector) 2020年4月29日
木曜日
この日はAIの調整とオープニングの作成、そして分離アクションの実装を行いました。
分離と密集 #unity1week pic.twitter.com/2ELAsl7kv9
— るっちょ / ruccho (@ruccho_vector) 2020年4月30日
金曜日
このあたりからゲームの細部を整えていく作業になってきます。具体的にはUI作成、アニメーション、チュートリアル作成、バグ潰し、最適化などです。特に最適化については、この段階までほとんどパフォーマンスの検証を行っていませんでした。普段使っているマシンはそこそこハイスペックなのですが、ビルド後はWebGLになるのでいろいろと制約があるうえ、普通のノートPCとかでも動いてくれないと困ります。手持ちのノートPC(i5でグラボなしのインテルGPU)でWebGL動作検証を行ったところ、15FPSという少々ショッキングな数字が出てしまいました。特にLights 2Dの影の描画が各細菌に対して行われるため、このゲームではかなりのネックとなっていました。これに関しては画面外の影描画の省略が一番効いた感じがします(Lights 2Dで大量のスプライトを描画する際はぜひ参考に)。それでもそこそこ負荷が高いので、最終的にはFPSを測定して自動的に影の描画の有効化・無効化が行われるようになっています。
土曜日
引き続き、細部の調整作業を無限に行っていました。そしてここにきて初めてサウンドに着手します。とりあえずbfxrで一通りSEをつくりました。ゲーム中、常に響き渡る弾の発射音は5種類のAudioClipをランダムに切り替え再生してできるだけ単調にならないようにしています。
SEと一戦ぶんの流れ #unity1week pic.twitter.com/WX6mfFHDfY
— るっちょ / ruccho (@ruccho_vector) 2020年5月2日
日曜日
ゲーム本体に関してはBGM、バグ潰し、サウンド関連の最適化作業だけ行い、早々にビルド・アップロードしてしまいました(期限ギリギリになってWebGLビルドが終わらない絶望感を知っているので)。あとはツイート用動画の収録・編集、アイコン作成など公開関連のこまごまとした作業……これまでになく万全の状態で20時を迎えることができたと思います。
総括
ゲーム内の細菌の総数は105に設定されています。そのうちプレイヤーが同時に操作できる細菌はたったのひとつです。つまり、勝敗はプレイヤーの技量によってあまり左右されません。まあ例えば彷徨い歩く細菌を回収して激戦区に展開する、みたいな戦略はアリですが、フィールドは広いですし、結局のところは運ゲーの部分が大きいです。当初このコンセプトで開発を開始するとき、これで本当に面白くなるのかどうかあまり自信がなく、余力があればオンライン化して対人対戦ゲームにしようと考えていました。最終的には(余力がなかったからでもあるのですが)オンライン機能なしで公開することとなりました。
実際には仲間のAIプレイヤーが敵に奪われると申し訳ない気持ちになるし、全滅直前に孤軍奮闘してるときも凄く孤独感があります。あと、コメント欄には「敵にボコボコにされたけどそれも面白かった」という声が寄せられました。このゲームの面白さの要はシューティングゲームとしての面白さではなく、どちらかというとAIプレイヤーに対する愛着感や「観察してる感」にあるんじゃないかな?と思っています。そういう意味で「観察」を一つのコンセプトに設定したのもよかったのかもしれません。
まあ、105のセルを全部プレイヤーにしてオンライン化するのはさすがに無理があるにしても、各カラーひとりはプレイヤーにして対人ゲームにするのはまあアリだと思います。ただunity1week参加時は毎度のことながらコードがぐっちゃぐちゃになるのでオンライン化は茨の道になりそうです……(ただでさえバグが頻発してるのでそちらもどうにかしないといけない)