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

ゲームイベントマネージャー

Game Event Managerは、システム全体の実行時の頭脳です。データ(イベント&フロー)をメモリにロードし、そのライフサイクルを管理し、リアルタイムテレメトリを提供する責任を担っています。

Dashboard(これは作成するためのツール)とは異なり、Managerはデータを保持するコンテナです。

alt text


🏗️ データアーキテクチャ

UIに入る前に、このシステムがどのようにデータを保存するかを理解することが重要です。

ストレージモデル

  1. コンテナベースストレージ: イベントは単独のファイルではありません。親データベースアセット(.asset)内のサブアセットとして保存されます。
  2. 関心の分離:
    • データベース: イベント定義(識別、名前、型)を保存。
    • フローグラフ: ロジックノード(トリガー、チェーン、接続)を保存。
  3. 「聖域」: デフォルトでは、すべてのアセットはAssets/TinyGiantsData/GameEventSystem/に作成されます。
重要: サブアセットを手動で削除しないこと

イベントはサブアセットであるため、データベースアセットを展開してプロジェクトビューから直接削除することは絶対にしないでください

正しいワークフロー:

理由は? 手動削除はGUID参照を破壊し、データベースの整合性を破損させます。


🗃️ データベース管理

このセクションは、シーン内でどのイベントセットがアクティブかを制御します。システムはマルチデータベースアーキテクチャをサポートしており、イベントを分割(例: 「Core」、「Combat」、「UI」)し、必要に応じてロードできます。

alt text

管理アクション

アクション説明
Active / Inactiveこのデータベースがロードされるかどうかを切り替えます。非アクティブなデータベースは、実行時にイベントルックアップを解決しません。
Remove (×)このリストからのみデータベースを削除します。プロジェクトからアセットファイルを削除しません
+ Create NewTinyGiantsData/GameEventSystem/Databaseフォルダに新しい.assetデータベースファイルを作成し、ここに追加します。
📂 Add Existing以前に作成したデータベースを追加するためにファイルピッカーを開きます(この操作はAssetsディレクトリ下のすべてのデータベースアセットを検索し、ドロップダウンリストに表示します)。

アクティブ vs 非アクティブの理解

アクティブデータベース(緑色のバッジ):

  • ✅ イベントはインスペクターでバインディング可能
  • ✅ イベントは実行時にトリガー可能
  • ✅ Game Event Editorの検索に表示される

非アクティブデータベース(黄色のバッジ):

  • ⏸️ リストから削除せずに一時的に無効化
  • 🔒 イベントはトリガーもバインドもできない
  • 💡 季節限定コンテンツやDLCイベントに有用
プロジェクトコンテキストメニュー

プロジェクトウィンドウで直接データベースを作成することもできます:

右クリック → Create → TinyGiants → Game Event System → Game Event Database

その後、**「Add Existing」**ボタンを介してManagerに追加します。


🕸️ フローグラフ管理

データベースと同様に、このセクションはビジュアルロジックコンテナを管理します。

alt text

フローコンテナとは?

フローコンテナは、複数の「フローグラフ」(ビジュアルイベントシーケンス)を保持するScriptableObjectです。

一般的なワークフロー:

  • グローバルフロー: すべてのシーンにわたってアクティブな永続ロジック(例: UIイベント、オーディオトリガー)
  • レベル固有フロー: シーンごとにロード/アンロード(例: ボス戦シーケンス、チュートリアルステップ)

管理アクション

データベースと同じコントロール:

  • Create New: 新しいフローコンテナアセットを生成
  • Add Existing: 以前に作成したフローコンテナを登録
  • Active/Inactive: フロー実行を有効化または無効化
  • Remove (×): Managerから登録解除(アセットは削除しない)
フローグラフの編集

フローグラフ自体は**Game Event Flow Editorで編集され、ここではありません。Managerはどのフローがロードされるか**のみを制御します。


📊 ライブ統計(テレメトリ)

インスペクターは、イベントシステムの健全性と構成を監視するための3つの専用パネルを提供します。

1. 概要統計

イベントのバインディングステータスを追跡します。

alt text

メトリック説明
Total Eventsすべてのアクティブデータベースにわたるイベントの総数。
Bound Events現在インスペクターで構成されている(ビジュアルバインディング)イベントの数。
Runtime Bindingコード(AddListener)を介してバインドされたイベントは、**Runtime Monitor**で別途追跡されます。

プログレスバー: バインド(リスナーで構成)されたイベントの割合を表示します。

プレイモード自動更新

プレイモード中、統計パネルは実行時リスナー登録を反映するために自動的に更新されます。コードでAddListener()を呼び出すと、バインドイベント数が変化します。


2. 構成

