開発の狙い
本作は、OpenTK を使用して制作した初期のシューティングゲームです。
Unity などのゲームエンジンを使わず、ゲームループ、入力処理、描画処理、オブジェクト管理を自分で実装することで、ゲーム開発の基礎構造を理解することを目的にしました。
当初は OpenGL をより直接的に扱うことも考えましたが、C++ でのメモリ管理やリソース管理の負担を避けるため、C# から OpenGL を扱える OpenTK を採用しました。
実装の構成
実装では、Unity の構造を参考にしながら、GameScene を中心に GameObject を管理する構成にしました。
各 GameObject は複数の Component を持つ形にし、処理を機能ごとに分けられるようにしています。
ゲームループは、主に以下の流れで構成しました。
Update で入力処理と状態更新を行う
Draw で描画情報を収集する
SpriteBuffer に描画対象を登録する
- Sprite 管理クラスがまとめて描画する
描画処理では、一度描画用のバッファに Sprite 情報を登録し、最後にまとめて描画する形を取りました。
ただし、描画順やバッチ処理、ステート変更の削減などは十分に最適化できておらず、描画面の効率には課題が残りました。
GameObject には親子関係を持たせ、親の位置を考慮して子オブジェクトの位置を更新する仕組みを実装しました。
これにより、プレイヤーの周囲に表示される魔法陣のような追従演出や、背景スクロールなど、複数のオブジェクトを関連付けた表現を実現しています。
Unity の Transform 階層に近い考え方を自作したことで、親子関係による座標管理や、オブジェクト構造の設計について学ぶことができました。
描画と見た目の課題
Sprite はドット絵に近い見た目で制作しましたが、解像度やカラーパレットに統一感がなく、画面全体の視認性には課題がありました。
特に、背景と弾、敵の色が重なりやすく、プレイ中に重要な情報が見づらくなる場面がありました。
そのため、他のシューティングゲームを参考にしながら、背景は暗めに、弾や敵は明るめにすることで、視認性を改善しようとしました。
一方で、独自実装の描画基盤では調整に時間がかかり、最終的な見た目の品質を十分に高めるところまでは到達できませんでした。
学んだこと
本作の開発を通じて、ゲームエンジンが提供している基本機能の重要性を実感しました。
特に、ゲームループ、入力処理、描画順、Transform 階層、オブジェクト管理、リソース管理などを自分で実装したことで、Unity を使う際にも内部構造を意識しやすくなりました。
また、ゲーム制作では「低レベルな仕組みを自作すること」と「実際に遊べるゲームを完成させること」は別の課題であり、目的に応じて技術選択を行う重要性も学びました。