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

ランタイムモニター

ゲームイベントモニター (Game Event Monitor) は、実行中のイベントシステムの挙動を包括的に把握できる、強力なリアルタイム・デバッグおよび分析ツールです。パフォーマンスのボトルネックの特定、イベントフローの追跡、リスナー間の関係性の監視、複雑なイベントチェーンのデバッグをサポートします。


🎯 ランタイムモニターを使用する理由

強力な機能

ランタイムモニターは、イベント駆動型ゲームの開発とデバッグの方法を劇的に進化させます。

  • 🔍 リアルタイムの可視化 - イベントがいつ、どのようにトリガーされたかを正確に把握。
  • ⚡ パフォーマンス・プロファイリング - 処理の遅いリスナーを特定し、実行時間を最適化。
  • 📊 統計分析 - イベントの頻度、パターン、使用傾向を追跡。
  • 🔗 フローの可視化 - 複雑なトリガーやチェーンの関係を一目で理解。
  • ⚠️ 自動警告 - パフォーマンスの問題や潜在的な不具合を早期に発見。
  • 👂 リスナー・インスペクター - すべてのアクティブな購読(サブスクリプション)とそのソースを監視。
  • 📝 イベントログ - デバッグ用のスタックトレースを含む完全な実行履歴。

開発におけるメリット

開発上の利点
  • デバッグの高速化: どのイベントがどの順序で発行されたかを即座に確認。
  • パフォーマンスの最適化: ゲームプレイに影響を与える前に、遅いリスナーを特定して修正。
  • アーキテクチャの把握: イベントフローを視覚化し、クリーンなシステム設計を維持。
  • 問題の予防: メモリリークや再帰呼び出しなどの問題を自動的に検出。
  • チーム間の連携: イベントフローの視覚的表現をチームメンバーと共有。

🚀 モニターを開く

このユーティリティは Game Event System 内にあり、以下の方法でアクセスできます:

システムダッシュボードから:

Game Event System Window → "Game Event Monitor" をクリック

alt text

ウィンドウの管理

モニターウィンドウは、プレイモード中にアクセスしやすいよう、他のUnityエディタウィンドウと一緒にドッキングできます。Console(コンソール)やInspector(インスペクター)ウィンドウの近くにドッキングすることをお勧めします。


📱 インターフェースの概要

ウィンドウの初期状態

ゲームイベントモニターを最初に開いたとき、ウィンドウは 停止状態 (Stopped State) (プレイモード以外)で表示されます:

Monitor Window - Stopped State

停止状態の主な要素:

  • ヘッダーバー - Game Event Systemのロゴとウィンドウタイトルを表示。
  • ステータスインジケーター - グレーで "○ Stopped" と表示(プレイモード外)。
  • デバッガートグル - イベント追跡の有効/無効を切り替えるボタン。
  • タブナビゲーション - 8つのメインタブ(プレイモードに入るまでグレーアウト)。
  • プレイモードのプロンプト - プレイモードに入るよう促すメッセージ。
プレイモードが必要です

ランタイムモニターは プレイモード (Play Mode) 中にのみデータを収集・表示します。パフォーマンスへの影響を避けるため、エディットモード(編集モード)ではすべての監視機能が無効になります。


ウィンドウのコンポーネント

モニターのインターフェースは、以下の主要なエリアで構成されています:

1. ヘッダーバー

ウィンドウの上部にあり、以下の要素が含まれます:

  • 🎮 ロゴとタイトル - ブランドロゴとウィンドウの識別。

  • ステータスバッジ

    - 現在の状態を表示します:

    • Running (緑) - プレイモードがアクティブで、イベントを監視中。
    • Stopped (グレー) - エディットモードで、監視は行われていません。
  • デバッガートグル

    - イベントの追跡を制御します:

    • Debugger ON (緑) - イベントをアクティブに記録中。
    • Debugger OFF (赤) - 記録を停止中(パフォーマンスを節約)。

2. ナビゲーションツールバー

ヘッダーの下に、メインのナビゲーションタブがあります:

