ゲームイベントマネージャー
Game Event Managerは、システム全体の実行時の頭脳です。データ(イベント&フロー)をメモリにロードし、そのライフサイクルを管理し、リアルタイムテレメトリを提供する責任を担っています。
Dashboard(これは作成するためのツール)とは異なり、Managerはデータを保持するコンテナです。

🏗️ データアーキテクチャ
UIに入る前に、このシステムがどのようにデータを保存するかを理解することが重要です。
ストレージモデル
- コンテナベースストレージ: イベントは単独のファイルではありません。親データベースアセット(
.asset)内のサブアセットとして保存されます。 - 関心の分離:
- データベース: イベント定義(識別、名前、型)を保存。
- フローグラフ: ロジックノード(トリガー、チェーン、接続)を保存。
- 「聖域」: デフォルトでは、すべてのアセットは
Assets/TinyGiantsData/GameEventSystem/に作成されます。
イベントはサブアセットであるため、データベースアセットを展開してプロジェクトビューから直接削除することは絶対にしないでください。
正しいワークフロー:
- ✅ イベントを削除するには: **Game Event Editor**を使用
- ✅ フローを削除するには: **Game Event Flow Editor**を使用
理由は? 手動削除はGUID参照を破壊し、データベースの整合性を破損させます。
🗃️ データベース管理
このセクションは、シーン内でどのイベントセットがアクティブかを制御します。システムはマルチデータベースアーキテクチャをサポートしており、イベントを分割(例: 「Core」、「Combat」、「UI」)し、必要に応じてロードできます。

管理アクション
| アクション | 説明 |
|---|---|
| Active / Inactive | このデータベースがロードされるかどうかを切り替えます。非アクティブなデータベースは、実行時にイベントルックアップを解決しません。 |
| Remove (×) | このリストからのみデータベースを削除します。プロジェクトからアセットファイルを削除しません。 |
| + Create New | TinyGiantsData/GameEventSystem/Databaseフォルダに新しい.assetデータベースファイルを作成し、ここに追加します。 |
| 📂 Add Existing | 以前に作成したデータベースを追加するためにファイルピッカーを開きます(この操作はAssetsディレクトリ下のすべてのデータベースアセットを検索し、ドロップダウンリストに表示します)。 |
アクティブ vs 非アクティブの理解
アクティブデータベース(緑色のバッジ):
- ✅ イベントはインスペクターでバインディング可能
- ✅ イベントは実行時にトリガー可能
- ✅ Game Event Editorの検索に表示される
非アクティブデータベース(黄色のバッジ):
- ⏸️ リストから削除せずに一時的に無効化
- 🔒 イベントはトリガーもバインドもできない
- 💡 季節限定コンテンツやDLCイベントに有用
プロジェクトウィンドウで直接データベースを作成することもできます:
右クリック → Create → TinyGiants → Game Event System → Game Event Database
その後、**「Add Existing」**ボタンを介してManagerに追加します。
🕸️ フローグラフ管理
データベースと同様に、このセクションはビジュアルロジックコンテナを管理します。

フローコンテナとは?
フローコンテナは、複数の「フローグラフ」(ビジュアルイベントシーケンス)を保持するScriptableObjectです。
一般的なワークフロー:
- グローバルフロー: すべてのシーンにわたってアクティブな永続ロジック(例: UIイベント、オーディオトリガー)
- レベル固有フロー: シーンごとにロード/アンロード(例: ボス戦シーケンス、チュートリアルステップ)
管理アクション
データベースと同じコントロール:
- Create New: 新しいフローコンテナアセットを生成
- Add Existing: 以前に作成したフローコンテナを登録
- Active/Inactive: フロー実行を有効化または無効化
- Remove (×): Managerから登録解除(アセットは削除しない)
フローグラフ自体は**Game Event Flow Editorで編集され、ここではありません。Managerはどのフローがロードされるか**のみを制御します。
📊 ライブ統計(テレメトリ)
インスペクターは、イベントシステムの健全性と構成を監視するための3つの専用パネルを提供します。
1. 概要統計
イベントのバインディングステータスを追跡します。

| メトリック | 説明 |
|---|---|
| Total Events | すべてのアクティブデータベースにわたるイベントの総数。 |
| Bound Events | 現在インスペクターで構成されている(ビジュアルバインディング)イベントの数。 |
| Runtime Binding | コード(AddListener)を介してバインドされたイベントは、**Runtime Monitor**で別途追跡されます。 |
プログレスバー: バインド(リスナーで構成)されたイベントの割合を表示します。
プレイモード中、統計パネルは実行時リスナー登録を反映するために自動的に更新されます。コードでAddListener()を呼び出すと、バインドイベント数が変化します。
2. 構成
イベントアーキテクチャの複雑さの分布を示します。

