Hedra: 高校時代にゼロから作った3Dオープンワールドゲーム
Hedra is a 3D open world game I wrote from scratch while in highschool (github.com)
要約
本記事は、高校時代に作者がゼロから開発した3DオープンワールドRPG「Project Hedra」について紹介しています。OpenGL学習から始まったこのプロジェクトは、数年かけて本格的なゲームとゲームエンジンに成長しました。プロシージャル生成される世界、豊富なゲーム機能、そしてモダンOpenGLを用いたカスタムエンジンなど、多岐にわたる技術的詳細が説明されています。
全文翻訳
Project Hedra
Project Hedra は、意欲的なオープンワールド・ローポリRPGです。クラスを選択し、無限にプロシージャル生成される世界を探索し、様々なスキルをアンロックして、プロシージャル生成されるクエストを完了しましょう。
その他のスクリーンショットは (Screenshots) でご覧ください。
タイムライン/背景
このプロジェクトは、OpenGLの仕組みを学ぶために高校生(約15歳)の頃に始めました。
スコープクリープがすぐに発生し、数年後には本格的な3Dゲームおよびゲームエンジンへと発展しました。コードベースは約10万行(LOC)で、ゲームはLinuxとWindowsでファーストクラスのサポートを受けています。
機能
100万行のコードは無駄ではありません。ゲームとエンジンはどちらも機能満載です :)
ゲームの機能
- 美しくプロシージャル生成される世界
- クエストとボス
- 100以上のアイテム(レアリティシステム付き)
- スキルとスキルツリーシステム(N+スキル)
- それぞれ2つのスペシャライゼーションを持つ4つの異なるクラス()
- プロシージャルに配置された構造物が動的に生成される
- 釣り、クラフトなど
- 取引とNPC
- コンパニオンとペット
- 美しいサウンドトラック
- ナビゲーション、マップ
- 異なる次元
- その他、思い出せないもの多数 :)
エンジンの機能
- モダンOpenGLを使用した本格的なレンダラー
- スキンドメッシュレンダリング
- ジェネリックアニメーションのロードと再生をサポート
- Collada (.dae) パーサー
- スタティックメッシュレンダリング
- スクリーン空間反射
- スクリーン空間アンビエントオクルージョン
- ブルーム、FXAA & MSAA
- Moddingサポート
- Steamベータブランチへの自動デプロイのためのCI
- ローカライゼーションサポート
- OpenALを使用したサウンドサポート
- Pythonスクリプトサポート
- データ指向オブジェクトをロードするためのモジュールシステム
- Steam統合
- 本格的なUI&コントロールシステム(ドロップダウン、ボタンなど)(生のOpenGLで記述)
- ランタイム中のリロードを可能にするダイナミックシェーダーシステム
- フラストゥムカリング、オクルージョンカリング
- ランタイムレベルオブディテール(LOD)のためのメッシュ簡略化
- スカイボックスサポート
- シャドウ
- 3Dトレイルレンダリングサポート
- OpenGLでのオブジェクトインスタンシングを使用したパーティクルシステム
- bulletphysics統合
- 無限世界をサポートするチャンクシステム
- .plyパーシングサポート
- MarchingCubesを使用したダイナミックメッシングサポート
- 基本的なC#プリミティブとアロケータ(Listなど)のカスタム実装(スタックアロケートされたリストをサポートし、ランタイムの自動アロケーション(およびGC)を最小限に抑えるため)
- 1000以上のテストケース
- ゲームコンポーネントのモック化とゲームのインテグレーションテストのためのフレームワーク
- 高速なロードと小さいサイズのための画像およびアセット圧縮
- エンティティコンポーネントシステム
- その他、思い出せないもの多数 :)
興味深い点
-
WorldRenderer.cs。ワールド全体をわずか3回のドローコール(実際にはデータバッファのパーティショニングによりますが、3回を想定して設計されました)(水、地形、インスタンス化)でレンダリングします。glMultiDrawElementsを使用しています。
-
Block.cs。ワールドのコアコンポーネントです。詳細はhttps://maxilevi.com/blog/procedural-meshing-hedraをご覧ください。
-
Fishing.py。IronPythonを使用したModスクリプトとしてPythonで記述されており、C# APIと直接やり取りします。
-
NativeArray.cs カスタムアロケータを使用した配列プリミティブの実装です。同じプロジェクトは、ヒープベースのアロケータとスタックベースのアロケータを
stackallocを使用して提供します。アイデアは、ゲームフレーム中の自動ヒープアロケーション(したがってGC)を最小限に抑えることでした。
興味深い事実
- ワールドは完全にプロシージャルに生成されており、ワールドセーブファイルはありません。プレイヤーのコンテンツとワールドシードのみが保存されます。残りは実行時に作成されます。
- ワールドはボクセルベースですが、Marching Cubes と呼ばれるアイソサーフェス抽出アルゴリズムが適用され、離散ボクセルから暗黙的な連続表面を抽出します。
- 「Hedra」という名前は、私が最初に実装したアイソサーフェス抽出アルゴリズムであるMarching Tetrahedraで使用される形状であるテトラヘドロンに由来しています。
- ゲームは.PLYおよび.DAEモデルのみをロードできます。これらはどちらもプレーンテキストであり、モデルにテクスチャはありません。したがって、これを考慮すると、テキストを読み取ってインタラクティブな画像を作成するテキストの塊を私が書いたことになります。これは非常にクールだと思います。
スクリーンショット
[画像: image] [画像: image] [画像: image] [画像: image]
TODO 追加予定
コード構造
全体アーキテクチャ
ゲームはベースエンジンへのModです。このようにアーキテクチャを設計した意図は、Mod APIを常に最新の状態に保つことを強制し、それによってMod作成へのアクセスを奨励することでした。
Hedra
基本的にゲーム全体です。AIロジック、コンポーネント、ワールド生成、モジュールシステム、オブジェクト配置、その他多くのものが含まれます。
Hedra.Engine
エンジンのコア部分であり、ワールドへのすべての抽象化を定義します。レンダリング、サウンド、さまざまな基本システム、および一般的なウィンドウ処理、ゲームループ、プラットフォーム機能を処理します。分割は最初から行われたわけではないため、一部のものがまだ外部にある可能性があります。
Framework
エンジンで使用されるコアプリミティブです。ヒープおよびスタックアロケータ、リストと配列のカスタム実装、ネイティブポインタのラッパー、その他の便利なプリミティブが含まれます。
HedraTests
テストスイート
Asset Builder
ゲームアセットを便利なバイナリファイルに圧縮するためのコマンドラインツールです。画像、モデル、サウンドファイル、シェーダーを、高速なデータ取得のために設計された構造を持つ単一のバイナリファイルに結合します。
Server
かつてHedraはマルチプレイヤーをサポートしていました。これはUDP Hole Punchingを行い、クライアントがP2Pで通信できるようにすることで機能しました。このサーバーがその役割を担っていました。Engineコードにネットワークの残骸が見られるかもしれません。
ビルド方法
ビルドプロセスは非常に簡単です。
- すべてのサブモジュールをチェックアウトします。
- ビルド依存関係スクリプトを実行します。
- C#ソリューションをコンパイルします。
LinuxおよびWindowsでの例については、GitHub Actionsのワークフローを確認してください。