タブアイコン目的
Dashboard📊すべての監視データの概要
Performance実行時間の分析とプロファイリング
Recent📝時系列のイベントログ
Statistics📈イベントの頻度と使用パターンの分析
Warningsパフォーマンス上の問題や警告の表示
Listeners👂アクティブな購読状況の概要
Automation🔗トリガーとチェーンのフロー可視化
Details🔍選択したイベントの深掘り分析

3. 検索とコントロール

ツールバーの右側:

  • 検索フィールド - すべてのタブにわたってイベントをフィルタリング。
  • クリアメニュー - 各種データを消去するためのオプション。

📊 ダッシュボード (Dashboard) タブ

Dashboard は、イベントシステム全体の健全性とアクティビティのハイレベルな概要を提供します。

Dashboard Tab - Running State

メトリックカード

上部の4つのカードには、主要な統計情報が表示されます:

📊 Total Events (合計イベント数)

  • 内容: ゲーム内に存在するユニークなイベントの数。
  • 対象: すべてのアクティブなデータベースに含まれる全イベント。
  • 用途: イベントシステムの規模を把握。

📝 Total Logs (ログ合計)

  • 内容: 記録されたイベントの実行回数。
  • 更新: イベントが発行されるたびにリアルタイムで更新。
  • 用途: システム全体の活動量を追跡。

⚡ Monitored (監視対象)

  • 内容: パフォーマンスデータを持つイベントの数。
  • 基準: 少なくとも一度トリガーされたイベントのみカウント。
  • 用途: どのイベントにプロファイリング情報があるかを確認。

⚠ Warnings (警告数)

  • 内容: アクティブなパフォーマンス警告の数。
  • : 警告が存在する場合は赤色に変化。
  • 用途: 問題の早期発見。

アクティブなデータベースセクション

現在ロードされているゲームイベントデータベースを表示します:

📁 Active Databases (2)
├─ CoreEvents [42 Events] [PRIMARY]
└─ UIEvents [18 Events]

表示される情報:

  • データベース名とアセットへの参照。
  • データベースごとの合計イベント数。
  • メインデータベースを示す PRIMARY バッジ。
  • データベース名をクリックすると、Projectウィンドウでそのアセットを選択。

パフォーマンスの概要 (Performance Overview)

イベント実行の健全性を視覚的に表現します:

パフォーマンスレベル:

  • ✓ Good (緑) - 実行時間 1ms 未満。
  • ⚠ Warning (黄) - 実行時間 1-10ms。
  • ❌ Critical (赤) - 実行時間 10ms 以上。

視覚的内訳:

  • 各レベルの分布を示すカラーコードバー。
  • カテゴリごとのイベントの割合(%)。
  • 全イベントの平均実行時間。
  • 「View All →」をクリックするとPerformanceタブへジャンプ。
パフォーマンスの目標

スムーズなゲームプレイのために、90%以上のイベントを "Good" カテゴリに維持することを目指してください。"Critical" にあるイベントは即座に最適化する必要があります。

最近のアクティビティ (Recent Activity)

最後に発行された15件のイベントを表示します:

各エントリの表示項目:

  • [Timestamp] - イベントが発行された時間 (時:分:秒.ミリ秒)。
  • Event Name - トリガーされたイベント名。
  • Event Type - ジェネリック型 (例: GameEvent<int>)。

クイックアクション:

  • エントリをクリックすると詳細情報を表示。
  • プレイモード中にリアルタイムで更新。
  • 「View All →」をクリックすると、すべての履歴(Recentタブ)を表示。

クイック警告 (Quick Warnings)

アクティブな警告がある場合、下部に表示されます:

警告の種類:

  • 🔥 Performance - 実行が遅すぎるイベント。
  • ⚠️ High Frequency - 発行頻度が高すぎるイベント。
  • 💾 Memory - 潜在的なメモリの問題(GCなど)。
  • 🔄 Recursive - 無限ループの可能性がある再帰呼び出し。

