- Инициализацию
Filter
необходимо заканчивать методомBuild()
, напримерWorld.Filter.With<Component>().Build()
. - Удален
ComponentProvider
, если вы им пользовались, то можно скопировать его из старых версий или написать свой аналог.
- Как альтернатива Odin Inspector пришел Tri Inspector. Теперь у фреймворка нет платных зависимостей. Вы можете использовать оба варианта на выбор.
- Добавлены аспекты. Это вспомогательные структуры, которые помогают делать срез из набора компонентов на сущностях. Подробнее в ридми.
- Теперь можно полностью очистить стеш от компонентов вызвав
stash.RemoveAll()
. Удобно когда вы делаете OneFrame Components и уверены, что в какой-то момент никаких компонентов определенного типа не должно существовать в мире. - Для провайдеров добавлены методы деинициализации по аналогии с инициализацией.
World.JobHandle
позволяет связывать джобы в рамках однойSystemsGroup
. Подробнее в ридми.- Добавлены метрики для профайлера, которые позволяют следить за количеством сущностей, количеством архетипов и прочим. Подробнее в ридми.
- Добавлен флаг и метод для проверки, что мир уже удален и он в невалидном состоянии.
World.IsDisposed
иWorld.IsNullOrDisposed()
соответственно. - Добавлен дефайн
MORPEH_DISABLE_SET_ICONS
, чтобы отключать назначение иконок в редакторе у наследников провайдеров, систем и прочего. - Теперь метод
World.Commit()
проверяет, что не вызван внутри итерации по фильтру, потому что иначе это приведет к изменению фильтра. - Добавлен флаг
World.DoNotDisableSystemOnException
который позволяет не отключать системы, когда они выкидывают исключения в режиме отладки. На релизную версию никак не влияет. - Добавлен метод
Filter.IsNotEmpty()
.
Вы можете продолжать использовать Odin Inspector или перейти на Tri Inspector.
Для этого вам необходимо добавить Tri Inspector по Git URL.
Удалить Odin, и удалить Odin Inspector дефайны из Player Settings.
- Минимальная версия Unity поднята до 2020.3.* LTS
- Неймспейсы изменены с
Morpeh
наScellecs.Morpeh
,Scellecs.Morpeh.Systems
,Scellecs.Morpeh.Providers
. - Глобалы выделены в отдельный пакет по ссылке https://github.com/scellecs/morpeh.globals.
- Метод
World.UpdateFilters()
переименован вWorld.Commit()
. - Класс
ComponentsCache<>
переименован вStash<>
. Все методы для стешей утратили приставкуComponent
, теперь простоAdd, Get, Set, Has, Remove
. - Фильтры валидируют, что в них нет повторяющих типов. Например на
Filter.With<A>().With<A>()
будет выведена ошибка. - Из систем удалено проперти
Filter
, вместо этого нужно использоватьWorld.Filter
.
- Добавлены
ICleanupSystem
подходящие для логики отчистки. По умолчанию вызываются самыми последними в LateUpdate. - Переработан механизм отчистки компонентов. Теперь компонент должен имплементировать
IDisposable
, и необходимо единожды вызвать у стеша методAsDisposable
, чтобы отчистка происходила. Например самый короткий вариантWorld.GetStash<T>().AsDisposable()
. - У
World
добавлен методGetReflectionStash
, чтобы получать стеш не через дженерик аргумент, а поSystem.Type
. - Добавлен дефайн
MORPEH_THREAD_SAFETY
, который заставляет ядро валидировать, что все вызовы идут из того же потока в котором мир был создан. Привязку к треду можно изменить через методыWorld.GetThreadId(), World.SetThreadId()
. - Добавлено API для плагинов. Для использования нужно имплементировать
IWorldPlugin
.
- Асмдеф и ссылки изменены с
XCrew.Morpeh
наScellecs.Morpeh
. Неймспейсы те же, что и были. - Все глобалы утратили метод
NextFrame
. Вместо него теперь необходимо использовать методPublish
, который отправляет событие не в этот кадр, а в следующий как ранее делалNextFrame
. Отправить событие в текущем кадре теперь невозможно, оно всегда отложенное. Это изменение связано с тем, что на всех проектах использовалась связка Publish + NextFrame, либо только NextFrame. Entity.ID
теперь возвращает неint
, а структуру типаEntityID
в которой содержаться поляid
иgen
. Это необходимое изменение для работы с Jobs и Burst. Так же добавлен методWorld.TryGetEntity(EntityId entityId, out Entity entity)
, который позволяет проверить наличие сущности без прямой ссылки на нее.Filter.Length
удален полностью. Его заменила связкаFilter.GetLengthSlow()
иFilter.IsEmpty()
. Это изменение связано с тем, что обновление кешированного значения длины для каждого фильтра давало большую нагрузку, а учитывая, что большинству фильтров не требовалось проверка на длину, то это была пустая нагрузка. Важный момент, что длина чаще всего использовалась для проверки на пустоту фильтра. Теперь получение длины дорогая операция, но проверка на пустоту такая же быстрая как и раньше. Это позволило сильно ускорить проекты с большим количеством фильтров.- Кеши компонентов теперь чистят данные после вызова
entity.RemoveComponent()
и читать данные по ref из компонента после его удаления теперь нельзя. - Итерирование по
Filter
теперь не гарантирует очередность. Если раньше ваша логика в проекте могла зависеть от того в каком порядке сущности попадают и удаляются из фильтра, то теперь необходимо от этого избавится. - Удален
ComponentsBag
. На его замену пришел полный публичный доступ к кешам компонентовComponentsCache
.
- Добавлены новые интерфейсы для компонентов
IValidatable
,IValidatableWithGameObject
. Позволяет вызывать стандартный юнитевский методOnValidate
на компонентах, чтобы, например, проинициализровать поля в редакторе. Работает только для компонентов, добавленных через MonoProvider. - Добавлено нативное апи для работы с Job и Burst. Подробно о его работе можно прочитать в ридми. Теперь есть методы
AsNative()
для:- Archetype (NativeArchetype)
- ComponentsCache (NativeCache)
- FastList (NativeFastList)
- IntFastList (NativeIntFastList)
- Filter (NativeFilter)
- IntHashMap (NativeIntHashMap)
- World (NativeWorld)
- Добавлен интерфейс
IMorpehLogger
и статический классMLogger
. Они позволяют переопределить логирование для Morpeh. Console.WriteLine для окружений кроме Unity по дефолту. - Добавлен дефайн
MORPEH_PROFILING
. Добавление его в Player Settings позволяет профилировать нагрузку от систем без Deep Profile. - Теперь
Entity.Dispose()
стал публичным методом. Это позволяет уничтожить энтити без прямого доступа к миру. - Отображение нескольких миров в World Browser