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

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

void Raise();

使用例:

myEvent.Raise();
Cancel()

このイベントアセットに対して、Inspectorで設定されたアクティブなスケジュール実行(遅延または繰り返し)を停止します。

void Cancel();

使用例:

// Inspectorで設定された自動繰り返しを停止
myEvent.Cancel();
適用範囲の制限

これはInspectorの「スケジュール設定」によって開始されたスケジュールのみをキャンセルします。RaiseDelayed()またはRaiseRepeating()で作成された手動スケジュールはキャンセルされません。それらにはCancelDelayed(handle)またはCancelRepeating(handle)を使用してください。

⏱️ 時間ベースのスケジューリング

RaiseDelayed()

指定された遅延後に一度だけイベントを発行するようスケジュールします。

ScheduleHandle RaiseDelayed(float delay);

パラメータ:

名前説明
delayfloatイベント発行前の待機時間(秒)

戻り値: ScheduleHandle - キャンセル用のハンドル

使用例:

// 5秒後に発行
ScheduleHandle handle = myEvent.RaiseDelayed(5f);

// 必要に応じてキャンセル
myEvent.CancelDelayed(handle);
RaiseRepeating()

固定間隔でイベントを繰り返し発行するようスケジュールします。

ScheduleHandle RaiseRepeating(float interval, int repeatCount = -1);

パラメータ:

名前説明
intervalfloat各実行間の秒数
repeatCountint繰り返し回数。無限の場合は-1を使用(デフォルト: -1)

戻り値: ScheduleHandle - キャンセル用のハンドル

使用例:

// 10回繰り返し
ScheduleHandle handle = tickEvent.RaiseRepeating(1f, repeatCount: 10);

// 永久に繰り返し(無限ループ)
ScheduleHandle infinite = pulseEvent.RaiseRepeating(0.5f);

// 無限ループを停止
pulseEvent.CancelRepeating(infinite);
CancelDelayed()

RaiseDelayed()で作成された特定の遅延イベントをキャンセルします。

bool CancelDelayed(ScheduleHandle handle);

パラメータ:

名前説明
handleScheduleHandleRaiseDelayed()から返されたハンドル

戻り値: bool - 正常にキャンセルされた場合はtrue、既に実行済みまたは無効な場合はfalse

使用例:

ScheduleHandle handle = explosionEvent.RaiseDelayed(5f);

// 爆発が起こる前にキャンセル
if (explosionEvent.CancelDelayed(handle))
{
Debug.Log("爆発を解除しました!");
}
CancelRepeating()

RaiseRepeating()で作成された特定の繰り返しイベントをキャンセルします。

bool CancelRepeating(ScheduleHandle handle);

パラメータ:

名前説明
handleScheduleHandleRaiseRepeating()から返されたハンドル

戻り値: bool - 正常にキャンセルされた場合はtrue、既に終了済みまたは無効な場合はfalse

使用例:

ScheduleHandle handle = tickEvent.RaiseRepeating(1f);

// 繰り返しを停止
if (tickEvent.CancelRepeating(handle))
{
Debug.Log("タイマーを停止しました!");
}

🎧 リスナー管理

AddListener()

標準的な実行優先度を持つ基本リスナーを登録します。

void AddListener(UnityAction call);

パラメータ:

名前説明
callUnityActionパラメータなしのコールバックメソッド

使用例:

myEvent.AddListener(OnEventTriggered);

void OnEventTriggered()
{
Debug.Log("イベントが発行されました!");
}
重複防止

リスナーが既に存在する場合、重複を防ぐために削除されてから再追加されます。

RemoveListener()

イベントから基本リスナーの登録を解除します。

void RemoveListener(UnityAction call);

パラメータ:

名前説明
callUnityActionパラメータなしのコールバックメソッド

使用例:

myEvent.RemoveListener(OnEventTriggered);
RemoveAllListeners()

イベントからすべてのBasic、Priority、Conditionalリスナーをクリアします。

void RemoveAllListeners();

使用例:

// すべてのリスナーをクリーンアップ
myEvent.RemoveAllListeners();
適用範囲

安全上の理由から、Persistentリスナーやトリガー/チェーンイベントは削除されません

AddPriorityListener()

明示的な実行優先度を持つリスナーを登録します。優先度の値が高いほど先に実行されます。

void AddPriorityListener(UnityAction call, int priority);