警告ごとの情報:

  • 重要度を示すカラーアイコン。
  • 問題の明確な説明。
  • 影響を受けているイベントの数。
  • 「View All →」をクリックすると全リストを表示。

⚡ パフォーマンス (Performance) タブ

トリガーされたすべてのイベントに関する、詳細なパフォーマンスプロファイリングを提供します。

Performance Tab - Running State

ソートコントロール

タブの上部で、パフォーマンスデータを並べ替えることができます:

ソートオプション:

  • Avg Time ⬇️ - 平均実行時間(デフォルト、降順)。
  • Max Time - 最大実行時間。
  • Exec Count - 実行回数。
  • Listeners - 平均リスナー数。

ソート順:

  • ⬇️ 降順(高い順)。
  • ⬆️ 昇順(低い順)。
  • 同じボタンを再度クリックすると昇順/降順が切り替わります。

パフォーマンステーブル

各行には、単一イベントの包括的なメトリクスが表示されます:

カラム説明カラーコード
アイコンパフォーマンスレベル表示🟢 Good / 🟡 Warning / 🔴 Critical
Event Nameイベントのフルネーム青(クリック可能)
Avg Time平均実行時間緑 < 1ms, 黄 1-10ms, 赤 > 10ms
Min Time最速実行時間の記録グレー
Max Time最遅実行時間の記録10msを超えると赤色
Count合計実行回数
Listeners平均リスナー数
GCガベージコレクション発生量0より大きいと赤、0ならグレー
👂リスナー表示ボタンListenersタブを開く

パフォーマンスデータの読み方

行の例:

🟢 PlayerHealthChanged  1.2ms  0.8ms  3.5ms  Count: 156  Listeners: 4  GC: 0  [👂]

解釈:

  • ✅ イベントは良好に動作しています(緑アイコン)。
  • 平均実行時間は 1.2ms(許容範囲)。
  • 最速実行は 0.8ms、最遅実行は 3.5ms。
  • 156回トリガーされました。
  • 4つのアクティブリスナーがあります。
  • GC(ガベージコレクション)の発生はありません(素晴らしい!)。
パフォーマンスの危険信号
  • 平均時間が 5ms 以上: 最適化を検討すべき。
  • 最大時間が 16ms 以上: フレーム落ち(スタッター)の原因になります。
  • GC が 0 より大きい: ゴミを生成しています。アロケーションを避けるようリファクタリングしてください。
  • リスナー数が多い: リスナーの統合を検討してください。

クイックアクション

  • 👂 ボタン: そのイベント専用の Listeners タブへジャンプ。
  • 行をクリック: イベントを選択し、Details タブで詳細を表示。
  • 検索: 名前でリアルタイムにイベントをフィルタリング。

📝 最近のイベント (Recent Events) タブ

すべてのイベント実行の完全な時系列ログです。

Recent Events Tab - Running State

コントロールオプション

タブの上部にあるコントロール:

トグルオプション:

  • ☑️ Auto Scroll - 新しいイベントが追加された際に自動スクロール。
  • Show Stack Trace - 各イベントのコールスタックを表示。

ステータス表示:

  • "Showing X of Y" - 表示されている件数。

アクション:

  • 🗑 Clear Logs - 記録されたすべてのイベントログを消去。

ログエントリの形式

各ログエントリの表示内容:

[14:23:45.123]  F:1250  PlayerTakeDamage  <GameEvent<GameObject, DamageInfo>>  [Details]
📍 Called by: EnemyController.Attack()

エントリの構成要素:

  • [Timestamp] - 正確な実行時間 (時:分:秒.ミリ秒)。
  • F:#### - イベントが発行されたフレーム番号。
  • Event Name - トリガーされたイベントの名前。
  • [Type] - ジェネリック型のシグネチャ。
  • [Details] - 詳細情報を表示するボタン。
  • 📍 Caller Info - イベントを発行したメソッド。

スタックトレースビュー

Show Stack Trace が有効な場合、各エントリが展開されて以下のように表示されます:

at GameEventSystem.GameEvent.Raise()
at PlayerController.TakeDamage(float amount) in Assets/Scripts/Player.cs:line 45
at EnemyController.Attack() in Assets/Scripts/Enemy.cs:line 89
...

