最初に書いておきますが、これは文化祭3日目終了後にできるだけ覚えていることを書き起こしたものなので、若干冗長ですが、その分教訓に満ちていると思って読んでもらえると幸いです。面倒なら、AIに要約させるといいんじゃないですかね。
開発はGithubで行っており、開発の過程をNoteで大まかに記録しているので、以下の2つを見てもらえればほとんどのことは分かります(特にNoteの方はそれなりにまとまっていると思います)。
- note: 最初の記事がこのURLになります。これ以降は僕のアカウントから辿れると思います。https://note.com/learninghorse/n/n99c3df644879
- Github: 全ての開発はこのレポジトリで行いました。https://github.com/MommaWatasu/DynamicArenaこの中にないのは背景画像のために作ったBlenderのファイルぐらいです。
格闘ゲームはなにか新しいジャンルのアトラクを作ろうという思いから作ったゲームです。 メンバー構成はアトラク長の門馬(以下「僕」と書くときは門馬だと思ってください)と宮口、松本の三人です。役割分担としては、門馬がソフト開発、宮口がコントローラー作成、松本がソフト開発の補助兼デザインを行いました。 ただし、宮口はアトラク部門長として文化祭直前期は忙しくなったので途中から門馬がコントローラーの回路の作成を引き継ぎました。
ゲームのルール等についてはhttps://mommawatasu.github.io/DynamicArena/specification.htmlまたはhttps://mommawatasu.github.io/DynamicArena/rulebook.htmlを読んで貰えれば分かるので、これでゲームの内容についても分かると思いますが、読むのが面倒な人のために一言で言えば、3ラウンド制の格闘ゲームです。 3人のキャラクターがいて、それぞれ異なるステータスと必殺技を持っています。またシングルモードとマルチモードが用意されており、本番でも一人のお客さんにはボット対戦をしてもらい、二人のお客さんにはその二人で対戦してもらいました。 ちなみに、ゲームのWeb版(PC用)はGithub Pagesが生きている限り永久に使えるので、こちらのページからどんなゲームなのか試すことができます。
まずはこのアトラクが成功か否かですが、全体としては成功だったと思います。格闘ゲームというジャンル上、複雑な戦略が求められるので対象年齢は中高生になりますが、コントローラーが非常に分かりやすい見た目をしているので、幼稚園ぐらいの子供にもコントローラーを好きに使えるという面で楽しんでもらえたと思います。また、2人対戦では友人同士でプレイする方も親子でプレイする方もいましたが、どちらも楽しんでいただけた様子でした。 また、ボットを実装しておくことで、当日に班員が対戦に手間を取られずに済むので、これも良い点だったと思います。
このセクションではゲーム実装について軽く説明しますが、それなりに難易度が高い実装をしている自覚はあるので、分からなかったら無視してもらって構いません。 また、一つ一つの機能の実装についてはNoteにまとめてあるのでここでは触れません。
まずは開発環境ですが、僕はRustが大好きなのでRust製のゲームエンジンBevyを使用してゲームを作成しました。僕が開発している時点では(そしてこの総括を書いている今も)Bevyはかなり未熟なライブラリで、実際開発中に破壊的な変更が入ることもありましたが、とても優秀なライブラリなのでRustで開発する気があるならGodotと同じぐらいおすすめしたいと思います。 Bevyは特にGUIのインターフェイスはないので、フルスクラッチで実装しました。僕はOSをRustで書くぐらいなのであまりフルスクラッチで実装することに抵抗がありませんが、普段GUIでの開発に慣れている人だとUnityやUnrealEngineを使って見たいと思うかもしれません。しかし、フルスクラッチにも良い点はあります。具体的には当たり前ですがGUIを全て自分で記述するので、デザインが自由に作れます。そしてゲームエンジンの機能の限界や仕様に縛られることがありません。当たり前のことではあるのですが、これによりかなり創造的で独自性あるゲームの開発があるので、ぜひ一度考えてみてください。
そして、GithubやNoteにも書いた気がしますが、VSCodeでコーディングしたものを、cargo-makeというタスクランナーでビルドしていました。Rustで開発をするなら、VSCodeにrust-analyzerを入れるとめちゃめちゃ開発が楽になると思います。そして、今の時代欠かせないのがコーディングエージェントの存在です。僕だってそれなりに実装は早いと(勝手に)自負していますが、それでもやはりGithub Coilotが生成する速さには叶いませんし、ゲームで仕様について深く考えながら実装も考えるのは大変な場面や、複雑なゲームを作る場合にはデバッグにも大きな助けになります。今の制度ではGithub Educationに申し込むことで学生のうちは無料で無制限にGithub Copilotが使えるので、必ず申し込んで使いましょう。開発のスピードが全然違います。
最後に半分冗談半分本気で伝えますが、WindowsはクソなのでLinuxを使いましょう。開発環境としての使いやすさが段違いにLinuxの方が上です。
これは直前にアトラク長から指示があって(Sonnet 4.5で)追加した機能ですが、ゲームの結果表示画面の処理と同時に、ファイルに1時間ごとのプレイ人数を記録していました。この機能は単に来年度以降のデータとなるだけでなく、受付終了時刻の決定にも使えるという利点があるので是非実装しておきましょう。
コントローラーは高2の課題研究で今和泉さんが教えてくださるESP32を使って作成しましたが、これが大きな問題のたねとなりました。詳しくは文化祭中についてで触れます。 コントローラーは当初宮口の単糖になっており、Wiiリモコンのような形状にしてモーションを使った操作ができるものにする予定でした。しかし、加速度センサーを含む基盤をはちゅうした業者からものが届くまでに確か3ヶ月ほどかかり、しかも届いたものは加速度センサーの値が読み出せないというトラブルがありました。 そこで、2学期に入ってからはジョイスティックと4ボタンだけを備えた箱型のアケコンに目標を変更して作成を開始しましたが、なかなか完全な形のものができず、10模擬の時点でも1台がやっと動くかどうかといった状況でした。コントローラーの箱を3Dプリンターで作成していたので、造形が失敗することがあるというのが更に大きな壁となりました。3Dプリンターは非常に便利なものですが、同時に不安定だったりもするので、使うなら早めに計画的に使うことを推奨します。 また、ユニバーサル基板にピンをつけて実装したんですが、ユニバーサル基板にピンをはんだ付けして、ボタンなどもはんだ付けしようと思うとかなり慣れが必要とされるので、早めにやるか、できる人を探してやりましょう。僕は1週間前に始めて爆速ではんだ付けを終えました。あと、細かいところのはんだ付けではテスターの抵抗チェッカーで導通しているか否かを確認すると良いでしょう。
ゲームの見た目という意味でのグラフィックスではなく、ここではデザイン的な話を書きます。 まず、キャラクターの動作についてですがこれはかなりいろんな試行錯誤を行いました。最初の方はプログラム制御で幾何図形を動かしていましたが、あまりにも棒人間かつ二次元で面白みがないので改善を図りました。 そこで、まず最初に試したのがFramepackという動画生成AIと画像生成AIの合わせ技です。幸い、僕と松本がGPUを持っていたので、試すことは十分できたのですが、この時点で使えるモデルでは満足な品質のものは作ることができませんでした。しかしこの分野の発展は著しいので、来年以降ではまた事情が変わっているかもしれません。 これがだめであると分かったのと同じ頃に、Adobeが3Dモデル用のアニメーションを公開していることを知り、Blenderでボーンに円柱などで肉付けして作ったモデルをこのアニメーションで動かし、更にこれを動画として出力して、更に動画をアトラス画像に展開し、最後にゲーム側でスプライトアニメーションを実行するという手順を取りました。これにより、かなり人間らしさが出た上に、もとがBlenderなので、2Dではあるんですが、見た目上は3Dっぽくもなり、ゲームの完成度の向上に大きく役立ちました。
実はこの日、このアトラクの進捗はほぼ0です。電飾が全く完成していない状況だったので、僕ははんだ付けマシーンになり、松本がPVの作成を行っていました(これもあまり詳しくは書きませんが、早めに作ることを心がけないと、結局出せなくなりかねません)。 しかし、このように直前は何もしなくても本番には稼働できるぐらいの状態にしておかないと、ツム可能性があると思います。
この日は本当に絶望していました。コントローラーの3Dプリンターによる出力に失敗していたので、この日の朝に最終版を受取、いざESP32を組み込もうとしたところ、ESP32の調子が急に悪くなり、全く接続できなくなってしまいました。 やっとの思いでESP32を復旧させると、2人プレイを十分にデバッグしていなかったために、バグの嵐でまともに稼働できる状態ではなく、一日目はほぼ稼働せずに終了し、文実側にもこのままの状態ならデコ停にすると言われていました。 その日の夜は必死にESP32の動作確認をして、なんとか2台の生存を確認し、もう一台を(格ゲーは2台のマシンで稼働させる予定でした)キーボードで動かすという苦肉の策に出ることに決めました。
一日目夜に頑張った結果、なんとか2日目は朝から稼働させることができたんですが、稼働させてみると、今まで発見されていなかったバグまで見つかり、何度も再起動しました。やはりデバッグの重要さが改めて分かると思います。 しかし、大変なのはここからです。ESP32を4台動かすための確認をしていたところ、次々にESP32とのシリアル通信ができなくなり、より絶望的な状態に陥りました。この時点で僕は一日目にも絶望を味わっていたので諦めて既成品を買ったんですが、松本の方は今和泉先生にESP32を貸していただいてコントローラーを復旧させようとしていて、実際に3台の稼働を確認してこの日の作業を終えました。
三日目は朝若干トラブルがあって10時からの稼働になりましたが、これ以降は列が途切れることなく稼働し続けることができたので、3日目だけで331枚、約4万円の売上を出すことができました。2日目の夜にデバッグもしていたので、この日はかなりスムーズに稼働できました。 客の追い出しも、前述したように記録から大まかな所要時間を予測したことでちょうど閉会5分前に最後のプレイを終えることができたので、良い最後を迎えることができました。
前述したプレイ数のカウントの結果は、1台目と2台目 に書いてあります。
以上で僕のアトラクの説明は終わりになりますが、これを踏まえて来年以降に引き継ぎたい事を最後に書こうと思います。
今の時代、生成AIはかなり進歩しています。テキスト生成があまりに有名なので、ほかは試していない人も多いでしょうが、音楽生成AIは他の生成AIと比べて圧倒的に実用性が高いです。今回のアトラクのBGMは全てSunoによる生成ですが、おそらくお客さんの中に生成であることに気づいた人はいないでしょう。また、背景画像の雲や、遠距離攻撃の矢はFluxで生成しています(このあたりはGithubに説明があります)。是非今後のアトラクでは生成AIを有効活用して、クオリティを上げていってください。
僕のアトラクに限らず、音ゲーなど多くのアトラクではコントローラーとしてESP32を使用すると思いますが、はっきり言ってアトラク倉庫は電子機器を保管するにはあまりに環境が悪いです。 そのため、アトラク倉庫にあるESP32、及び今回使用した3.3V 昇圧DCDCは全て今和泉先生にお渡しして保管していただいているので、使うときは受け取りに行ってください。 今後もせっかくある資源を無駄にしないよう物理科の方で預かっていただくようにできると良いと思います。
今年使ったコントローラーはジョイスティックと4ボタンという非常にシンプルな構成のものなので、汎用性があると思います。そこで、基盤もろともアトラク倉庫に突っ込んでおいたので、是非活用してください。箱だけはモデルから作り直しても良いと思います。 以下の画像のようにしておいてあります。
前述したように、僕が市販のコントローラーを購入したのは文化祭2日目が終わったあとでしたが、以前から市販品を使うことは視野に入れていました。しかし、ESPで自作できるならその方が良いと思って購入していませんでした。 もしもの場合に備えるのにそれほどお金がかからないのであれば、早めに手を売っておいたほうが良いと思います。それがたとえ今回のように今までのやってきたことを諦めるものであっても、アトラクが動かなくなるよりはずっとマシなはずです。
メールだとまともに見ない可能性もあるので、Githubのレポジトリでissueを立てて、僕にメンションしてもらうのが良いと思います。

