MitiruEngine
ゲームを作っているうちに、エンジンの仕組みを自分の手で確かめたくなって書き始めた C++20 ゲームエンジンです。
header-only で配布するつもりで作っていて、使う側は CMake の FetchContent でリンクするだけで動かせます。動かしかたは 2 つあって、純 C++ だけの Native と、CEF + HTML/CSS/JS で UI を組む Hybrid。両方を残す方針です。
数字で見る
数値は 2026 年 5 月時点。
なぜ自分でエンジンを書くのか
Unity も Godot も Unreal も Siv3D も、ゲームを作るだけなら困らないくらいよくできています。それでも自分で書いているのは、ゲームが画面に出るまでに何がどう動いているのかを、使う側ではなく書く側から知っておきたかったからです。
エンジン開発が目的ではなくて、ゲームを深く作れる人間でいるための足場として書いています。ゲーム制作はゲーム制作で別に進めていて、そこで詰まったことがあると、こちらに書き戻すこともあります。
アーキテクチャ
レイヤースタックは以下のとおりです。Native(Mode A)と Hybrid(Mode B)は同じ C++ ランタイムを共有していて、Hybrid はその上に CEF と JS ランタイムが乗ります。
+----------------------------------------------------------+
| CEF / WEB RUNTIME (Mode B only) |
| web/mitiru_runtime/*.js -- mitiru.audio / .save / ... |
| HTML / CSS / JS gameplay loaded by CefStartUrl |
+----------------------------------------------------------+
| CEF HOST + JS BRIDGES (Mode B only) |
| mitiru::cef::* -- MitiruCefContext, AudioBridge, ... |
+----------------------------------------------------------+
| APPLICATION LAYER User Games (Game subclass) |
+----------------------------------------------------------+
| ENGINE / SCENE / ECS Engine, Clock, GameLoop, Screen, |
| SceneManager, GameWorld |
+----------------------------------------------------------+
| SUBSYSTEM Input, Audio, Physics, Network, Render, |
| Resource, Asset, Data, Control, Observe |
+----------------------------------------------------------+
| PLATFORM Win32Window | GlfwWindow | Sdl2Window |
| | EmscriptenWindow |
+----------------------------------------------------------+
| GRAPHICS IDevice 抽象の裏で |
| DX11 | DX12 | Vulkan | OpenGL | WebGL | Null|
+----------------------------------------------------------+
GPU バックエンドは全部 IDevice という同じインターフェイスの裏に隠してあります。GPU が無い CI 環境では NullDevice に自動で落とすので、テストはそのまま緑で回ります。
技術的なハイライト
Native / Hybrid の 2 つの動かしかた
純 C++ だけで動く Native(コンソールやモバイル、ヘッドレスを視野に)と、CEF + JS で UI を書ける Hybrid(デスクトップ向け、ノベルや経営シミュレーション系)。両方を残す方針で書いていて、その判断は docs/SCOPE.md に書いてあります。
マルチバックエンドの GPU 抽象
Windows なら DX11、Linux/macOS なら Vulkan、Web なら WebGL2、というふうに IDevice の裏でランタイム選択するようにしています。バックエンドを足しても引いても、上のアプリケーションコードは触らずに済みます。
Header-only と CMake FetchContent での配布
使う側は CMake で FetchContent_Declare して Mitiru::mitiru をリンクするだけ。ビルド済みバイナリを配る必要がないので、複数プロジェクトから同じエンジンを使い回しやすくしています。
専用 CLI (mitiru)
Go で書いた mitiru CLI が、プロジェクトの雛形生成からビルド、実行までを一通り面倒見ます。使う側は CMake の作法を覚えずにゲームを書き始められます。
付随する道具
- API カタログの自動生成(
tools/generate_api_catalog.py) - モジュール依存グラフの自動生成(
tools/generate_module_map.py) - 編集ファイルだけ高速にコンパイルチェック(
tools/quick_compile.py) - GitHub Actions による CI
- 専用のデザインシステム(
DESIGN.md)と UI トークン
MitiruEngine で動いているもの
エンジン単体ではなく、実際にゲームに使えている状態かどうかが重要なので、現時点で MitiruEngine 上で動いているプロジェクトを並べておきます。
-
ハトを育てよう(リメイク) —
2023 年に TyranoScript で書いた原作を、MitiruEngine CEF Hybrid +
mitiru.novelVM で完全移植。バックログ・既読管理・セーブロードなどの追加要素も入った状態で動いています。 - かえるクレープへようこそ — 当初は Godot で書いていましたが、現在 MitiruEngine の WASM ビルドへ移植中(1.0.0-rc1)。Playwright による E2E テスト、テーマトークン、itch.io 向けパッケージングまでセットアップ済み。
エンジンを書く作業と、エンジンでゲームを作る作業を、両方を行き来しながら進めています。