LeoECS Lite Baking - Unity Conversion Workflow для Leopotam ECS Lite
Содержание
Пакет расширяет функциональность библиотеки Leopotam ECS Lite инструментами для конфигурации сущностей через Unity Inspector на сцене и в префабах.
- Открытый исходный код: Эта библиотека с открытым исходным кодом и бесплатна для использования.
- Прост в использовании: Просто добавьте
AuthoringComponent
к вашему компоненту и добавьте методConvertScene
к вашимIEcsSystems
. - Режимы конвертации: Вы можете выбрать, как конвертировать GameObjects в Entity.
- Поддержка префабов: Вы можете создавать префабы с
AuthoringComponent
, и они будут конвертироваться в Unity.Entity после создания. - Расширяемость: Гибкая архитектура для расширения функциональности в соответствии с вашими потребностями.
- Похож на Entities: Эта библиотека похожа на процесс конвертации Entities.
- Легковесный: Эта библиотека легковесная и имеет только одну зависимость.
- Декларативный: Вы можете управлять значениями вашего компонента в Unity Inspector.
- Откройте окно Unity Package Manager.
- Нажмите кнопку + в верхнем правом углу окна.
- Выберите Add package from git URL....
- Введите ссылку на репозиторий Leopotam ECS Lite.
- Нажмите Add.
- Повторите шаги 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
для нашего компонента.
- С стандартным бейкером:
public sealed class HealthAuthoringComponent : AuthoringComponent<HealthComponent> { }
- Или с кастомным:
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)
{
// Реализуйте вашу логику здесь.
}
}
}
- Если не нравится вложенность
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);
}
}
}
}
Добавьте HealthAuthoringComponent
в Inspector.
AuthoringEntity
будет автоматически добавлена к GameObject.
Этот компонент необходим для поиска конвертированных корней в сцене и хранения упакованной сущности из мира ECS.
Теперь вы можете настроить значения компонента в инспекторе. Поздравляю!
⚠️ В данный момент Вы не можете управлять значениями из инспектора во время выполнения.
Вы можете выбрать, как конвертировать GameObjects в Entity. На текущий момент доступно 3 режима:
Режим | Описание |
---|---|
Convert and Inject | Просто создает сущности с компонентами на основе GameObject. |
Convert and Destroy | Удаляет GameObject после конвертации. |
Convert and Save | Сохраняет ассоциированный GameObject как сущность в скрипте AuthoringEntity . |
Вы также можете извлечь значение из AuthoringEntity
:
if (_authoringEntity.TryGetEntity().HasValue)
{
_authoringEntity.TryGetEntity().Value;
}
Чтобы автоматически конвертировать 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(...)
Пожалуйста, добавьте метод ConvertScene
после расширений UnityEditor:
#if UNITY_EDITOR
// Добавьте отладочные системы для пользовательских миров здесь, например:
.Add(new Leopotam.EcsLite.UnityEditor.EcsWorldDebugSystem())
#endif
.ConvertScene() // <- Необходимо добавить этот метод.
- Leopotam ECS Lite - базовая ECS библиотека.
Я рад приветствовать запросы на добавление новых функций и сообщения об ошибках в разделе issues и также принимать pull requests.
Я независимый разработчик, и большая часть разработки этого проекта выполняется в свободное время. Если вы заинтересованы в сотрудничестве или найме меня для проекта, ознакомьтесь с моим портфолио и свяжитесь со мной!
Этот проект распространяется под лицензией Apache-2.0
Copyright (c) 2023 Николай Мельников [email protected]