APIリファレンス
GameEventシステムの完全なAPIリファレンスドキュメントです。すべてのイベント型は、イベント駆動アーキテクチャのための包括的な機能を備えた厳格な型安全インターフェースを実装しています。
すべてのクラスとインターフェースはTinyGiants.GameEventSystem.Runtime名前空間に配置されています。
using TinyGiants.GameEventSystem.Runtime;
イベント型の概要
GameEventシステムは3つのイベント型バリアントを提供します
| 型 | 説明 |
|---|---|
GameEvent | シンプルな通知のためのパラメータなしイベント |
GameEvent<T> | 型付きデータを渡すための単一引数イベント |
GameEvent<TSender, TArgs> | 送信者を認識した通信のための二重引数イベント |
以下のすべてのメソッドは、適切なパラメータのバリエーションを持ち、これらの型全体で使用できます。
🚀 イベントの発行とキャンセル
Raise()
イベントを即座にトリガーし、登録されたすべてのリスナーを実行順序で呼び出します。
実行順序: Basic → Priority → Conditional → Persistent → Triggers → Chains
- GameEvent
- GameEvent<T>
- GameEvent<TSender, TArgs>
void Raise();
使用例:
myEvent.Raise();
void Raise(T argument);
パラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
argument | T | すべてのリスナーに渡されるデータペイロード |
使用例:
// float値で発行
healthEvent.Raise(50.5f);
// カスタム型で発行
scoreEvent.Raise(new ScoreData { points = 100, combo = 5 });
void Raise(TSender sender, TArgs args);
パラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
sender | TSender | イベントをトリガーするソースオブジェクト |
args | TArgs | リスナーに渡されるデータペイロード |
使用例:
// GameObjectの送信者とダメージデータで発行
damageEvent.Raise(this.gameObject, new DamageInfo(10));
// プレイヤーの送信者で発行
playerEvent.Raise(playerInstance, new PlayerAction { type = "Jump" });
Cancel()
このイベントアセットに対して、Inspectorで設定されたアクティブなスケジュール実行(遅延または繰り返し)を停止します。
void Cancel();
使用例:
// Inspectorで設定された自動繰り返しを停止
myEvent.Cancel();
これはInspectorの「スケジュール設定」によって開始されたスケジュールのみをキャンセルします。RaiseDelayed()またはRaiseRepeating()で作成された手動スケジュールはキャンセルされません。それらにはCancelDelayed(handle)またはCancelRepeating(handle)を使用してください。
⏱️ 時間ベースのスケジューリング
RaiseDelayed()
指定された遅延後に一度だけイベントを発行するようスケジュールします。
- GameEvent
- GameEvent<T>
- GameEvent<TSender, TArgs>
ScheduleHandle RaiseDelayed(float delay);
パラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
delay | float | イベント発行前の待機時間(秒) |
戻り値: ScheduleHandle - キャンセル用のハンドル
使用例:
// 5秒後に発行
ScheduleHandle handle = myEvent.RaiseDelayed(5f);
// 必要に応じてキャンセル
myEvent.CancelDelayed(handle);
ScheduleHandle RaiseDelayed(T argument, float delay);
パラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
argument | T | イベント実行時に渡されるデータ |
delay | float | イベント発行前の待機時間(秒) |
戻り値: ScheduleHandle - キャンセル用のハンドル
使用例:
// 3秒後に敵をスポーン
ScheduleHandle handle = spawnEvent.RaiseDelayed(enemyType, 3f);
// スポーンをキャンセル
spawnEvent.CancelDelayed(handle);
ScheduleHandle RaiseDelayed(TSender sender, TArgs args, float delay);
パラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
sender | TSender | イベント実行時に渡される送信者 |
args | TArgs | イベント実行時に渡されるデータ |
delay | float | イベント発行前の待機時間(秒) |
戻り値: ScheduleHandle - キャンセル用のハンドル
使用例:
// 遅延ダメージ適用
ScheduleHandle handle = damageEvent.RaiseDelayed(
attackerObject,
new DamageInfo(25),
2f
);
RaiseRepeating()
固定間隔でイベントを繰り返し発行するようスケジュールします。
- GameEvent
- GameEvent<T>
- GameEvent<TSender, TArgs>
ScheduleHandle RaiseRepeating(float interval, int repeatCount = -1);
パラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
interval | float | 各実行間の秒数 |
repeatCount | int | 繰り返し回数。無限の場合は-1を使用(デフォルト: -1) |
戻り値: ScheduleHandle - キャンセル用のハンドル
使用例:
// 10回繰り返し
ScheduleHandle handle = tickEvent.RaiseRepeating(1f, repeatCount: 10);
// 永久に繰り返し(無限ループ)
ScheduleHandle infinite = pulseEvent.RaiseRepeating(0.5f);
// 無限ループを停止
pulseEvent.CancelRepeating(infinite);
ScheduleHandle RaiseRepeating(T argument, float interval, int repeatCount = -1);
パラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
argument | T | 各実行時に渡されるデータ |
interval | float | 各実行間の秒数 |
repeatCount | int | 繰り返し回数。無限の場合は-1を使用(デフォルト: -1) |
戻り値: ScheduleHandle - キャンセル用のハンドル
使用例:
// 1秒ごとにダメージを与え、5回実行
ScheduleHandle poison = damageEvent.RaiseRepeating(5, 1f, repeatCount: 5);
// 30秒ごとに無限にウェーブをスポーン
ScheduleHandle waves = waveEvent.RaiseRepeating(waveData, 30f);
ScheduleHandle RaiseRepeating(TSender sender, TArgs args, float interval, int repeatCount = -1);
パラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
sender | TSender | 各実行時に渡される送信者 |
args | TArgs | 各実行時に渡されるデータ |
interval | float | 各実行間の秒数 |
repeatCount | int | 繰り返し回数。無限の場合は-1を使用(デフォルト: -1) |
戻り値: ScheduleHandle - キャンセル用のハンドル
使用例:
// 2秒ごとに体力を回復、10回実行
ScheduleHandle regen = healEvent.RaiseRepeating(
playerObject,
new HealInfo(5),
2f,
repeatCount: 10
);
CancelDelayed()
RaiseDelayed()で作成された特定の遅延イベントをキャンセルします。
bool CancelDelayed(ScheduleHandle handle);
パラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
handle | ScheduleHandle | RaiseDelayed()から返されたハンドル |
戻り値: bool - 正常にキャンセルされた場合はtrue、既に実行済みまたは無効な場合はfalse
使用例:
ScheduleHandle handle = explosionEvent.RaiseDelayed(5f);
// 爆発が起こる前にキャンセル
if (explosionEvent.CancelDelayed(handle))
{
Debug.Log("爆発を解除しました!");
}
CancelRepeating()
RaiseRepeating()で作成された特定の繰り返しイベントをキャンセルします。
bool CancelRepeating(ScheduleHandle handle);
パラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
handle | ScheduleHandle | RaiseRepeating()から返されたハンドル |
戻り値: bool - 正常にキャンセルされた場合はtrue、既に終了済みまたは無効な場合はfalse
使用例:
ScheduleHandle handle = tickEvent.RaiseRepeating(1f);
// 繰り返しを停止
if (tickEvent.CancelRepeating(handle))
{
Debug.Log("タイマーを停止しました!");
}
🎧 リスナー管理
AddListener()
標準的な実行優先度を持つ基本リスナーを登録します。
- GameEvent
- GameEvent<T>
- GameEvent<TSender, TArgs>
void AddListener(UnityAction call);
パラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
call | UnityAction | パラメータなしのコールバックメソッド |
使用例:
myEvent.AddListener(OnEventTriggered);
void OnEventTriggered()
{
Debug.Log("イベントが発行されました!");
}
void AddListener(UnityAction<T> call);
パラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
call | UnityAction<T> | 型付き引数を受け取るコールバックメソッド |
使用例:
scoreEvent.AddListener(OnScoreChanged);
void OnScoreChanged(int newScore)
{
Debug.Log($"スコア: {newScore}");
}
void AddListener(UnityAction<TSender, TArgs> call);
パラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
call | UnityAction<TSender, TArgs> | 送信者と引数を受け取るコールバックメソッド |
使用例:
damageEvent.AddListener(OnDamageDealt);
void OnDamageDealt(GameObject attacker, DamageInfo info)
{
Debug.Log($"{attacker.name}が{info.amount}のダメージを与えました");
}
リスナーが既に存在する場合、重複を防ぐために削除されてから再追加されます。
RemoveListener()
イベントから基本リスナーの登録を解除します。
- GameEvent
- GameEvent<T>
- GameEvent<TSender, TArgs>
void RemoveListener(UnityAction call);
パラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
call | UnityAction | パラメータなしのコールバックメソッド |
使用例:
myEvent.RemoveListener(OnEventTriggered);
void RemoveListener(UnityAction<T> call);
パラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
call | UnityAction<T> | 型付き引数を受け取るコールバックメソッド |
使用例:
scoreEvent.RemoveListener(OnScoreChanged);
void RemoveListener(UnityAction<TSender, TArgs> call);
パラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
call | UnityAction<TSender, TArgs> | 送信者と引数を受け取るコールバックメソッド |
使用例:
damageEvent.RemoveListener(OnDamageDealt);
RemoveAllListeners()
イベントからすべてのBasic、Priority、Conditionalリスナーをクリアします。
void RemoveAllListeners();
使用例:
// すべてのリスナーをクリーンアップ
myEvent.RemoveAllListeners();
安全上の理由から、Persistentリスナーやトリガー/チェーンイベントは削除されません。
AddPriorityListener()
明示的な実行優先度を持つリスナーを登録します。優先度の値が高いほど先に実行されます。
- GameEvent
- GameEvent<T>
- GameEvent<TSender, TArgs>
void AddPriorityListener(UnityAction call, int priority);
パラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
call | UnityAction | コールバックメソッド |
priority | int | 実行優先度(高い = 早い、デフォルト: 0) |
使用例:
myEvent.AddPriorityListener(CriticalHandler, 100);
myEvent.AddPriorityListener(NormalHandler, 50);
myEvent.AddPriorityListener(LowPriorityHandler, 10);
// 実行順序: CriticalHandler → NormalHandler → LowPriorityHandler
void AddPriorityListener(UnityAction<T> call, int priority);
パラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
call | UnityAction<T> | コールバックメソッド |
priority | int | 実行優先度(高い = 早い、デフォルト: 0) |
使用例:
healthEvent.AddPriorityListener(UpdateUI, 100);
healthEvent.AddPriorityListener(PlaySound, 50);
void AddPriorityListener(UnityAction<TSender, TArgs> call, int priority);
パラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
call | UnityAction<TSender, TArgs> | コールバックメソッド |
priority | int | 実行優先度(高い = 早い、デフォルト: 0) |
使用例:
attackEvent.AddPriorityListener(ProcessCombat, 100);
attackEvent.AddPriorityListener(ShowVFX, 50);
RemovePriorityListener()
優先度リスナーの登録を解除します。
- GameEvent
- GameEvent<T>
- GameEvent<TSender, TArgs>
void RemovePriorityListener(UnityAction call);
パラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
call | UnityAction | パラメータなしのコールバックメソッド |
使用例:
myEvent.RemovePriorityListener(OnEventTriggered);
void RemovePriorityListener(UnityAction<T> call);
パラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
call | UnityAction<T> | 型付き引数を受け取るコールバックメソッド |
使用例:
scoreEvent.RemovePriorityListener(OnScoreChanged);
void RemovePriorityListener(UnityAction<TSender, TArgs> call);
パラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
call | UnityAction<TSender, TArgs> | 送信者と引数を受け取るコールバックメソッド |
使用例:
damageEvent.RemovePriorityListener(OnDamageDealt);
AddConditionalListener()
条件がtrueと評価された場合にのみ実行されるリスナーを登録します。
- GameEvent
- GameEvent<T>
- GameEvent<TSender, TArgs>
void AddConditionalListener(UnityAction call, Func<bool> condition, int priority = 0);
パラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
call | UnityAction | コールバックメソッド |
condition | Func<bool> | 述語関数(null = 常に実行) |
priority | int | 実行優先度(デフォルト: 0) |
使用例:
myEvent.AddConditionalListener(
OnHealthLow,
() => playerHealth < 20,
priority: 10
);
void AddConditionalListener(UnityAction<T> call, Func<T, bool> condition, int priority = 0);
パラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
call | UnityAction<T> | コールバックメソッド |
condition | Func<T, bool> | 引数を受け取る述語関数 |
priority | int | 実行優先度(デフォルト: 0) |
使用例:
scoreEvent.AddConditionalListener(
OnHighScore,
score => score > 1000,
priority: 5
);
void AddConditionalListener(
UnityAction<TSender, TArgs> call,
Func<TSender, TArgs, bool> condition,
int priority = 0
);
パラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
call | UnityAction<TSender, TArgs> | コールバックメソッド |
condition | Func<TSender, TArgs, bool> | 送信者と引数を受け取る述語関数 |
priority | int | 実行優先度(デフォルト: 0) |
使用例:
damageEvent.AddConditionalListener(
OnCriticalHit,
(attacker, info) => info.isCritical,
priority: 10
);
RemoveConditionalListener()
条件付きリスナーの登録を解除します。
- GameEvent
- GameEvent<T>
- GameEvent<TSender, TArgs>
void RemoveConditionalListener(UnityAction call);
パラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
call | UnityAction | パラメータなしのコールバックメソッド |
使用例:
myEvent.RemoveConditionalListener(OnEventTriggered);
void RemoveConditionalListener(UnityAction<T> call);
パラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
call | UnityAction<T> | 型付き引数を受け取るコールバックメソッド |
使用例:
scoreEvent.RemoveConditionalListener(OnScoreChanged);
void RemoveConditionalListener(UnityAction<TSender, TArgs> call);
パラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
call | UnityAction<TSender, TArgs> | 送信者と引数を受け取るコールバックメソッド |
使用例:
damageEvent.RemoveConditionalListener(OnDamageDealt);
AddPersistentListener()
シーン変更を超えて存続するグローバルリスナー(DontDestroyOnLoad)を登録します。
- GameEvent
- GameEvent<T>
- GameEvent<TSender, TArgs>
void AddPersistentListener(UnityAction call, int priority = 0);
パラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
call | UnityAction | コールバックメソッド |
priority | int | 実行優先度(デフォルト: 0) |
使用例:
globalEvent.AddPersistentListener(OnGlobalAction, priority: 100);
void AddPersistentListener(UnityAction<T> call, int priority = 0);
パラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
call | UnityAction<T> | コールバックメソッド |
priority | int | 実行優先度(デフォルト: 0) |
void AddPersistentListener(UnityAction<TSender, TArgs> call, int priority = 0);
パラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
call | UnityAction<TSender, TArgs> | コールバックメソッド |
priority | int | 実行優先度(デフォルト: 0) |
Persistentリスナーはシーンのロード間もアクティブなままです。セーブ管理や分析などのグローバルシステムに使用してください。
RemovePersistentListener()
永続的リスナーの登録を解除します。
- GameEvent
- GameEvent<T>
- GameEvent<TSender, TArgs>
void RemovePersistentListener(UnityAction call);
パラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
call | UnityAction | パラメータなしのコールバックメソッド |
使用例:
myEvent.RemovePersistentListener(OnEventTriggered);
void RemovePersistentListener(UnityAction<T> call);
パラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
call | UnityAction<T> | 型付き引数を受け取るコールバックメソッド |
使用例:
scoreEvent.RemovePersistentListener(OnScoreChanged);
void RemovePersistentListener(UnityAction<TSender, TArgs> call);
パラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
call | UnityAction<TSender, TArgs> | 送信者と引数を受け取るコールバックメソッド |
使用例:
damageEvent.RemovePersistentListener(OnDamageDealt);
⚡ トリガーイベント(ファンアウトパターン)
AddTriggerEvent()
このイベントが発行されたときに自動的にトリガーされるターゲットイベントを登録します。
- GameEvent
- GameEvent<T>
- GameEvent<TSender, TArgs>
TriggerHandle AddTriggerEvent(
GameEventBase targetEvent,
float delay = 0f,
Func<bool> condition = null,
int priority = 0
);
パラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
targetEvent | GameEventBase | トリガーするイベント |
delay | float | オプションの遅延(秒)(デフォルト: 0) |
condition | Func<bool> | 実行をゲートするオプションの述語 |
priority | int | 他のトリガーに対する実行順序(デフォルト: 0) |
戻り値: TriggerHandle - 安全な削除のための一意の識別子
使用例:
// シンプルなトリガー: ドアが開く → ライトが点灯
doorOpenEvent.AddTriggerEvent(lightOnEvent);
// 遅延トリガー: 2秒後に爆発
fuseEvent.AddTriggerEvent(explosionEvent, delay: 2f);
// 条件付きトリガー
doorOpenEvent.AddTriggerEvent(
alarmEvent,
condition: () => isNightTime
);
// 優先順位付きトリガー
bossDefeatedEvent.AddTriggerEvent(stopMusicEvent, priority: 100);
bossDefeatedEvent.AddTriggerEvent(victoryMusicEvent, priority: 90);
bossDefeatedEvent.AddTriggerEvent(showRewardsEvent, priority: 50);
TriggerHandle AddTriggerEvent(
GameEventBase targetEvent,
float delay = 0f,
Func<T, bool> condition = null,
bool passArgument = true,
Func<T, object> argumentTransformer = null,
int priority = 0
);
パラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
targetEvent | GameEventBase | トリガーするイベント |
delay | float | オプションの遅延(秒)(デフォルト: 0) |
condition | Func<T, bool> | 引数を受け取るオプションの述語 |
passArgument | bool | ターゲットにデータを渡すかどうか(デフォルト: true) |
argumentTransformer | Func<T, object> | データを変換するオプションの関数 |
priority | int | 実行優先度(デフォルト: 0) |
戻り値: TriggerHandle - 安全な削除のための一意の識別子
使用例:
// 引数を直接渡す
public Int32GameEvent scoreEvent;
public Int32GameEvent updateUIEvent;
scoreEvent.AddTriggerEvent(updateUIEvent, passArgument: true);
// 引数を変換: int → string
public Int32GameEvent scoreEvent;
StringGameEvent notificationEvent;
scoreEvent.AddTriggerEvent(
notificationEvent,
passArgument: true,
argumentTransformer: score => $"スコア: {score}"
);
// 引数チェック付き条件付き
SingleGameEvent healthEvent;
GameEvent lowHealthWarningEvent;
healthEvent.AddTriggerEvent(
lowHealthWarningEvent,
condition: health => health < 20f,
passArgument: false
);
TriggerHandle AddTriggerEvent(
GameEventBase targetEvent,
float delay = 0f,
Func<TSender, TArgs, bool> condition = null,
bool passArgument = true,
Func<TSender, TArgs, object> argumentTransformer = null,
int priority = 0
);
パラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
targetEvent | GameEventBase | トリガーするイベント |
delay | float | オプションの遅延(秒)(デフォルト: 0) |
condition | Func<TSender, TArgs, bool> | 送信者と引数を受け取るオプションの述語 |
passArgument | bool | ターゲットにデータを渡すかどうか(デフォルト: true) |
argumentTransformer | Func<TSender, TArgs, object> | オプションの変換関数 |
priority | int | 実行優先度(デフォルト: 0) |
戻り値: TriggerHandle - 安全な削除のための一意の識別子
使用例:
// 送信者と引数を別の送信者イベントに渡す
GameObjectDamageInfoGameEvent damageEvent;
GameObjectDamageInfoGameEvent logEvent;
damageEvent.AddTriggerEvent(logEvent, passArgument: true);
// 変換: ダメージ値のみを抽出
GameObjectDamageInfoGameEvent damageEvent;
public Int32GameEvent damageNumberEvent;
damageEvent.AddTriggerEvent(
damageNumberEvent,
passArgument: true,
argumentTransformer: (sender, info) => info.amount
);
// 送信者と引数に基づく条件付き
GameObjectDamageInfoGameEvent damageEvent;
GameEvent criticalHitEvent;
damageEvent.AddTriggerEvent(
criticalHitEvent,
condition: (sender, info) =>
info.isCritical && sender.CompareTag("Player"),
passArgument: false
);
トリガーは並列に実行されます - 各トリガーは独立しています。1つのトリガーの条件が失敗したり例外をスローしても、他のトリガーは実行されます。
RemoveTriggerEvent() (ハンドルによる)
一意のハンドルを使用して特定のトリガーを安全に削除します。
void RemoveTriggerEvent(TriggerHandle handle);
パラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
handle | TriggerHandle | AddTriggerEvent()から返されたハンドル |
使用例:
TriggerHandle handle = doorEvent.AddTriggerEvent(lightEvent);
// 特定のトリガーを削除
doorEvent.RemoveTriggerEvent(handle);
これは特定のトリガーインスタンスのみを削除するため、最も安全な削除方法です。
RemoveTriggerEvent() (ターゲットによる)
特定のターゲットイベントを指すトリガーをすべて削除します。
void RemoveTriggerEvent(GameEventBase targetEvent);
パラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
targetEvent | GameEventBase | 切断するターゲットイベント |
使用例:
doorEvent.RemoveTriggerEvent(lightEvent);
これは、このイベントをターゲットとするすべてのトリガーを削除します。他のシステムによって登録されたものも含まれます。正確性のためにRemoveTriggerEvent(handle)を使用してください。
RemoveAllTriggerEvents()
このイベントからすべてのトリガーイベントを削除します。
void RemoveAllTriggerEvents();
使用例:
myEvent.RemoveAllTriggerEvents();
🔗 チェーンイベント(シーケンシャルパターン)
AddChainEvent()
チェーンで順次実行されるターゲットイベントを登録します。
- GameEvent
- GameEvent<T>
- GameEvent<TSender, TArgs>
ChainHandle AddChainEvent(
GameEventBase targetEvent,
float delay = 0f,
float duration = 0f,
Func<bool> condition = null,
bool waitForCompletion = false
);
パラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
targetEvent | GameEventBase | チェーンで実行するイベント |
delay | float | このノードを実行する前の遅延(デフォルト: 0) |
duration | float | このノードを実行した後の遅延(デフォルト: 0) |
condition | Func<bool> | オプションの述語 - falseの場合チェーンが中断 |
waitForCompletion | bool | 実行後に1フレーム待機(デフォルト: false) |
戻り値: ChainHandle - 安全な削除のための一意の識別子
使用例:
// シンプルなシーケンス: A → B → C
eventA.AddChainEvent(eventB);
eventB.AddChainEvent(eventC);
// 遅延を伴うカットシーン
fadeOutEvent.AddChainEvent(loadSceneEvent, delay: 1f);
loadSceneEvent.AddChainEvent(fadeInEvent, delay: 0.5f);
// 条件付きチェーン: 条件が満たされた場合のみ続行
combatEndEvent.AddChainEvent(
victoryEvent,
condition: () => playerHealth > 0
);
// 非同期操作のためのフレーム待機付きチェーン
showDialogEvent.AddChainEvent(
typeTextEvent,
waitForCompletion: true
);
ChainHandle AddChainEvent(
GameEventBase targetEvent,
float delay = 0f,
float duration = 0f,
Func<T, bool> condition = null,
bool passArgument = true,
Func<T, object> argumentTransformer = null,
bool waitForCompletion = false
);
パラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
targetEvent | GameEventBase | チェーンで実行するイベント |
delay | float | このノードを実行する前の遅延(デフォルト: 0) |
duration | float | このノードを実行した後の遅延(デフォルト: 0) |
condition | Func<T, bool> | 引数を受け取るオプションの述語 |
passArgument | bool | ターゲットにデータを渡すかどうか(デフォルト: true) |
argumentTransformer | Func<T, object> | オプションの変換関数 |
waitForCompletion | bool | 実行後に1フレーム待機(デフォルト: false) |
戻り値: ChainHandle - 安全な削除のための一意の識別子
使用例:
// 引数を渡すチェーン
public Int32GameEvent damageEvent;
public Int32GameEvent applyDamageEvent;
public Int32GameEvent updateHealthBarEvent;
damageEvent.AddChainEvent(applyDamageEvent, passArgument: true);
applyDamageEvent.AddChainEvent(updateHealthBarEvent, passArgument: true);
// 変換を伴うチェーン
public Int32GameEvent damageEvent;
SingleGameEvent healthPercentEvent;
damageEvent.AddChainEvent(
healthPercentEvent,
passArgument: true,
argumentTransformer: damage =>
(float)(currentHealth - damage) / maxHealth
);
// 引数チェック付き条件付きチェーン
public Int32GameEvent damageEvent;
GameEvent deathEvent;
damageEvent.AddChainEvent(
deathEvent,
condition: damage => (currentHealth - damage) <= 0,
passArgument: false
);
ChainHandle AddChainEvent(
GameEventBase targetEvent,
float delay = 0f,
float duration = 0f,
Func<TSender, TArgs, bool> condition = null,
bool passArgument = true,
Func<TSender, TArgs, object> argumentTransformer = null,
bool waitForCompletion = false
);
パラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
targetEvent | GameEventBase | チェーンで実行するイベント |
delay | float | このノードを実行する前の遅延(デフォルト: 0) |
duration | float | このノードを実行した後の遅延(デフォルト: 0) |
condition | Func<TSender, TArgs, bool> | 送信者と引数を受け取るオプションの述語 |
passArgument | bool | ターゲットにデータを渡すかどうか(デフォルト: true) |
argumentTransformer | Func<TSender, TArgs, object> | オプションの変換関数 |
waitForCompletion | bool | 実行後に1フレーム待機(デフォルト: false) |
戻り値: ChainHandle - 安全な削除のための一意の識別子
使用例:
// 攻撃シーケンスチェーン
GameObjectAttackDataGameEvent attackStartEvent;
GameObjectAttackDataGameEvent playAnimationEvent;
GameObjectAttackDataGameEvent dealDamageEvent;
attackStartEvent.AddChainEvent(playAnimationEvent, delay: 0f);
playAnimationEvent.AddChainEvent(dealDamageEvent, delay: 0.5f);
// ダメージ値を抽出
GameObjectAttackDataGameEvent dealDamageEvent;
public Int32GameEvent showDamageNumberEvent;
dealDamageEvent.AddChainEvent(
showDamageNumberEvent,
passArgument: true,
argumentTransformer: (attacker, data) => data.damage
);
// 条件付き勝利チェーン
GameObjectAttackDataGameEvent attackEndEvent;
GameEvent<GameObject, VictoryData> victoryEvent;
attackEndEvent.AddChainEvent(
victoryEvent,
condition: (attacker, data) => data.targetHealth <= 0,
argumentTransformer: (attacker, data) =>
new VictoryData { winner = attacker }
);
チェーンは順次(A → B → C)実行されます。いずれかのノードの条件がfalseを返すか例外をスローした場合、チェーン全体がその時点で停止します。
- トリガー = 並列(A → [B, C, D]) - すべて独立して実行
- チェーン = 順次(A → B → C) - 厳密な順序、失敗時に停止
RemoveChainEvent() (ハンドルによる)
一意のハンドルを使用して特定のチェーンノードを安全に削除します。
void RemoveChainEvent(ChainHandle handle);
パラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
handle | ChainHandle | AddChainEvent()から返されたハンドル |
使用例:
ChainHandle handle = eventA.AddChainEvent(eventB);
// 特定のチェーンノードを削除
eventA.RemoveChainEvent(handle);
RemoveChainEvent() (ターゲットによる)
特定のターゲットイベントを指すチェーンノードをすべて削除します。
void RemoveChainEvent(GameEventBase targetEvent);
パラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
targetEvent | GameEventBase | 切断するターゲットイベント |
使用例:
eventA.RemoveChainEvent(eventB);
これは、このイベントをターゲットとするすべてのチェーンノードを削除します。正確性のためにRemoveChainEvent(handle)を使用してください。
RemoveAllChainEvents()
このイベントからすべてのチェーンイベントを削除します。
void RemoveAllChainEvents();
使用例:
myEvent.RemoveAllChainEvents();
🔧 設定とユーティリティ
SetInspectorListenersActive()
イベントが発行されたときにInspectorで設定されたリスナーを実行するかどうかを制御します。
void SetInspectorListenersActive(bool isActive);
パラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
isActive | bool | Inspectorリスナーを有効にする場合はtrue、ミュートする場合はfalse |
使用例:
// Inspectorで設定されたUI/オーディオエフェクトをミュート
damageEvent.SetInspectorListenersActive(false);
// イベントはコードで登録されたリスナーのみをトリガー
damageEvent.Raise(10);
// Inspectorリスナーを再度有効化
damageEvent.SetInspectorListenersActive(true);
ユースケース:
- カットシーン中に一時的にビジュアル/オーディオエフェクトを無音化
- UI更新をトリガーせずにバックエンド計算を実行
- ロード画面中にシーン固有の動作を無効化
- テスト/デバッグモードでゲームロジックをシミュレート
この設定は、GameEventManagerを介してUnity Inspectorで設定されたリスナーにのみ影響します。コードでAddListener()を介して登録されたリスナーは影響を受けず、常に実行されます。
🗄️ データベース管理
GameEventManager.Instance に用意された動的データベース・ライフサイクル API —— GameEventDatabase アセットを実行時にロード/アンロードし、シーン単位のコンテンツ、DLC、Addressables 統合などに使用します。
RegisterDatabase()
実行時に GameEventDatabase を登録し、その中のすべてのイベントをバインドおよび呼び出し可能にします。バインディングが未生成のイベントには自動的に EventBinding エントリが作成されます。重複登録は安全に無視されます。
void RegisterDatabase(GameEventDatabase database);
パラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
database | GameEventDatabase | 登録するデータベースアセット |
例:
var combatDB = Resources.Load<GameEventDatabase>("CombatEvents");
GameEventManager.Instance.RegisterDatabase(combatDB);
UnregisterDatabase()
実行時に GameEventDatabase の登録を解除し、そのすべてのイベントを稼働中のシステムから取り除きます。関連するバインディングと実行時コールバックもクリーンアップされます。null や未登録のデータベースに対しても安全に呼び出せます。
void UnregisterDatabase(GameEventDatabase database);
パラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
database | GameEventDatabase | 取り除くデータベースアセット |
例:
GameEventManager.Instance.UnregisterDatabase(combatDB);
SetDatabaseActive()
登録済みデータベースの有効状態を、登録を解除せずに切り替えます。無効化されたデータベースはリストに残りますが、所属するイベントは呼び出しを受け取りません。
void SetDatabaseActive(GameEventDatabase database, bool active);
パラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
database | GameEventDatabase | 対象データベース(登録済みであること) |
active | bool | true で有効化、false でミュート |
例:
// カットシーン中は戦闘イベントを一時停止
GameEventManager.Instance.SetDatabaseActive(combatDB, false);
// カットシーン終了後に再開
GameEventManager.Instance.SetDatabaseActive(combatDB, true);
RegisterDatabase/UnregisterDatabaseはリストへの追加・削除を管理します。SetDatabaseActiveはイベント呼び出しの ON/OFF だけを切り替えます —— データベース登録は残ります。
🔍 ランタイムクエリ API
GameEventManager.Instance 上で GUID、名前、カテゴリ、型からイベントを検索するための API —— [SerializeField] 参照を必要としません。非 MonoBehaviour 利用者、セーブ/ロードシステム、プラグイン橋渡し、動的ロードコンテンツなどに有用です。
各 Get* / Has* / TryGet* メソッドには、厳密な型フィルタリング用に三つのアリティが用意されています:
- 非ジェネリック →
GameEventBaseを返す;任意のイベント型にマッチ <T>→GameEvent<T>のみマッチ<TSender, TArgs>→GameEvent<TSender, TArgs>のみマッチ
型フィルタリングは is GameEvent<T> / is GameEvent<TSender, TArgs> パターンマッチで行われます。例えば "OnJump" が void イベントとして存在していても GetGameEvents<int>("OnJump") は 0 を返し、型の混在を防ぎます。
すべての検索は登録済みかつアクティブなデータベースのみを対象とします。
HasGameEvent() / HasGameEvents()
存在チェック —— 単数形は一意の GUID 用、複数形は複数イベントにマッチし得る名前ベースの検索用です。
// GUID(一意)
bool HasGameEvent(string guid);
// 名前(+ 任意のカテゴリフィルタ)
bool HasGameEvents(string name, string category = null);
bool HasGameEvents<T>(string name, string category = null);
bool HasGameEvents<TSender, TArgs>(string name, string category = null);
例:
var mgr = GameEventManager.Instance;
if (mgr.HasGameEvent(savedGuid))
Debug.Log("保存したイベントがまだ存在します");
if (mgr.HasGameEvents("OnDamage", "Combat"))
Debug.Log("Combat カテゴリのダメージイベントが利用可能です");
if (mgr.HasGameEvents<int>("OnScoreChanged"))
Debug.Log("int 型のスコアイベントが見つかりました");
GetGameEvent() / TryGetGameEvent()
GUID による取得。見つからないか型が不一致の場合は null / false を返します。
- 非ジェネリック
- GameEvent<T>
- GameEvent<TSender, TArgs>
GameEventBase GetGameEvent(string guid);
bool TryGetGameEvent(string guid, out GameEventBase evt);
例:
if (GameEventManager.Instance.TryGetGameEvent(savedGuid, out var evt))
evt.Raise();
GameEvent<T> GetGameEvent<T>(string guid);
bool TryGetGameEvent<T>(string guid, out GameEvent<T> evt);
例:
var scoreEvt = GameEventManager.Instance.GetGameEvent<int>(guid);
scoreEvt?.Raise(100);
GameEvent<TSender, TArgs> GetGameEvent<TSender, TArgs>(string guid);
bool TryGetGameEvent<TSender, TArgs>(string guid, out GameEvent<TSender, TArgs> evt);
例:
if (GameEventManager.Instance.TryGetGameEvent<GameObject, DamageInfo>(guid, out var dmg))
dmg.Raise(attacker, info);
GetGameEvents()
名前に一致するすべてのイベントを取得します(カテゴリフィルタは任意)。一致がなければ空の List を返し、null にはなりません。
List<GameEventBase> GetGameEvents(string name, string category = null);
List<GameEvent<T>> GetGameEvents<T>(string name, string category = null);
List<GameEvent<TSender, TArgs>> GetGameEvents<TSender, TArgs>(string name, string category = null);
パラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
name | string | 完全一致で検索するイベント名 |
category | string | 任意のカテゴリフィルタ(null で無効) |
例:
// "OnJump" という名前を持つイベントをすべて一括発火
foreach (var e in GameEventManager.Instance.GetGameEvents("OnJump"))
e.Raise();
// 名前 + カテゴリフィルタ
var combatEvents = GameEventManager.Instance.GetGameEvents("OnDamage", "Combat");
// 型指定フィルタ:GameEvent<int> のみマッチ
var scoreEvents = GameEventManager.Instance.GetGameEvents<int>("OnScoreChanged");
GetFirstGameEventByName() / TryGetFirstGameEventByName()
名前検索で単一結果だけ欲しい場合の便利メソッド。走査時に最初に見つかったイベントを返します(重複時は任意の一つ)。一致なしなら null / false を返します。
// 非ジェネリック
GameEventBase GetFirstGameEventByName(string name, string category = null);
bool TryGetFirstGameEventByName(string name, out GameEventBase evt, string category = null);
// GameEvent<T>
GameEvent<T> GetFirstGameEventByName<T>(string name, string category = null);
bool TryGetFirstGameEventByName<T>(string name, out GameEvent<T> evt, string category = null);
// GameEvent<TSender, TArgs>
GameEvent<TSender, TArgs> GetFirstGameEventByName<TSender, TArgs>(string name, string category = null);
bool TryGetFirstGameEventByName<TSender, TArgs>(string name, out GameEvent<TSender, TArgs> evt, string category = null);
例:
var mgr = GameEventManager.Instance;
// カテゴリフィルタ付き void イベント
mgr.GetFirstGameEventByName("OnJump", "Movement")?.Raise();
// 型付き int 検索
if (mgr.TryGetFirstGameEventByName<int>("OnScoreChanged", out var scoreEvt))
scoreEvt.Raise(100);
// Sender 付き検索
if (mgr.TryGetFirstGameEventByName<GameObject, string>("OnEntityAction", out var evt))
evt.Raise(gameObject, "performed action");
- GUID はプロジェクト全体で一意 —— セーブ/ロード、ネットワーク同期、Mod 設定などに最適。
- 名前 は重複可能(カテゴリ横断・データベース横断で同名になり得る)—— 一括処理には
GetGameEvents(複数形)、任意の一致でよい場合はGetFirstGameEventByNameを使用。
📊 クイックリファレンステーブル
メソッドカテゴリ
| カテゴリ | メソッド | 目的 |
|---|---|---|
| 実行 | Raise(), Cancel() | イベントのトリガーとスケジュール実行の停止 |
| スケジューリング | RaiseDelayed(), RaiseRepeating(), CancelDelayed(), CancelRepeating() | 時間ベースのイベント実行 |
| 基本リスナー | AddListener(), RemoveListener(), RemoveAllListeners() | 標準的なコールバック登録 |
| 優先度リスナー | AddPriorityListener(), RemovePriorityListener() | 順序付きコールバック実行 |
| 条件付きリスナー | AddConditionalListener(), RemoveConditionalListener() | ゲート付きコールバック実行 |
| 永続的リスナー | AddPersistentListener(), RemovePersistentListener() | シーン非依存のコールバック |
| トリガーイベント | AddTriggerEvent(), RemoveTriggerEvent(), RemoveAllTriggerEvents() | 並列イベントチェーン |
| チェーンイベント | AddChainEvent(), RemoveChainEvent(), RemoveAllChainEvents() | 順次イベントチェーン |
| 設定 | SetInspectorListenersActive() | ランタイム動作制御 |
| データベース管理 | RegisterDatabase(), UnregisterDatabase(), SetDatabaseActive() | 実行時データベースのライフサイクル管理 |
| ランタイムクエリ | HasGameEvent(), GetGameEvent(), TryGetGameEvent(), HasGameEvents(), GetGameEvents(), GetFirstGameEventByName(), TryGetFirstGameEventByName() | GUID / 名前 / カテゴリ / 型でイベントを検索 |