ユースケース:

  • イベントがどこでトリガーされているかを特定。
  • 予期しないイベント呼び出しのデバッグ。
  • 実行フローの把握。
  • 呼び出し元コード内のパフォーマンスボトルネックの特定。

検索とフィルタリング

検索ボックスを使用して、ログをフィルタリングできます:

  • イベント名(例: "Player")
  • イベント型(例: "GameObject")
  • 部分一致をサポート。
デバッグワークフロー
  1. Auto Scroll を有効にして、イベントの発生をリアルタイムで追跡。
  2. 問題を見つけたら Auto Scroll をオフにする。
  3. Show Stack Trace を有効にして呼び出し階層を確認。
  4. Details をクリックしてイベントの完全な情報を表示。
  5. これらのデータを使用して問題を特定し、修正。

📈 統計 (Statistics) タブ

時間の経過に伴うイベントの使用パターンと頻度を分析します。

Statistics Tab - Running State

ソートコントロール

異なるメトリクスで統計をソートできます:

ソートオプション:

  • Count ⬇️ - 合計実行回数(デフォルト)。
  • Frequency - 1秒あたりの発行回数。
  • Last Trigger - 最近発行されたイベント順。

統計テーブル

各行には使用状況のメトリクスが表示されます:

カラム説明解釈
Event Nameイベント名青色、クリック可能
Count合計実行回数緑色、多いほど頻繁に使用
Freq/sec1秒あたりのトリガー回数60回/秒を超えると赤色
Avg Intervalトリガー間の平均時間秒単位
Last Trigger最後の実行からの経過時間相対時間
View Logsそのイベントの全ログを表示Detailsタブを開く

頻度データの理解

行の例:

PlayerMoved  Count: 2,450  Freq/sec: 30.2/s  Avg Interval: 0.033s  Last Trigger: 2s ago  [View Logs]

分析:

  • 合計2,450回発行されました。
  • 1秒間に約30回トリガーされています(30 FPS環境では毎フレーム)。
  • トリガー間の平均間隔は0.033秒。
  • 最後に発行されたのは2秒前。

頻度の解釈:

  • < 1/秒: 低頻度イベント(ボスのスポーン、レベル遷移など)。
  • 1-10/秒: 通常のイベント(アビリティのクールダウン、アイテム回収など)。
  • 10-60/秒: 高頻度イベント(移動、入力ポーリングなど)。
  • > 60/秒: ⚠️ 非常に高頻度。最適化が必要な可能性があります。
高頻度警告

1秒間に60回を超える頻度で発行されるイベントは 赤色 で表示されます。必ずしも問題ではありませんが、以下を示唆している可能性があります:

  • 冗長なイベントの発行。
  • FixedUpdateで処理すべきイベントがUpdateで行われている。
  • バッチ処理可能な不要なイベントトラフィック。

ユースケース

未使用のイベントの特定:

  • Count を昇順にソート。
  • 回数が極端に少ないイベントは、デッドコード(不要なコード)である可能性があります。

パフォーマンスホットスポットの発見:

  • Frequency を降順にソート。
  • 高頻度イベントは、高度に最適化されている必要があります。

イベントタイミングのデバッグ:

  • Avg Interval をチェックしてイベントのパターンを把握。
  • 不規則な間隔はバグを示唆している場合があります。

最近のアクティビティの追跡:

  • Last Trigger を降順にソート。
  • 現在どのアクティビティが動いているかを確認。

⚠️ 警告 (Warnings) タブ

パフォーマンス上の問題や潜在的な不具合を自動的に検出します。

Warnings Tab - Running State

警告のカテゴリ

システムは以下の問題を自動的に検出します:

🔥 パフォーマンスの問題 (Performance Issues)

実行の遅延:

❌ CRITICAL
Slow Event Execution
実行に時間がかかりすぎています(平均 10ms 以上)
対象イベント (3): PlayerUpdate, EnemyAI, PhysicsSync

