Skip to content

Latest commit

 

History

History
256 lines (189 loc) · 11.3 KB

README.RU.md

File metadata and controls

256 lines (189 loc) · 11.3 KB

LeoECS Lite Baking - Unity Conversion Workflow для Leopotam ECS Lite

License Last Commit Code Size

Содержание

🧾 Введение

Пакет расширяет функциональность библиотеки Leopotam ECS Lite инструментами для конфигурации сущностей через Unity Inspector на сцене и в префабах.

💡 Особенности

  • Открытый исходный код: Эта библиотека с открытым исходным кодом и бесплатна для использования.
  • Прост в использовании: Просто добавьте AuthoringComponent к вашему компоненту и добавьте метод ConvertScene к вашим IEcsSystems.
  • Режимы конвертации: Вы можете выбрать, как конвертировать GameObjects в Entity.
  • Поддержка префабов: Вы можете создавать префабы с AuthoringComponent, и они будут конвертироваться в Unity.Entity после создания.
  • Расширяемость: Гибкая архитектура для расширения функциональности в соответствии с вашими потребностями.
  • Похож на Entities: Эта библиотека похожа на процесс конвертации Entities.
  • Легковесный: Эта библиотека легковесная и имеет только одну зависимость.
  • Декларативный: Вы можете управлять значениями вашего компонента в Unity Inspector.

📥 Установка

📦 С использованием UPM:

  1. Откройте окно Unity Package Manager.
  2. Нажмите кнопку + в верхнем правом углу окна.
  3. Выберите Add package from git URL....
  4. Введите ссылку на репозиторий Leopotam ECS Lite.
  5. Нажмите Add.
  6. Повторите шаги 2-5 для этого репозитория.

⚙️ Вручную:

Добавьте следующие строки в Packages/manifest.json в раздел dependencies:

"com.leopotam.ecslite": "https://github.com/Leopotam/ecslite.git",
"com.leopotam.ecslite.baking": "https://github.com/g0dzZz-coder/ecslite.baking.git"

📋 Примеры использования

Создание собственного компонента

[Serializable] // <- Важно добавить атрибут Serializable!
public struct Health
{
    public float Value;
}

Для управления значением Value через Unity Inspector мы можем работать только с классами MonoBehaviour. Поэтому следующим шагом будет создание AuthoringComponent для нашего компонента.

Создание нового AuthoringComponent

  1. С стандартным бейкером:
public sealed class HealthAuthoringComponent : AuthoringComponent<HealthComponent> { }
  1. Или с кастомным:
public sealed class HealthAuthoringComponent : AuthoringComponent<HealthComponent> 
{
    public override IBaker<HealthComponent> CreateBaker(PackedEntityWithWorld entity) => new Baker(entity);

    private sealed class Baker : IBaker<HealthComponent> 
    {
        public void Bake(IAuthoring authoring) 
        {
            // Реализуйте вашу логику здесь.
        }
    }
}
Вид в инспекторе

Health Authoring Component

  1. Если не нравится вложенность Value, то можете создать свою реализацию IAuthoring:
public sealed class HealthAuthoringComponent : MonoBehaviour, IAuthoring
{
    [Min(0)] [SerializeField] private float _value;

    public IBaker CreateBaker(PackedEntityWithWorld entity) => new Baker(_value, entity);

    private readonly struct Baker : IBaker
    {
        private readonly float _value;
        private readonly PackedEntityWithWorld _entity;

        public Baker(float value, PackedEntityWithWorld entity)
        {
            _value = value;
            _entity = entity;
        }

        void IBaker.Bake(IAuthoring authoring)
        {
            if (_entity.Unpack(out var world, out var entity))
            {
                world.Pool<Health>().Replace(entity, _value);
            }
        }
    }
}
Вид в инспекторе

Health Authoring Component

Добавьте HealthAuthoringComponent в Inspector.

AuthoringEntity будет автоматически добавлена к GameObject. Этот компонент необходим для поиска конвертированных корней в сцене и хранения упакованной сущности из мира ECS.

Теперь вы можете настроить значения компонента в инспекторе. Поздравляю!

⚠️ В данный момент Вы не можете управлять значениями из инспектора во время выполнения.

Выбор режима конвертации

Вы можете выбрать, как конвертировать GameObjects в Entity. На текущий момент доступно 3 режима:

Вид в инспекторе

Conversion Mode

Режим Описание
Convert and Inject Просто создает сущности с компонентами на основе GameObject.
Convert and Destroy Удаляет GameObject после конвертации.
Convert and Save Сохраняет ассоциированный GameObject как сущность в скрипте AuthoringEntity.

Вы также можете извлечь значение из AuthoringEntity:

if (_authoringEntity.TryGetEntity().HasValue) 
{
    _authoringEntity.TryGetEntity().Value;
}

Конвертация ваших объектов в Entity

Чтобы автоматически конвертировать GameObjects в Entity, cоздайте (или используйте существующие) IEcsSystems и добавьте метод ConvertScene:

private void Start() 
{
    _world = new EcsWorld();    
    _systems = new EcsSystems(_world);
    _systems
        .ConvertScene() // <- Need to add this method.
        .Add(new ExampleSystem());
    
    _systems.Init();
 }

ConvertScene автоматически сканирует cцену, находит GameObjects с AuthoringEntity и IAuthoring, создает сущность и добавляет компоненты к Entity из мира ECS.

Спавн префабов

Вы можете создавать префабы с AuthoringComponent, и они будут конвертироваться в Entity после создания.

Object.Instantiate(gameObject, position, rotation);
// Также работает с 3rd party Assets:
PhotonNetwork.Instantiate(...)

Работа с расширением Unity Editor

Пожалуйста, добавьте метод ConvertScene после расширений UnityEditor:

#if UNITY_EDITOR
        // Добавьте отладочные системы для пользовательских миров здесь, например:
        .Add(new Leopotam.EcsLite.UnityEditor.EcsWorldDebugSystem())
#endif
        .ConvertScene() // <- Необходимо добавить этот метод.

🖇️ Зависимости

🤝 Сотрудничество

Я рад приветствовать запросы на добавление новых функций и сообщения об ошибках в разделе issues и также принимать pull requests.

🫂 Поддержка

Я независимый разработчик, и большая часть разработки этого проекта выполняется в свободное время. Если вы заинтересованы в сотрудничестве или найме меня для проекта, ознакомьтесь с моим портфолио и свяжитесь со мной!

🔐 Лицензия

Этот проект распространяется под лицензией Apache-2.0

Copyright (c) 2023 Николай Мельников [email protected]