メインコンテンツまでスキップ

アーキテクチャ概要

このガイドは完全な MCE C# ソースコードにアクセスできる Source ティア ユーザー向けです。

このドキュメントでは、Monster Capture Engine を構成するモジュール階層、アセンブリ構造、依存性注入パターン、主要なランタイムシステムについて解説します。

モジュール階層

MCE はレイヤードアーキテクチャに従ったモジュールで構成されています:

Assets/
OpenMon/
Core/
Runtime/ # コアエンジン(必須)
Initialization/ # エンジン起動、初回ウィザード
Monster/ # MonsterInstance、Roster、進化、繁殖
MonsterDatabase/ # ScriptableObject定義(種族、技、アイテム、特性)
Battle/ # BattleManager、15以上のモジュール、ステートマシン、AI
Characters/ # MCECharacterController、PlayerCharacter、フォロワー
Actors/ # Actorシステム、CommandGraphビジュアルスクリプティング
World/ # GridController、GlobalGridManager、タイル、エンカウント
Saves/ # SavegameManager、SavableObject、GameVariables
Player/ # GlobalGameData、プレイヤー状態
UI/ # 全UIコントローラーとビュー
Quests/ # クエストシステム(目標、報酬、追跡)
SDK/ # パブリックAPIインターフェース
GameFlow/ # ゲーム状態管理
Configuration/ # ScriptableObject設定
Rendering/ # URPシェーダー、時間帯、天候
Audio/ # AudioManager、BGM/SE/ME
Localization/ # 多言語対応
Editor/ # エディタ専用ツール
ArtGenerator/ # AIスプライト生成
MonsterCreator/ # モンスター作成ウィザード
Tools/ # データベースブラウザ、タイプチャートエディタ、バリデータ

依存関係ルール

  1. コアランタイムは外部依存なし -- Online や Importer モジュールへの依存はありません。
  2. オンライン機能はスクリプティング定義シンボルによるオプトイン。
  3. エディタコードは .asmdef 境界によりランタイムから厳密に分離。
  4. Runtime/SDK/ のSDKインターフェースがDLLティアユーザー向けのパブリックAPIサーフェス。

アセンブリ構造

MCE はコンパイル境界を強制するために Unity Assembly Definition を使用しています:

アセンブリ場所目的参照
OpenMon.MCE.RuntimeCore/Runtime/コアゲームシステム基盤ライブラリのみ
OpenMon.MCE.EditorCore/Editor/エディタツールRuntime + UnityEditor
MCE.Online.RuntimeMCE_Online/Runtime/NakamaネットワーキングRuntime + Nakama SDK
MCE.EssentialsImporter.EditorMCE_EssentialsImporter/Editor/インポートパイプラインRuntime + KaitaiStruct
MCE.Runtime.TestsCore/Tests/Runtime/コアテストRuntime + NUnit

Assembly Definition が重要な理由

  • コンパイル分離:エディタコードの変更でランタイムが再コンパイルされません。
  • 依存関係の強制:コンパイラがランタイムからエディタAPIを参照することを防ぎます。
  • ビルドストリッピング:エディタアセンブリはプレイヤービルドから除外されます。
  • テスト分離:テストアセンブリは内部にアクセスできますが、本番では公開されません。

依存性注入(Zenject)

MCE は依存性注入にインストーラーパターンの Zenject(Extenject)を使用しています。

インストーラーパターン

各サブシステムにはバインディングを登録する独自のインストーラーがあります。

主要インストーラー

インストーラーバインド
GameFlowInstallerコアゲームフローサービス
PlayerCharacterInstallerPlayerCharacter、キャラクターサービス
BattleLauncherInstallerBattleLauncher、バトルエントリポイント
GridInstallerGridController、タイルデータ
SavegameInstallerSavegameManager、シリアライゼーション
EvolutionManagerInstallerEvolutionManager

規約

  • バインディングは規約により .AsSingle().Lazy()(単一インスタンス、初回使用時に作成)。
  • [Inject] はコンストラクタではなく Construct() メソッドで使用。
  • DialogManager.Factory パターンがランタイムUIインスタンス化に使用。
  • シーンスコープのインストーラーがシーンごとのサービスを処理。
  • プロジェクトスコープのインストーラー(ProjectContext 内)がグローバルサービスを処理。

主要ランタイムシステム

MCEInitialization フロー

MCEInitialization はゲーム開始時に最初に実行されます:

1. 画面セットアップ(解像度、画面の向き)
2. データベースロード(モンスター、技、アイテム、特性)
3. ローカライゼーションデータのダウンロード(リモートの場合)
4. 初回ウィザードの実行(必要な場合)
5. サブシステムの初期化(セーブマネージャー、オーディオ、入力)
6. レディシグナル
7. メインメニューのロードまたはセーブデータの続行

モンスターシステム

MonsterEntry(ScriptableObject - 種族定義)
├── 種族値、タイプ、特性
├── DataByFormEntry[](フォームごとのオーバーライド)
├── EvolutionData[](進化パス)
└── 技リスト(レベルアップ、TM、タマゴ、教え)

MonsterInstance(ランタイム - 個体モンスター)
├── 種族参照(MonsterEntry)
├── レベル、経験値
├── 個体値[6]、努力値[6]
├── 性格
├── 現在HP、状態異常
├── MoveSlot[4](PP付き)
├── なつき度、OTデータ
└── フォームインデックス

Roster(最大6体の MonsterInstance のパーティ)
MonsterStorage(PCボックス)

バトルシステム

詳細はバトル内部構造をご覧ください。

コードスタイル

コードベースは以下の規約に従います:

  • 4スペースインデント、ブレースは新しい行。
  • PascalCase -- パブリック型、メソッド、プロパティ。
  • camelCase -- プライベートフィールドとローカル変数。
  • [SerializeField] private -- パブリックフィールドより優先。
  • .asmdef 境界による Runtime/Editor/ の分離。
  • Conventional Commits:feat:fix:docs:refactor:
シリアライズされたフィールドについて

マイグレーション計画なしにシリアライズされたフィールド名を変更しないでください。シーンとプレハブはシリアライズされたフィールド名に依存しています。名前変更には [FormerlySerializedAs("oldName")] を使用してください。

エンジンの拡張

新しいシステムの追加

  1. Runtime/YourSystem/ にクラスを作成。
  2. 依存性注入用のインストーラーを作成。
  3. 適切なシーンコンテキストまたはプロジェクトコンテキストにインストーラーを追加。
  4. セーブデータが必要な場合、SavableObject を拡張。
  5. エディタツールがある場合、Editor/YourSystem/ にクラスを作成。

パフォーマンスの考慮事項

  • データベース検索は図鑑番号で O(1)、名前で O(n)。名前検索を頻繁に呼び出す場合はキャッシュしてください。
  • バトルモジュールはバトルごとに1回初期化され、ターンごとではありません。
  • タイルマップは約200x200タイルでパフォーマンスの上限があります。大きなマップは分割してください。
  • セーブシリアライゼーションはメインスレッドで同期実行されます。セーブデータサイズを合理的に保ってください。
  • CommandGraph の実行はコルーチンベースです。多くのノードを持つ複雑なグラフはイベントスクリプティングには問題ありませんが、フレームごとのロジックには使用しないでください。