パラメータ:

名前説明
callUnityActionコールバックメソッド
priorityint実行優先度(高い = 早い、デフォルト: 0)

使用例:

myEvent.AddPriorityListener(CriticalHandler, 100);
myEvent.AddPriorityListener(NormalHandler, 50);
myEvent.AddPriorityListener(LowPriorityHandler, 10);
// 実行順序: CriticalHandler → NormalHandler → LowPriorityHandler
RemovePriorityListener()

優先度リスナーの登録を解除します。

void RemovePriorityListener(UnityAction call);

パラメータ:

名前説明
callUnityActionパラメータなしのコールバックメソッド

使用例:

myEvent.RemovePriorityListener(OnEventTriggered);
AddConditionalListener()

条件がtrueと評価された場合にのみ実行されるリスナーを登録します。

void AddConditionalListener(UnityAction call, Func<bool> condition, int priority = 0);

パラメータ:

名前説明
callUnityActionコールバックメソッド
conditionFunc<bool>述語関数(null = 常に実行)
priorityint実行優先度(デフォルト: 0)

使用例:

myEvent.AddConditionalListener(
OnHealthLow,
() => playerHealth < 20,
priority: 10
);
RemoveConditionalListener()

条件付きリスナーの登録を解除します。

void RemoveConditionalListener(UnityAction call);

パラメータ:

名前説明
callUnityActionパラメータなしのコールバックメソッド

使用例:

myEvent.RemoveConditionalListener(OnEventTriggered);
AddPersistentListener()

シーン変更を超えて存続するグローバルリスナー(DontDestroyOnLoad)を登録します。

void AddPersistentListener(UnityAction call, int priority = 0);

パラメータ:

名前説明
callUnityActionコールバックメソッド
priorityint実行優先度(デフォルト: 0)

使用例:

globalEvent.AddPersistentListener(OnGlobalAction, priority: 100);
永続性

Persistentリスナーはシーンのロード間もアクティブなままです。セーブ管理や分析などのグローバルシステムに使用してください。

RemovePersistentListener()

永続的リスナーの登録を解除します。

void RemovePersistentListener(UnityAction call);

パラメータ:

名前説明
callUnityActionパラメータなしのコールバックメソッド

使用例:

myEvent.RemovePersistentListener(OnEventTriggered);

⚡ トリガーイベント(ファンアウトパターン)

AddTriggerEvent()

このイベントが発行されたときに自動的にトリガーされるターゲットイベントを登録します。

TriggerHandle AddTriggerEvent(
GameEventBase targetEvent,
float delay = 0f,
Func<bool> condition = null,
int priority = 0
);

パラメータ:

名前説明
targetEventGameEventBaseトリガーするイベント
delayfloatオプションの遅延(秒)(デフォルト: 0)
conditionFunc<bool>実行をゲートするオプションの述語
priorityint他のトリガーに対する実行順序(デフォルト: 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);
ファンアウトパターン

トリガーは並列に実行されます - 各トリガーは独立しています。1つのトリガーの条件が失敗したり例外をスローしても、他のトリガーは実行されます。

RemoveTriggerEvent() (ハンドルによる)

一意のハンドルを使用して特定のトリガーを安全に削除します。

void RemoveTriggerEvent(TriggerHandle handle);

パラメータ:

名前説明
handleTriggerHandleAddTriggerEvent()から返されたハンドル

使用例:

TriggerHandle handle = doorEvent.AddTriggerEvent(lightEvent);

// 特定のトリガーを削除
doorEvent.RemoveTriggerEvent(handle);
推奨

これは特定のトリガーインスタンスのみを削除するため、最も安全な削除方法です。

RemoveTriggerEvent() (ターゲットによる)

特定のターゲットイベントを指すトリガーをすべて削除します。

void RemoveTriggerEvent(GameEventBase targetEvent);

パラメータ:

名前説明
targetEventGameEventBase切断するターゲットイベント

使用例:

doorEvent.RemoveTriggerEvent(lightEvent);
広範囲への影響

これは、このイベントをターゲットとするすべてのトリガーを削除します。他のシステムによって登録されたものも含まれます。正確性のためにRemoveTriggerEvent(handle)を使用してください。

RemoveAllTriggerEvents()

このイベントからすべてのトリガーイベントを削除します。

void RemoveAllTriggerEvents();

使用例:

