【Godot Engine】二週間でえっちなミニゲームを作った記録
ゲームを作りました
はじめまして、Nao です。
普段はX(Twitter)やpixivでイラストを投稿したり、たまに「伺か(デスクトップマスコット)」のゴーストを作ったりしています。
この度、「自分の描いた絵を、自分のプログラムで動かし、自分の性癖を詰め込みたい」 という欲望に従って、R18ゲーム制作を開始しました。
この記事は、その一環として最近公開した 『OVERHAUL』 の紹介と、その技術的な解説記事になります。
※本記事は「性DECアドベントカレンダー2025」24日目の記事でもあります。
■ 作ったもの:『OVERHAUL -戦場の機体整備-』
- ジャンル: アンドロイド整備・戦闘シミュレーション
- 制作期間: 2週間
- エンジン: Godot Engine 4.5
「戦火の中、二人きりのシェルターで少女型兵器を整備する」 というシチュエーションのゲームです。
また12/24現在で閲覧数13万、5万回以上プレイしていただき、嬉しいコメントも頂いていてとても励みになりました。
[統計とViewのグラフ。公開3日目がピークで30000人が閲覧し、現在はO(1000)で推移。]
■ なぜ二週間なのか?
実は今までも何度かゲームを作ってはいたのですが、ちゃんと公開できたものはあまり多くはありません。
最初から完璧な設計を考え始めたり、必要かもわからない拡張性や機能を考慮したりした結果、コードはスパゲティと化し、途中で投げたりしていました。
過去を振り返ると、私が唯一ゲームを完成させられたのはゲームジャムに参加した時だけでしたし、普段イラストを描く時もSkebなどで 強○的な締め切り がないとなかなか筆が動きません。
そういうわけで、今回は強○的な締め切りとペナルティを自分で設定し、Skebのように 依頼を受けてゲームを制作するような状況 に追い込んでから製作を開始しました。
またゲームジャムのように、テーマを指定しています。今回は 「戦記」 と 「同棲」 をテーマとしてプロジェクトを考えました。
■ 短期開発を念頭に置いた設計思想
1. 企画の設計
まず実装したい機能と、エロをどう組み込むかを選定しました。 「同棲」 というテーマがあったので、 最初はキャラクターをクリックしてコミュニケーションを取るシステム を主軸に考えました。前述したように、私は「伺か」でゴーストを作っていた経験があったので、このあたりの設計(ステート管理やタッチ反応)には多少ノウハウがあったためです。
[過去に作成した伺かのゴーストの一つです。デスクトップで暇なときにお尻をペチペチできたりします。]
ただ、これだけではゲームとしての目的が不明ですし、ゲームループが成立しません。そこで「戦記」というキーワードから、「アンドロイドの少女を整備して戦闘をこなし、ボスを撃破する」 という明確なクリア条件を設定しました。
2. ミニマルなゲームループの作成とキャラクターグラフィック
ゲームの流れが決まったので、まずは最小限のゲームループ(整備→出撃→リザルト)を実装しました。これは各パートを別のシーンで作成し、必要最低限の機能(UIの見た目は後回し)だけ実装したものです。
こうしたゲームループを完成させる最小限のシステムを組むのは開発初期には必須ですが、実際にやってみるとただの仮組の画面のままではモチベーションが湧かなかったりします。そこで 先にキャラクターのイラストだけは完成させ、画面に表示させながら開発を進めました (差分は後で作成)。 UIなどは後回しでも、「自分の描いたキャラが動いている」という事実だけで、開発序盤の苦しい時期も乗り越えることができます。
3. 性癖(フェチ)をシステムの中核に置く
エロ要素の組み込み方ですが、クリアのご褒美として一枚絵が出るのも良いですが、個人的には 「エロがシステムに組み込まれており、攻略のために能動的にエロを実行しなくてはならない」 という設計の方が好みです。
そこで、本作のヒロイン「レイ」は兵器であり、 「アナルがエネルギー供給用のコネクタとして改造されている」 という設定にしました。(あと私がアナル好きというのもあります)
これにより、ゲーム進行に必須な「HP回復(補給)」と「アナルプラグの挿入」というエロ要素を自然に統合できました。また、より強くするための改造には高出力(=太い)プラグが必要……という形で、倒錯的な要素もシステム側から補強しています。
■ 技術:設計で工夫した点
ここからは開発者向けの技術的な話になります。一部ネタバレとなる画像があるので、未プレイの方は注意してください。
①「CharacterPuppet」シーン
立ち絵管理の効率化として、CharacterPuppet.tscn という独立したシーンを作成しました。
このシーンには以下の機能を詰め込んでいます。
- 表情・衣装差分の管理: Signalを使って対応するID(眉、目、口)を飛ばすことで切替(伺かのSurface番号指定のようなイメージです)
- インタラクション:
Area2DおよびCollisionPolygon2Dでクリックされた部位(胸、股間、脚など)を検知 - アニメーション:
AnimationPlayerで制御
GodotはSignal(オブザーバーパターン)を活用すると効率よく開発できます。 「表情変更」や「触り反応」のSignalを定義しておき、これを受け取って会話のバリエーションを作っています。
また、画像下部のように AnimationPlayer は特定のフレームで「関数呼び出し(Call Method)」が可能です。これを使って表情制御SignalやSE再生を発火させることで、アニメーションとロジックをこのシーン内で完結させています。
また、このCharacterPuppetシーンを一つ作っておけば、整備画面、ノベルシーン、戦闘画面でインスタンス化して置くだけで使いまわすことができます。製作期間が限られていたので、この設計には助けられました。
② 「Clip Contents」とシェーダーを使った演出強化
素材制作の負担を減らすため、ノベルパート専用の「顔グラフィック」は用意していません。
前述の CharacterPuppet(全身立ち絵)を流用しています。
実装はモニター枠となるControlノードの下に CharacterPuppet シーンを配置し、Controlノードの Clip Contents プロパティを有効にするだけです。
これだけで 「枠からはみ出した部分が自動的にクリッピング」 されます。
また、ColorRectノード(画像ではNoiseOverlayという名前です)を上に置いて、通信画面風のShaderをそのノードに適用してそれっぽい画面を構成しています。
③ translations.csvを使った多言語対応
Godot Engineにはデフォルトで簡単に多言語対応を実装する機能が用意されています。以下は今回のゲームで使用した文章データの中身です。
この画像のように、
translations.csvという名前のファイルをcsv形式でKEY, 日本語, Englishのように作成した後、スクリプト中ではGodot側で用意されているtr(KEY)という関数を呼ぶことで適切に言語を切り替えることができます。また実際の実装では正規表現を使ってパースする処理を入れることで、@[...]という記法で表情を切り替えるシグナルを発行させる処理を実現しています。
④ その他工夫した点
ミニゲームであるため、あまり長々とチュートリアルをしなくてもプレイできるように戦闘はオートとし、パーツを組み替えることで強化するシステムにしています。パーツのパラメータもそこまで複雑にはしていません。
またキャラクターはアンドロイドの少女という設定なので、破損状況やパーツの換装で見た目が変わる要素を取り入れています。
時間が限られていたため、グラフィックは結構使いまわしをしています。戦闘背景や敵グラフィックは同じパーツを使いまわして作成しているものが多いですが、プレイしてみるとそこまで違和感はない出来になった気がします。
また、ゲームクリア時にリザルト画面を用意することで、リトライとプレイの最適化へのモチベーションを高める設計にしてあります。
■ おわりに:今後の活動
今回のゲーム作成を通じて、短期間で完成させるためのスコープ管理や、Godotでの効率的な実装フローなど、多くの知見が得られました。 そして何より、「自分の性癖を表現したゲームが、世界中のプレイヤーに受け入れられる」 という素敵な体験を得ることができました。
次はこれらを活かし、よりボリュームのある、そして画像やエロシーンをもっと増やした作品を作りたいと考えています。 Ci-enでは今後も開発進捗や技術メモなどを投稿していく予定ですので、もしよろしければフォローをお願いします!
ここまで読んでいただき、ありがとうございました!