検出基準:

  • 平均実行時間 > 10ms。
  • 最大実行時間 > 16ms(60 FPSにおける1フレーム分)。

影響: フレーム落ちやスタッターの原因になります。

解決策: リスナーのコードを最適化し、重い処理をコルーチンへ移動。

⚡ 高頻度警告 (High Frequency Warnings)

過剰なトリガー:

⚠️ WARNING  
High Frequency Events
イベントが1秒間に60回以上発行されています
対象イベント (2): OnMouseMove, OnColliderCheck

検出基準:

  • 1秒あたりのトリガー数 > 60。

影響: CPUのオーバーヘッド、不必要な処理の発生。

解決策: アップデートのバッチ化、スロットリング(間引き処理)の使用、設計の見直し。

💾 メモリ警告 (Memory Warnings)

GCアロケーションの検出:

⚠️ WARNING
Garbage Collection Detected
実行中にGCアロケーション(ゴミの生成)が発生しています
対象イベント (5): SpawnParticle, CreateUI, LoadAsset

検出基準:

  • 1回の実行あたりの GC アロケーション > 0。

影響: ガベージコレクションによる一時停止(スパイク)、フレーム落ち。

解決策: オブジェクトプーリングの使用、ホットパス(頻繁に呼ばれる処理)での新規オブジェクト生成の回避。

🔄 再帰呼び出しの検出 (Recursive Call Detection)

無限ループの可能性:

❌ CRITICAL
Possible Recursive Event
イベントが自身をトリガーし、ループを作成している可能性があります
対象イベント (1): OnValueChanged

検出基準:

  • 自身のリスナー内からイベントが発行されている。
  • スタックトレースが再帰を示している。

影響: スタックオーバーフロー、Unityのフリーズ。

解決策: 再帰ガード(フラグ)の追加、イベントフローの再設計。

警告カードのレイアウト

各警告には以下が表示されます:

ヘッダー:

  • 重要度を示すアイコン(🔥/⚠️/ℹ️)。
  • 警告の種類(例: "Slow Execution")。
  • 重要度バッジ (CRITICAL / WARNING / INFO)。

本文:

  • 問題の明確な説明。
  • 影響の説明。
  • 対象イベントの数。

イベントリスト:

  • 影響を受けているイベントを最大5つ表示。
  • それぞれに [View] ボタンがあり、詳細を調査可能。
  • 5つ以上ある場合は "...and X more" と表示。

重要度レベル

レベルカラー優先度必要なアクション
CRITICAL🔴 赤最優先リリース前に修正必須
WARNING🟡 黄重要最適化を推奨
INFO🔵 青情報提供のみ

警告がない状態

すべてが正常に動作している場合:

✅ All Good!
パフォーマンスの問題や警告は検出されませんでした。
ベストプラクティス

開発中は定期的に Warnings タブを確認してください。早期に警告に対処することで、パフォーマンスの問題が蓄積し、後から修正が困難になるのを防げます。

👂 リスナー (Listeners) タブ

すべてのアクティブなイベント購読状況を包括的に把握できます。

Listeners Tab - Running State

リスナーカード

アクティブなリスナーを持つ各イベントが、展開可能なカードとして表示されます:

カードヘッダー:

EventName  ⭐ (常駐の場合)     Total: 12
  • Event Name: イベント名(青色、太字)。
  • ⭐ アイコン: 常駐(Persistent)イベントの場合に表示(シーンを跨いで生存)。
  • Total Count: すべてのリスナータイプの合計(緑色)。

リスナータイプの詳細

各カードには、異なるリスナータイプを表す6つのブロックが表示されます:

視覚的レイアウト

┌─────────────┬─────────────┬─────────────┬─────────────┬─────────────┬─────────────┐
│ Basic(Insp) │ Basic(API) │Priority(API)│ Cond(API) │Persist(Insp)│Persist(API) │
│ 3 │ 2 │ 4 │ 1 │ 0 │ 2 │
└─────────────┴─────────────┴─────────────┴─────────────┴─────────────┴─────────────┘

