エンティティの管理
概要
一般的に、特定のエンティティに含まれるコンポーネントを操作したいユーザーに対して、エンジンは種類別にコンポーネントにアクセスしたいと考えています(描画時にはすべてのメッシュコンポーネント、アニメーションの更新時にはすべてのアニメーションコンポーネント、など)。
ユーザーは、コンポーネントベースのエンティティをエンティティマネージャに追加します。
エンジンまたはユーザーは、特定のエンティティやコンポーネントを処理することができるエンティティプロセッサーを登録します。
エンティティ プロセッサー
この問題を解決するために、エンティティプロセッサーというコンセプトが追加されました。 エンティティプロセッサーは、特定の要件(メッシュコンポーネントで処理すべきすべてのエンティティなど)に合致するエンティティにアクセスし、1つの更新関数ですべてのエンティティを処理します。これにより、フレームごとにすべてのエンティティとコンポーネントを何度もチェックする必要がなくなり、効率性とキャッシュの利便性が向上します。
また、このアプローチは、更新順序の依存性に関する多くの問題を解決します(エンティティプロセッサーが適切な順番で更新するよう並べ替える必要があります)。
エンティティプロセッサーの例を紹介します。
@'Stride.Engine.TransformationProcessor': 階層と、@'Stride.Engine.TransformationComponent' に格納されているローカル変換から、変換行列を計算します。
その結果、単純なエンティティリストの代わりに、EntityManager を階層化シーングラフとして使用することができます。
@'Stride.Engine.MeshProcessor': Model をレンダリングに追加します。
@'Stride.Engine.LightProcessor': ライトを集めて更新し、レンダリングシステムに転送します。実装の詳細(遅延レンダリングやフォワードレンダリングなど)は隠蔽されます。
エンティティ システム
エンティティは、EntityManager にまとめられています。これには、エンティティプロセッサーのリストも含まれます。エンティティが追加されたり、エンティティコンポーネントが変更されたりする際には、エンティティプロセッサーを含めるべきかを問い合わせます。
// エンティティを追加
var myEntity = new Entity();
engine.EntityManager.AddEntity(myEntity);
// 追加されたエンティティを順番に処理
foreach (var entity in engine.EntityManager.Entities)
{
Console.WriteLine(entity.Name);
}
EntityManager は、Entities (ref:{Stride.Engine.Entity})
を列挙するために使うことができます。エンティティの子のエンティティもこのリストに含まれることに注意してください。
エンティティをシーングラフとして操作するには、@'Stride.Engine.TransformationComponent'クラスを使用してください。