From b5b08cb68d61955fa8754c309d83c265e1dbc1f5 Mon Sep 17 00:00:00 2001 From: Mikhail <99481254+DCFApixels@users.noreply.github.com> Date: Thu, 22 Jun 2023 11:54:22 +0800 Subject: [PATCH] Update README-RU.md --- README-RU.md | 66 +++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 63 insertions(+), 3 deletions(-) diff --git a/README-RU.md b/README-RU.md index a1d914f..1a10ae8 100644 --- a/README-RU.md +++ b/README-RU.md @@ -242,11 +242,71 @@ sealed class DoSomethingProcessRunner : EcsRunner, IDoSomet Является контейнером для сущностей и компонентов. > **NOTICE:** Необходимо вызывать EcsWorld.Destroy() у экземпляра мира если он больше не нужен. ### Компоненты мира -С помощью компонентов можно прикреплять дополнительные данные к мирам. Компоненты можно применять создания расширений в связке с методами расширений. +С помощью компонентов можно прикреплять дополнительные данные к мирам. В качестве компонентов используются `struct` типы. ``` csharp -WorldComponent component = _world.Get(); +ref WorldComponent component = ref _world.Get(); ``` - +Реализация компонента: +``` csharp +public struct WorldComponent +{ + // Данные. +} +``` +Так же можно реализовать интерфейс IEcsWorldComponent для обработки событий: +``` csharp +public struct WorldComponent : IEcsWorldComponent +{ + // Данные. + void IEcsWorldComponent.Init(ref WorldComponent component, EcsWorld world) + { + // Действия при инициализации компонента. Вызывается до первого возвращения из EcsWorld.Get + } + void IEcsWorldComponent.OnDestroy(ref WorldComponent component, EcsWorld world) + { + // Действия когда вызывается EcsWorld.Destroy. + // Вызов OnDestroy, обязует пользователя вручную обнулять компонент, если это необходимо. + component = default; + } +} +``` + +
+Пример использования + +События интерфейса IEcsWorldComponent, могут быть использованы для автоматической инициализации полей компонента, и освобождения ресурсов. +``` csharp +public struct WorldComponent : IEcsWorldComponent +{ + private SomeClass _object; // Объект который будет утилизироваться. + private SomeReusedClass _resusedObject; // Объект который будет переиспользоваться. + public SomeClass Object => _object; + public SomeReusedClass ResusedObject => _resusedObject; + void IEcsWorldComponent.Init(ref WorldComponent component, EcsWorld world) + { + if (component._resusedObject == null) + component._resusedObject = new SomeReusedClass(); + component._object = new SomeClass(); + // Теперь при получении компонента через EcsWorld.Get, _resusedObject и _object уже будут созданы. + } + void IEcsWorldComponent.OnDestroy(ref WorldComponent component, EcsWorld world) + { + // Утилизируем не нужный объект, и освобождаем ссылку на него, чтобы GC мог его собрать. + component._object.Dispose(); + component._object = null; + + // Как вариант тут можно сделать сброс значений у переиспользуемого объекта. + //component._resusedObject.Reset(); + + //Так как в этом примере не нужно полное обнуление компонента, то строчка ниже не нужна. + //component = default; + } +} +``` + +
+ +> Компоненты можно применять для создания расширений в связке с методами расширений. ## Пул Является контейнером для компонентов, предоставляет методы для добавления/чтения/редактирования/удаления компонентов на сущности. Есть несколько видов пулов, для разных целей * `EcsPool` - универсальный пул, хранит struct-компоненты реализующие интерфейс IEcsComponent;