ブロックの種類

ブロック説明ソース
Basic (Insp)インスペクターからの基本リスナー🔵 青 (Inspector)
Basic (API)コードからの基本リスナー⚫ 黒 (API)
Priority (API)コードからの優先度付きリスナー⚫ 黒 (API)
Cond (API)コードからの条件付きリスナー⚫ 黒 (API)
Persist (Insp)インスペクターからの常駐リスナー🔵 青 (Inspector)
Persist (API)コードからの常駐リスナー⚫ 黒 (API)

カラーコード

  • 🔵 青色ブロック: Unityインスペクター(GameEventManager)で設定されたもの。
  • ⚫ 黒色ブロック: コード(AddListener, AddPriorityListener等)で登録されたもの。
  • 薄い/グレー: そのタイプのリスナーは存在しません(カウント = 0)。
  • 白文字の数字: 現在アクティブなリスナーの数。

データの理解

カードの例:

PlayerHealthChanged     Total: 8

Basic(Insp): 2 Basic(API): 1 Priority(API): 3 Cond(API): 1 Persist(Insp): 0 Persist(API): 1

解釈:

  • 合計8つのリスナーがこのイベントを購読しています。
  • 2つはGameEventManagerで設定された基本リスナー。
  • 1つはコードで追加された基本リスナー。
  • 3つは優先度付きリスナー(コードベース)。
  • 1つは条件付きリスナー(コードベース)。
  • 1つは常駐リスナー(コードベース、シーン遷移を跨ぐ)。

特殊なインジケーター

常駐 (Persistent) イベントカード:

  • 名前の横に ⭐ スターアイコン が表示されます。
  • ツールチップ: "Persistent Event"。
  • Basic (Insp) は常に 0 となり、代わりに Persist (Insp) にインスペクター上のリスナー数が表示されます。

選択されたイベント:

  • カードの背景が青色にハイライトされます。
  • 詳細を表示するために選択されている状態を示します。

ユースケース

購読トラブルのデバッグ:

  • リスナーが正しく登録されているか確認。
  • リスナーが適切に削除されているか確認。
  • 解除忘れによるメモリリークの特定。

アーキテクチャの分析:

  • インスペクター経由とコード経由のリスナーのバランスを確認。
  • 購読数が多すぎるイベント(最適化が必要な候補)を特定。
  • システム全体のリスナー分布を把握。

パフォーマンス計画:

  • リスナー数が多いほど、イベント発行時のCPU負荷が高くなります。
  • 複数のリスナーを1つに統合できるか検討。
  • すべてのリスナーが本当に必要か評価。
メモリリークの検出

時間の経過とともにリスナー数が増え続けている場合(特にシーン遷移後)、メモリリークが発生している可能性があります。オブジェクトは OnDisable() または OnDestroy() で適切に RemoveListener を行う必要があります。


🔗 オートメーション (Automation) タブ

トリガーやチェーンイベントのフローを視覚的に表現します。

表示モード

トグルオプション:

  • ☑️ Tree View - ルートイベントから始まる完全な階層を表示。
  • Flat View - すべてのオートメーションをフラットなリストで表示(階層なし)。

ツリービュー (推奨)

Automation Tab - Full Tree

ルートイベント(他のイベントからトリガーされていない起点となるイベント)から始まるフローを表示します:

ツリー構造の例

▶ RootEvent                                      🎯 Source
└─ 🕹️ ChildTrigger1
└─ 🕹️ ChildTrigger2
└─ 🔗 ChainNode1 ⏱ 2s Wait
└─ 🔗 ChainNode2 ⏳ 1s Wait
└─ 🔗 ChainNode3

フラットビュー

Automation Tab - Flat Tree

階層を無視し、イベントがどのように繋がっているかをリニアなリストとして表示します。

フラット構造の例

▶ RootEvent                                      🎯 Source
└─ 🕹️ ChildTrigger1

▶ RootEvent 🎯 Source
└─ 🕹️ ChildTrigger2

▶ RootEvent 🎯 Source
└─ 🔗 ChainNode1 ⏱ 2s Wait