| カテゴリ | 定義 | 使用例 |
|---|---|---|
| Void Events | シンプルなシグナル(パラメータなし) | OnGameStart、OnPause、OnButtonClick |
| Single Parameter | 型付きペイロードイベント | OnHealthChanged(float)、OnScoreUpdated(int) |
| With Sender | ソース認識イベント | OnDamage(GameObject sender, float amount) |
なぜこれが重要か:
- Voidイベントの高い割合 = シンプルで保守しやすいアーキテクチャ
- Senderイベントの高い割合 = 詳細な追跡を備えた複雑でデータリッチなシステム
3. イベント型レジストリ
プロジェクトで現在コンパイルされ、サポートされているすべてのデータ型のライブレジストリ。
組み込み型(すぐに使用可能)
システムには、使用法別に分類された32の標準型のネイティブサポートがプリロードされています:
📋 サポートされている組み込み型を表示
| C# 型 | 数学 | コンポーネント | アセット |
|---|---|---|---|
int | Vector2 | GameObject | Sprite |
float | Vector3 | Transform | Texture2D |
double | Vector4 | RectTransform | Material |
bool | Vector2Int | Rigidbody | AudioClip |
string | Vector3Int | Rigidbody2D | AnimationClip |
byte | Quaternion | Collider | |
long | Rect | Collider2D | |
char | Bounds | Camera | |
Color | Light | ||
ParticleSystem |
できること: コード生成なしで、これらの型のいずれかをすぐに使用してイベントを作成できます。
// 組み込み型イベントの例
[GameEventDropdown] GameEvent<int> OnScoreChanged;
[GameEventDropdown] GameEvent<Vector3> OnPositionUpdated;
[GameEventDropdown] GameEvent<GameObject> OnObjectSpawned;
カスタム & Sender型
カスタムクラス(例: PlayerStats)またはSenderイベント(例: <GameObject, DamageInfo>)を持つイベントを作成すると、コード生成後にこれらの型が自動的にこのリストに表示されます。
表示例:

作成プロセス:
- C#でカスタムクラスを記述
- **Game Event Creator**を使用してイベントを作成(コード生成&イベントサブアセット)
- 型がこのレジストリに表示される
- これで、カスタム型を使用してイベントアセットを作成可能
🛠 ベストプラクティス
✅ 推奨事項
データベースを分割する
より良い整理のためにモジュラー構造を維持:
📁 Database/
├─ Global_DB.asset (コアゲームイベント)
├─ Combat_DB.asset (戦闘固有イベント)
├─ UI_DB.asset (UIインタラクションイベント)
└─ Tutorial_DB.asset (チュートリアルシーケンスイベント)
利点:
- より明確な整理
- より簡単なコラボレーション(異なるチームメンバーが異なるデータベースで作業)
- より良いパフォーマンス(必要なものだけをロード)
すべてのシーンにManagerを保持する
GameEventManagerオブジェクトがすべてのシーンに存在することを確認:
- Managerは
DontDestroyOnLoadを使用してシーン間で永続化 - 欠落している場合は、**Game Event System Window**を開いて自動作成
チームコラボレーションに「Add Existing」を使用
チームメイトと作業する場合:
- チームメイトがデータベースを作成し、バージョン管理にコミット
- 最新の変更をプル
- Managerインスペクターを開く → **「Add Existing」**をクリック
- 新しいデータベースを選択
- ✅ GUID参照は無傷のまま、リンク切れなし!
❌ 非推奨事項
アセットを手動で削除しない
❌ 誤り: Project Window → データベースアセットを展開 → イベントサブアセットを削除
✅ 正解: Game Event Editor → イベントを選択 → 削除ボタンをクリック
理由は? 手動削除はデータベースを破損し、すべての参照を壊します。
Pluginsフォルダに移動しない
データフォルダ(TinyGiantsData)をPluginsフォルダの外に保持:
✅ 正解: Assets/TinyGiantsData/GameEventSystem/
❌ 誤り: Assets/Plugins/TinyGiantsData/GameEventSystem/
🔧 インスペクターコンテキストメニュー
GameEventManagerコンポーネントを右クリックしてユーティリティコマンドにアクセス:
Clean Invalid Bindings
目的: アクティブなデータベースに存在しなくなったイベントバインディングを削除します。
使用する場合:
- Game Event Editorを介してイベントを削除した後
- Managerからデータベースを削除した後
- 古いプロジェクトをクリーンアップする場合
動作内容: すべてのバインディングをスキャンし、孤立した参照を削除します。
Sync All Database Events
目的: Managerの内部バインディングリストをアクティブなデータベース内のすべてのイベントと同期します。
使用する場合:
- 別のプロジェクトからイベントをインポートした後
- 多くのイベントを含む新しいデータベースを追加した後
- バインディングリストが同期していないように見える場合
動作内容:
- 新しいイベントのバインディングを追加
- 削除されたイベントのバインディングを削除
- 既存の構成を保持
❓ トラブルシューティング
Managerオブジェクトが欠落
問題: シーンヒエラルキーでGameEventManagerが見つからない
解決策:
Tools → TinyGiants → Game Event Systemから**Game Event System Window**を開く- 上部のステータスバーを確認
- 青いボタンが表示されている場合は、**「Initialize System」**をクリック
- Managerが自動作成される
イベントがエディターに表示されない
問題: ドロップダウンメニューや検索でイベントが見つからない。
チェックリスト:
- ✅ データベースはアクティブ(緑色のバッジ)か?
- ✅ データベースはManagerに追加されているか?
- ✅ データベースに実際にイベントが存在するか?(**Game Event Editor**で確認)
- ✅ Manager GameObjectはシーンに存在するか?
データベースが破損しているように見える
問題: インスペクターに「孤立したサブアセット」やデータベース整合性に関するエラーが表示される。
復旧:
- Managerコンポーネントを右クリック
- **「Clean Invalid Bindings」**を選択
- プロジェクトウィンドウでデータベースアセットを右クリック
- 「Validate Database」(利用可能な場合)を選択
- シーンを保存してUnityを再起動
予防: イベントを削除するには常にGame Event Editorを使用し、手動で行わないこと。
Managerはデータコンテナです。図書館のように考えてください: データベースは本棚、イベントは本。Managerはどの本棚が開いているか(アクティブ)を決定し、誰がどの本を読んでいるか(バインディング)を追跡します。