イベントアーキテクチャの複雑さの分布を示します。

alt text

カテゴリ定義使用例
Void Eventsシンプルなシグナル(パラメータなし)OnGameStartOnPauseOnButtonClick
Single Parameter型付きペイロードイベントOnHealthChanged(float)OnScoreUpdated(int)
With Senderソース認識イベントOnDamage(GameObject sender, float amount)

なぜこれが重要か:

  • Voidイベントの高い割合 = シンプルで保守しやすいアーキテクチャ
  • Senderイベントの高い割合 = 詳細な追跡を備えた複雑でデータリッチなシステム

3. イベント型レジストリ

プロジェクトで現在コンパイルされ、サポートされているすべてのデータ型のライブレジストリ。

組み込み型(すぐに使用可能)

システムには、使用法別に分類された32の標準型のネイティブサポートがプリロードされています:

📋 サポートされている組み込み型を表示
C# 型数学コンポーネントアセット
intVector2GameObjectSprite
floatVector3TransformTexture2D
doubleVector4RectTransformMaterial
boolVector2IntRigidbodyAudioClip
stringVector3IntRigidbody2DAnimationClip
byteQuaternionCollider
longRectCollider2D
charBoundsCamera
ColorLight
ParticleSystem

できること: コード生成なしで、これらの型のいずれかをすぐに使用してイベントを作成できます。

// 組み込み型イベントの例
[GameEventDropdown] GameEvent<int> OnScoreChanged;
[GameEventDropdown] GameEvent<Vector3> OnPositionUpdated;
[GameEventDropdown] GameEvent<GameObject> OnObjectSpawned;

カスタム & Sender型

カスタムクラス(例: PlayerStats)またはSenderイベント(例: <GameObject, DamageInfo>)を持つイベントを作成すると、コード生成後にこれらの型が自動的にこのリストに表示されます。

表示例:

alt text

作成プロセス:

  1. C#でカスタムクラスを記述
  2. **Game Event Creator**を使用してイベントを作成(コード生成&イベントサブアセット)
  3. 型がこのレジストリに表示される
  4. これで、カスタム型を使用してイベントアセットを作成可能

🛠 ベストプラクティス

✅ 推奨事項

データベースを分割する

より良い整理のためにモジュラー構造を維持:

📁 Database/
├─ Global_DB.asset (コアゲームイベント)
├─ Combat_DB.asset (戦闘固有イベント)
├─ UI_DB.asset (UIインタラクションイベント)
└─ Tutorial_DB.asset (チュートリアルシーケンスイベント)

利点:

  • より明確な整理
  • より簡単なコラボレーション(異なるチームメンバーが異なるデータベースで作業)
  • より良いパフォーマンス(必要なものだけをロード)

すべてのシーンにManagerを保持する

GameEventManagerオブジェクトがすべてのシーンに存在することを確認:

  • ManagerはDontDestroyOnLoadを使用してシーン間で永続化
  • 欠落している場合は、**Game Event System Window**を開いて自動作成

チームコラボレーションに「Add Existing」を使用

チームメイトと作業する場合:

  1. チームメイトがデータベースを作成し、バージョン管理にコミット
  2. 最新の変更をプル
  3. Managerインスペクターを開く → **「Add Existing」**をクリック
  4. 新しいデータベースを選択
  5. ✅ 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が見つからない

解決策:

  1. Tools → TinyGiants → Game Event Systemから**Game Event System Window**を開く
  2. 上部のステータスバーを確認
  3. 青いボタンが表示されている場合は、**「Initialize System」**をクリック
  4. Managerが自動作成される

イベントがエディターに表示されない

問題: ドロップダウンメニューや検索でイベントが見つからない。

チェックリスト:

  • ✅ データベースはアクティブ(緑色のバッジ)か?
  • ✅ データベースはManagerに追加されているか?
  • ✅ データベースに実際にイベントが存在するか?(**Game Event Editor**で確認)
  • ✅ Manager GameObjectはシーンに存在するか?

データベースが破損しているように見える

問題: インスペクターに「孤立したサブアセット」やデータベース整合性に関するエラーが表示される。

復旧:

  1. Managerコンポーネントを右クリック
  2. **「Clean Invalid Bindings」**を選択
  3. プロジェクトウィンドウでデータベースアセットを右クリック
  4. 「Validate Database」(利用可能な場合)を選択
  5. シーンを保存してUnityを再起動

予防: イベントを削除するには常にGame Event Editorを使用し、手動で行わないこと。

重要なポイント

Managerはデータコンテナです。図書館のように考えてください: データベースは本棚、イベントは本。Managerはどの本棚が開いているか(アクティブ)を決定し、誰がどの本を読んでいるか(バインディング)を追跡します。