▶ 🔗 ChainNode1 🎯 Source
└─ 🔗 ChainNode2 ⏳ 1s Wait

▶ 🔗 ChainNode2 🎯 Source
└─ 🔗 ChainNode3

視覚情報の理解

ノードの種類

アイコンタイプ説明カラー
Root起点となるイベント(他から呼ばれていない)🔵 シアン
🕹️Trigger並列ファンアウトノード🟢 緑
🔗Chain直列ブロッキングノード🟠 オレンジ

ノード情報

各ノードに表示される内容:

左側:

  • ツリーの接続線 (└─)
  • タイプアイコン (▶/🕹️/🔗)
  • イベント名(タイプごとに色分け)
  • イベント GUID(デバッグ用に薄く表示)

右側のステータスアイコン:

  • 🎯 Source - 起点(ルート)イベント。
  • 🧩 - 条件関数が設定されています。
  • ⏱ Xs Wait - 実行前に X 秒の遅延があります。
  • ⏳ Xs Wait - 実行後に X 秒間待機(ブロック)します。
  • - 非同期処理の完了を待機します。

フローパターンの読み方

シンプルなファンアウト (Triggers)

▶ ButtonClicked
└─ 🕹️ PlaySound
└─ 🕹️ ShowFeedback
└─ 🕹️ LogAnalytics

パターン: 並列実行 挙動: ボタンがクリックされると、これら3つのイベントが同時に発行されます。 用途: 独立した副作用の同時実行。

シーケンシャルチェーン (Chains)

▶ StartCutscene
└─ 🔗 FadeOut ⏱ 0s Wait ⏳ 1s Wait
└─ 🔗 LoadScene ⏱ 0s Wait ⏳ 2s Wait
└─ 🔗 FadeIn ⏱ 0.5s Wait

パターン: 遅延を伴う直列実行 挙動:

  1. FadeOut が実行され、1秒待機。
  2. LoadScene が実行され、2秒待機。
  3. 0.5秒の遅延後、FadeIn が実行。 用途: カットシーン、チュートリアル、ロードシーケンス。

複雑なハイブリッド

▶ EnemyDefeated
└─ 🕹️ StopMusic
└─ 🕹️ PlayVictorySound
└─ 🔗 ShowRewards ⏱ 1s Wait
└─ 🔗 SaveGame
└─ 🕹️ SpawnLoot 🧩

パターン: 並列と直列の混合 挙動:

  • 音楽/SE は即座に発行(並列)。
  • 報酬表示は1秒後に行われ、その後にゲーム保存(直列)。
  • アイテムドロップは条件を満たした場合のみ発生(条件付き並列)。

ステータスアイコン・リファレンス

アイコン意味詳細
🎯 Sourceルートイベント他のどのイベントからもトリガーされていない起点
🧩条件付き条件チェックがあり、実行されない可能性があります
⏱ Xs開始遅延実行前に X 秒待機します
⏳ Xs継続待機実行後に X 秒待機します(後続をブロック)
非同期待機コルーチンや async 処理の完了を待機します

再帰の検出

イベントが自身をトリガーしている場合(直接的または間接的)、無限表示を防ぐためにツリーは再帰ノードで停止します:

▶ OnValueChanged
└─ 🔗 UpdateValue
└─ 🔗 OnValueChanged ⚠️ (Recursive - 停止)
再帰警告

再帰的なイベントフローは Warnings タブに「無限ループの可能性」として表示されます。実際の再帰を防ぐために、常にコード内でガード(フラグ管理)を行ってください。


🔍 詳細 (Details) タブ

個別のイベント情報や実行履歴を深掘りして調査します。

Details Tab - Log View

ナビゲーション

以下のアクションで、Details タブが自動的に開きます:

  • Recent Events タブの [Details] ボタンをクリック。
  • Statistics タブの [View Logs] ボタンをクリック。
  • Warnings タブの [View] ボタンをクリック。

タブ上部:

  • ← Back to [Previous Tab] - 前にいたタブへ戻る。