myEvent.RemoveAllTriggerEvents();

🔗 チェーンイベント(シーケンシャルパターン)

AddChainEvent()

チェーンで順次実行されるターゲットイベントを登録します。

ChainHandle AddChainEvent(
GameEventBase targetEvent,
float delay = 0f,
float duration = 0f,
Func<bool> condition = null,
bool waitForCompletion = false
);

パラメータ:

名前説明
targetEventGameEventBaseチェーンで実行するイベント
delayfloatこのノードを実行する前の遅延(デフォルト: 0)
durationfloatこのノードを実行した後の遅延(デフォルト: 0)
conditionFunc<bool>オプションの述語 - falseの場合チェーンが中断
waitForCompletionbool実行後に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
);
順次実行

チェーンは順次(A → B → C)実行されます。いずれかのノードの条件がfalseを返すか例外をスローした場合、チェーン全体がその時点で停止します。

トリガー vs チェーン
  • トリガー = 並列(A → [B, C, D]) - すべて独立して実行
  • チェーン = 順次(A → B → C) - 厳密な順序、失敗時に停止
RemoveChainEvent() (ハンドルによる)

一意のハンドルを使用して特定のチェーンノードを安全に削除します。

void RemoveChainEvent(ChainHandle handle);

パラメータ:

名前説明
handleChainHandleAddChainEvent()から返されたハンドル

使用例:

ChainHandle handle = eventA.AddChainEvent(eventB);

// 特定のチェーンノードを削除
eventA.RemoveChainEvent(handle);
RemoveChainEvent() (ターゲットによる)

特定のターゲットイベントを指すチェーンノードをすべて削除します。

void RemoveChainEvent(GameEventBase targetEvent);

パラメータ:

名前説明
targetEventGameEventBase切断するターゲットイベント

使用例:

eventA.RemoveChainEvent(eventB);
広範囲への影響

これは、このイベントをターゲットとするすべてのチェーンノードを削除します。正確性のためにRemoveChainEvent(handle)を使用してください。

RemoveAllChainEvents()

このイベントからすべてのチェーンイベントを削除します。

void RemoveAllChainEvents();

使用例:

myEvent.RemoveAllChainEvents();

🔧 設定とユーティリティ

SetInspectorListenersActive()

イベントが発行されたときにInspectorで設定されたリスナーを実行するかどうかを制御します。

void SetInspectorListenersActive(bool isActive);

パラメータ:

名前説明
isActiveboolInspectorリスナーを有効にする場合は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);

パラメータ:

名前説明
databaseGameEventDatabase登録するデータベースアセット

例:

var combatDB = Resources.Load<GameEventDatabase>("CombatEvents");
GameEventManager.Instance.RegisterDatabase(combatDB);
UnregisterDatabase()

実行時に GameEventDatabase の登録を解除し、そのすべてのイベントを稼働中のシステムから取り除きます。関連するバインディングと実行時コールバックもクリーンアップされます。null や未登録のデータベースに対しても安全に呼び出せます。

void UnregisterDatabase(GameEventDatabase database);

パラメータ:

名前説明
databaseGameEventDatabase取り除くデータベースアセット

例:

GameEventManager.Instance.UnregisterDatabase(combatDB);
SetDatabaseActive()

登録済みデータベースの有効状態を、登録を解除せずに切り替えます。無効化されたデータベースはリストに残りますが、所属するイベントは呼び出しを受け取りません。

void SetDatabaseActive(GameEventDatabase database, bool active);

パラメータ:

名前説明
databaseGameEventDatabase対象データベース(登録済みであること)
activebooltrue で有効化、false でミュート

例:

// カットシーン中は戦闘イベントを一時停止
GameEventManager.Instance.SetDatabaseActive(combatDB, false);

// カットシーン終了後に再開
GameEventManager.Instance.SetDatabaseActive(combatDB, true);
Register と SetActive の違い
  • 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 を返します。

GameEventBase GetGameEvent(string guid);
bool TryGetGameEvent(string guid, out GameEventBase evt);

例:

if (GameEventManager.Instance.TryGetGameEvent(savedGuid, out var evt))
evt.Raise();
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);

パラメータ:

名前説明
namestring完全一致で検索するイベント名
categorystring任意のカテゴリフィルタ(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 と名前の使い分け
  • 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 / 名前 / カテゴリ / 型でイベントを検索