Reactive Entity Setsガイド
実験的機能 - Reactive Entity Setsはv2.1.0で利用可能です。APIは将来のバージョンで変更される可能性があります。本番環境での使用は自己責任で行ってください。
重要な注意 — ランタイムデータの永続性 ScriptableObjectはシーンをまたいでデータを保持できますが、シーン遷移中にどのオブジェクトからも参照されなくなると、Unityによってメモリからアンロードされランタイムデータが消失します。これを防ぐには、Manager Sceneパターンと
ReactiveEntitySetHolderを使用してください。詳細は永続化を参照してください。
目的
このガイドでは、集中化されたエンティティ状態管理のためのReactive Entity Setsの使い方を説明します。Runtime Setsとの違い、エンティティデータの定義方法、エンティティごとの状態変更のサブスクライブ方法を学びます。
Reactive Entity Setsとは?
Reactive Entity Setsは、自動変更通知付きでエンティティごとのデータを格納するScriptableObjectベースの状態コンテナです。オブジェクト参照のみを追跡するRuntime Setsとは異なり、Reactive Entity Setsは各エンティティの実際の状態(体力、スコア、ステータスエフェクト)を格納します。
// エンティティIDで状態を格納
entitySet.Register(this, new EnemyState { Health = 100 });
// どこからでも状態を読み取り
var state = entitySet.GetData(entityId);
// 自動イベント付きで状態を更新
entitySet.UpdateData(this, state => {
state.Health -= 10;
return state;
});
このアーキテクチャは以下を可能にします。
- エンティティ状態がシーンロードをまたいで保持される
- IDで任意のエンティティの状態にアクセスできる
- Sparse Setによる定数時間操作(O(1))
- 特定のエンティティの変更をサブスクライブできる
いつReactive Entity Setsを使うか
Reactive Entity Setsを使う場合
- エンティティごとの状態が必要(体力、マナ、ステータスエフェクト)
- オブジェクトを取得せずにIDでルックアップしたい
- 状態をシーン間で永続化する
- 外部システムからエンティティデータを読み取る(UI、AI、ネットワーク)
Runtime Setsを使う場合
- アクティブなオブジェクトの追跡のみが必要(エンティティごとの状態なし)
- 個別データを必要とせず全オブジェクトを反復する
- IDベースのルックアップが不要
比較
| 機能 | Runtime Sets | Reactive Entity Sets |
|---|---|---|
| 格納 | オブジェクト参照 | エンティティごとのデータ構造体 |
| ルックアップ | 反復のみ | IDでO(1) |
| イベント | コレクション変更 | エンティティごと + コレクション |
| 永続化 | シーンライフサイクル | ScriptableObject |
| ユースケース | オブジェクト追跡 | 状態管理 |
クイック判断ガイド
| シナリオ | 使用 |
|---|---|
| レベル内のすべての敵を追跡 | Runtime Set |
| 各敵の体力とステータスを格納 | Reactive Entity Set |
| ミニマップアイコンを表示 | Runtime Set |
| 個別のヘルスバーを表示 | Reactive Entity Set |
アーキテクチャ概要
flowchart TB
subgraph EntitySet["ReactiveEntitySetSO<EnemyState>"]
SS[Sparse Set]
subgraph Data["エンティティごとの状態"]
D1["ID: 101 → Health: 80"]
D2["ID: 102 → Health: 100"]
D3["ID: 103 → Health: 45"]
end
Traits["Traitsマスク (ulong)"]
subgraph Events["イベントチャンネル"]
E1[OnItemAdded]
E2[OnItemRemoved]
E3[OnDataChanged]
E4[OnTraitAdded]
end
end
View[ReactiveView]
Enemy1[Enemy 101] -->|Register/Update| SS
Enemy2[Enemy 102] -->|Register/Update| SS
SS --> Data
SS --> Traits
Data -->|状態変更| E3
Traits -->|Traits変更| E4
E3 -->|通知| UI[ヘルスバーUI]
E3 -->|通知| AI[AIシステム]
E4 -->|フィルタードメンバーシップ| View
Sparse Set — O(1)の登録・検索・削除を実現するデータ構造です。エンティティIDから状態データへの高速なマッピングを提供します。
データは3つのステージでシステムを流れます。
- エンティティスポーン →
ReactiveEntity.OnEnable()→ EntitySetに登録 - 状態更新 →
UpdateData()→ エンティティごとのコールバックが発火 - エンティティ破棄 →
ReactiveEntity.OnDisable()→ EntitySetから登録解除
ガイドセクション
| ページ | 説明 |
|---|---|
| 基本的な使い方 | state構造体の定義、アセット作成、エンティティ登録 |
| イベント | エンティティごとのサブスクリプション、セットレベルの通知 |
| Traits | エンティティの分類とフィルタリングのためのビットマスクフラグ |
| Views | メンバーシップを自動追跡するリアクティブなフィルタードサブセット |
| パターン | ボスヘルスバー、ステータスエフェクト、セーブ/ロード |
| ベストプラクティス | パフォーマンスのヒント、トラブルシューティング |
| 永続化 | シーン遷移時のデータ消失を防ぐ |
| Job System | Orchestratorを使った高性能並列処理 |
| 可観測性 | 集合論的可観測性とスナップショットパターン |
関連ドキュメント
設計思想と理論的基礎はRES設計を参照してください。