Как вы думаете, инкапсуляция Unity ECS с использованием методов расширения и синглтон-класса? - PullRequest
0 голосов
/ 19 апреля 2020

Я думал о некоторой инкапсуляции 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);
    }
}

Что вы думаете такого подхода?

1 Ответ

1 голос
/ 19 апреля 2020

Плюсы:

  • Все в одном месте, в случае обновления (например, когда World.Active стал World.DefaultGameObjectInjectionWorld и фабрики настроек больше не принимают ноль как BlobAssetStore), вам нужно внести изменения в одном месте

  • Более краткий синтаксис, см. использование:

var sourceEntity = gameObject.ToEntity();
var instance = sourceEntity.Instantiate();
instance.SetPosition(new float3(1,2,3));

Минусы:

  • Добавляет сложность

  • Все члены команды должны знать об этом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...