ログ詳細ビュー (Log Details View)

特定のログエントリを表示しているとき:

イベント情報カード:

フィールド説明
Event Nameイベントのフルネーム
Event Typeジェネリック型 (例: GameEvent<float>)
Time正確なタイムスタンプ (時:分:秒.ミリ秒)
Frame発行されたフレーム番号
Arguments渡された引数の値
Called Byイベントを発行したメソッド

スタックトレースセクション:

Stack Trace:
at TinyGiants.GameEventSystem.Runtime.GameEvent`1.Raise(T argument)
at PlayerController.TakeDamage(Int32 damage) in Assets/Scripts/PlayerController.cs:line 142
at EnemyController.Attack() in Assets/Scripts/EnemyController.cs:line 89
at EnemyController.Update() in Assets/Scripts/EnemyController.cs:line 52
...

ユースケース:

  • イベントの起点(オリジン)を追跡。
  • 予期しないイベント呼び出しのデバッグ。
  • 呼び出しチェーンの把握。
  • 呼び出し元コードのボトルネック特定。

イベント統計ビュー (Event Statistics View)

Details Tab - Statistics View

特定のイベントのすべてのログを表示しているとき:

ヘッダー:

Event: PlayerHealthChanged     Total: 245 triggers

使用統計カード (Usage Statistics):

メトリック説明
Trigger Count合計実行回数
Frequency1秒あたりの発行回数
Avg Intervalトリガー間の平均時間
Last Trigger最後の実行からの相対時間

パフォーマンスメトリクスカード (利用可能な場合):

メトリック説明カラー
Avg Time平均実行時間緑/黄/赤
Max Time最遅実行時間
Min Time最速実行時間グレー
GC AllocGC(ゴミ生成)アロケーション0より多いと赤色

最近のログ: このイベントの最新50件の実行を新しい順に表示します:

[14:52:33.145]  F:3201  PlayerHealthChanged  <GameEvent<float>>  [Details]
📍 Called by: DamageSystem.ApplyDamage()

[14:52:31.089] F:3180 PlayerHealthChanged <GameEvent<float>> [Details]
📍 Called by: HealthRegen.Tick()

ユースケース

イベント問題のデバッグ:

  1. Recent Events タブへ移動。
  2. 問題のあるエントリを見つける。
  3. [Details] をクリックしてスタックトレースを確認。
  4. 呼び出し元のコードを特定。
  5. 問題を修正。

パフォーマンス分析:

  1. Statistics タブへ移動。
  2. 遅いイベントの [View Logs] をクリック。
  3. パフォーマンスメトリクスを確認。
  4. 実行パターンをチェック。
  5. データに基づいて最適化。

イベントフローの理解:

  1. イベントチェーンをトリガーする。
  2. 各イベントのログを確認。
  3. 実行順序を検証。
  4. イベント間のタイミングをチェック。
  5. 挙動が正しいか検証。

🛠️ 高度な機能

デバッガーコントロール

デバッガートグルボタン(ヘッダー部):

  • ● Debugger ON (緑) - すべてのイベントデータの記録を有効化。
  • ○ Debugger OFF (赤) - 記録を停止(パフォーマンスを節約)。

オフにするべき状況:

  • パフォーマンスが重要なゲームプレイテスト中。
  • ゲームプレイ動画の録画中。
  • エディタのオーバーヘッドを最小限にしたいとき。
  • モニタリングが不要なとき。
パフォーマンスへの影響

デバッガーの負荷は極めて最小限(1イベントあたり約 0.1~0.5ms)ですが、最終的なパフォーマンス計測時にはオフにすることで最も正確な数値を測定できます。

データの消去 (Clear) オプション

🗑 Clear ボタンをクリックして以下のオプションにアクセスできます:

クリアメニュー:

  • Clear Logs Only - イベントの実行履歴ログのみを消去。
  • Clear Statistics Only - トリガー回数や頻度データをリセット。
  • Clear Performance Data - 実行時間の測定値をリセット。
  • Clear All Data - 全データを完全にリセット(確認が必要です)。