Turian 紹介:純粋な Zig による 3D ゲームエンジン
ゲームエンジンは往々にして選択を迫ります。ビジュアルエディタの生産性——シーン階層、インスペクタ、ドラッグ&ドロップアセット——を取るか、システム言語の制御性と予測可能性を取るか。どちらか一つです。
Turian はそのトレードオフを拒否します。 完全に Zig で書かれたコンポーネントベースの 3D ゲームエンジンであり、本日初めてウェブ上に公開ページを開設しました。
始まり
MEGA4 イニシアチブが始まったとき、計画は単純でした。Unity に着想を得たゲームエンジンとエディタを構築することです。当時、エンジンは C# で書かれており、v1 リリースと呼べる状態に近づいていました。
では、なぜ Zig なのか?
正直な答えは、技術的な理由よりも単純です。学びたかったからです。
Zig の言語機能を探る小さな実験から始まり、気づけばエンジンの部品を再構築している自分がいました。やがて、この副次的な探求は本格的なものになり、Turian を完全に作り直すことを決意しました。
この移行を大幅に容易にしたのが、既存の Zig GUI ライブラリ DVUI です。エディタ UI フレームワークをゼロから構築するのに何ヶ月も費やす代わりに、初日からエディタ機能に取り掛かることができました。
現在の状況
Turian は最初の実用的な形に到達し、v0.1 · Hello Game マイルストーン(Godot 3 とほぼ同等)への道を進んでいます:
- 本格的なエディタ。 Turian Studio は、シーン階層、インスペクタ、アセットブラウザ、そして SDL3 GPU(Vulkan / Metal / D3D12)によるライブ 3D ビューポートをすべて1つのウィンドウに統合しています。
- コンポーネントはただの struct。 任意の Zig struct に
pub const is_component = true;を追加するだけで、Add Component に表示され、公開フィールドがインスペクタに公開されます。エディタは実際の Zig ソースを(正規表現ではなく)パースするため、コメントや条件付きコンパイルで問題が生じることはありません。 - ライブスクリプト検出。
.zigファイルをプロジェクトのassets/にドロップし、Refresh を押すと、コンポーネントがすぐに利用可能になります。 - ヘッドレスビルド。
turian-cli buildがアセットを処理し、単一の自己完結型実行ファイルを出力します。これはエディタが生成するものとまったく同じアーティファクトであり、CI に最適です。
なぜ Zig なのか?
エンジン、エディタ、ゲームロジック、ビルドツールのすべてが Zig という単一言語で一貫しています。スクリプティングブリッジも FFI のオーバーヘッドもガベージコレクタもありません。書いたコードがそのままマシンで実行され——ゲームは単一のネイティブバイナリとして提供でき、何もインストールしていない友人にそのまま渡せます。
Zig の C 相互運用性は特筆に値します。ゲーム開発エコシステムは数十年にわたる C および C++ ソフトウェアの上に成り立っています:グラフィックス API、物理エンジン、アセットインポータ、オーディオシステム。C ライブラリを直接利用できることで、実績あるソリューションを統合するハードルが下がり、後で部分的に置き換えたり書き換えたりするオプションも残ります。
Zig が変えるもの
従来のエンジンから Zig への移行には考え方の転換が必要です。Zig にはクラス、継承、インターフェース、アトリビュート、そして一般的なランタイムリフレクションはありません。代わりに、コンポジション、明示性、コンパイル時プログラミングを重視します。
ランタイムリフレクションの代わりに Comptime。 Turian のコンポーネントシステムは Zig のコンパイル時機能を使用してコンポーネント定義を検査し、エディタ統合を自動生成します。エディタは実際の Zig ソースをパースして pub const is_component = true; を発見します——コメント、条件付きコンパイル、フォーマットはすべて正しく機能します。
明示的なメモリ管理。 異なるシステムはニーズに応じて異なる割り当て戦略を使用します:一時的なフレームアロケータ、永続的なシーンアロケータ、アセットローディング用アリーナなど。所有権についてより慎重に考える必要がありますが、エンジンコードにおいてこの制御は貴重です。
正直なトレードオフ
正直に認めるべき欠点もあります。Zig には安定した ABI がないため、エンジンをプリコンパイル済みライブラリとして配布できません。ゲームはエンジンソースと一緒にコンパイルされます。SDK がそのソースを提供し、Zig コンパイラはユーザー側で用意します。その代わり、実行時にバージョンの不一致が発生することはありません。
Zig を選ぶということは、多くの慣れ親しんだ便利機能がまだ存在しないことを受け入れることでもあります。継承、インターフェース、リフレクションで実装される機能は、コンポジションとコンパイル時プログラミングを中心とした異なるアプローチを必要とします。この言語はまだ若く、ツールは改善を続けており、ベストプラクティスもまだ確立されていません。
そして率直に言って、私も学んでいるところです。Zig で Turian を構築することは、コミュニティとともに学び、何が機能するかを見極め、必要に応じて方向転換し、数ヶ月前に完成したと思っていたシステムを時々再構築することを意味します。その不確実性もプロジェクトの一部です。
MEGA4 における位置づけ
Turian は Zig で動作する最初の MEGA4 プロジェクトです。そのエディタは、最終的に Gaya のプラグインとなり、Guinevere を GUI レイヤーとして使用する計画です——これはイニシアチブの他の部分と同じアーキテクチャです。これを使って構築される最初の実際のゲームは Mystery です。
今後の展望
Turian はマイルストーンごとにリリースされ、それぞれが実用的な飛躍を提供します。GitLab のライブロードマップをフォローしてください。今すぐ試したい方は、チュートリアルから始めてください。
GPLv3 のフリーソフトウェアです——シート料金も収益分配もタイトルごとの料金もありません。エディタでお会いしましょう。
#release#engine#mega4