Я думал о некоторой инкапсуляции Unity ECS с использованием методов расширения и одноразового одноэлементного класса для хранения ссылок на общие ресурсы, такие как BlobAssetStore или EntityManager, что-то вроде этого черновика:
public class EntityComponentSystemResources : IDisposable
{
public readonly BlobAssetStore Store = new BlobAssetStore();
public readonly EntityManager EntityManager = World.DefaultGameObjectInjectionWorld.EntityManager;
private static EntityComponentSystemResources instance = new EntityComponentSystemResources();
public static EntityComponentSystemResources Singleton => instance ?? new EntityComponentSystemResources();
public void Dispose()
{
Store.Dispose();
instance = null;
}
}
public static class EntityExtensionMethods
{
public static Entity ToEntity(this GameObject gameObject)
{
var settings = GameObjectConversionSettings.FromWorld(World.DefaultGameObjectInjectionWorld, EntityComponentSystemResources.Singleton.Store);
var entity = GameObjectConversionUtility.ConvertGameObjectHierarchy(gameObject, settings);
return entity;
}
public static void SetComponentData<T>(this Entity entity, T data) where T : struct, IComponentData
{
EntityComponentSystemResources.Singleton.EntityManager.SetComponentData(entity, data);
}
public static void SetSharedComponentData<T>(this Entity entity, T data) where T : struct, ISharedComponentData
{
EntityComponentSystemResources.Singleton.EntityManager.SetSharedComponentData(entity, data);
}
public static void SetPosition(this Entity entity, float3 position)
{
SetComponentData(entity, new Translation { Value = position });
}
public static void SetRotation(this Entity entity, quaternion rotation)
{
SetComponentData(entity, new Rotation { Value = rotation });
}
public static Entity Instantiate(this Entity entity)
{
return EntityComponentSystemResources.Singleton.EntityManager.Instantiate(entity);
}
}
Что вы думаете такого подхода?