From 32c218f852db0a003fc267d50db9aad956fae891 Mon Sep 17 00:00:00 2001 From: Mikhail <99481254+DCFApixels@users.noreply.github.com> Date: Wed, 8 Nov 2023 16:37:41 +0800 Subject: [PATCH] Update README-RU.md --- README-RU.md | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 73 insertions(+), 1 deletion(-) diff --git a/README-RU.md b/README-RU.md index f687fd8..455e117 100644 --- a/README-RU.md +++ b/README-RU.md @@ -41,6 +41,7 @@ * [Корень ECS](#Корень-ECS) * [Пример для Unity](#Пример-для-Unity) * [Общий пример](#Общий-пример) + * [Гибридность](#Гибридность) * [Debug](#Debug) * [Атрибуты](#Атрибуты) * [EcsDebug](#EcsDebug) @@ -556,7 +557,78 @@ public class EcsRoot } } ``` - +## Гибридность +Для смешивания архитектурных подходов классического OOP и ECS используется специальный пул `EcsHybridPool`. Принцип работы этого пула несколько отличается от других, он упрощает поддержу наследования и полиморфизма. + +
+Как это работает? + +При добавлении элемента в пул, пул сканирует его иерархию наследования и реализуемые интерфейсы в поиске типов у которых есть интерфес `IEcsHybridComponent` и автоматически добавляет компонент в соответсвующие этим типам пулы. Таким же образом происходит удаление. Сканирвоание просиходит не для типа T а для типа экземпляра, поэтому в примере ниже строчка в `_world.GetPool().Add(entity, _rigidbody);` добавляет не только в пул `EcsHybridPool` но и в остальные. + +
+ +Пример использования: +``` csharp +public interface ITransform : IEcsHybridComponent +{ + Vector3 Position { get; set; } + // ... +} +public class Transform : ITransform +{ + public Vector3 Position { get; set; } + // ... +} +public class Rigidbody : ITransform +{ + public Vector3 Position { get; set; } + public float Mass { get; set; } + // ... +} +public class Camera : ITransform +{ + Vector3 Position { get; set; } + // ... +} +// ... + +EcsWorld _world; +Rigidbody _rigidbody; +// ... + +// Создадим пустую сущность. +int entity = _world.NewEmptyEntity(); +// Получаем пул EcsHybridPool и добавляем в него для сущности компонент _rigidbody. +// Если вместо ITransform подставить Transform или Rigidbody, то результат будет одинаковый +_world.GetPool().Add(entity, _rigidbody); +// ... + +//Все эти строчки вернут экземпляр _rigidbody. +ITransform iTransform = _world.GetPool().Get(entity); +Transform transform = _world.GetPool().Get(entity); +Rigidbody rigidbody = _world.GetPool().Get(entity); +//Исключение - отсутсвует компонент. Camera не является наследником или наследуемым классом для _rigidbody. +Camera camera = _world.GetPool().Get(entity); + +//Все эти строчки вернут True. +bool isITransform = _world.GetPool().Has(entity); +bool isTransform = _world.GetPool().Has(entity); +bool isRigidbody = _world.GetPool().Has(entity); +//Эта строчка вернет False. +bool isCamera = _world.GetPool().Has(entity); +// ... + +// Удалим у сущности компонент. +_world.GetPool().Del(entity); +// ... +//Все эти строчки вернут False. +bool isITransform = _world.GetPool().Has(entity); +bool isTransform = _world.GetPool().Has(entity); +bool isRigidbody = _world.GetPool().Has(entity); +bool isCamera = _world.GetPool().Has(entity); +// ... +``` + # Debug Фреймворк предоставляет дополнительные инструменты для отладки и логирования, не зависящие от среды. ## Атрибуты