From e40e91ad03108c578a61ba9e7f0990b957562bb5 Mon Sep 17 00:00:00 2001 From: Mikhail <99481254+DCFApixels@users.noreply.github.com> Date: Wed, 1 Apr 2026 12:51:43 +0800 Subject: [PATCH] Update README-RU.md --- README-RU.md | 43 ++++++++++++++++++++++++++++++++----------- 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/README-RU.md b/README-RU.md index 96abc1d..f8841db 100644 --- a/README-RU.md +++ b/README-RU.md @@ -210,7 +210,7 @@ _pipeline = EcsPipeline.New() ## Шаблон компонента -Чтобы компонент попал в меню `Add Component` требуется шаблон. Шаблоны компонента это типы реализующие `IComponentTemplate`. +Чтобы компонент попал в меню `Add Component` требуется шаблон. Шаблоны компонента это типы реализующие `IComponentTemplate` или `ITemplateNode` вместе с `IEcsComponentMember`. ### Реализация @@ -230,9 +230,25 @@ class SomeTagComponentTemplate : TagComponentTemplate { } ```
-* Полная реализация: +Другие способы -Если не подходят `ComponentTemplate` или `TagComponentTemplate`, можно напрямую реализовать интерфейс `IComponentTemplate`. Например это может пригодиться для работы в связке с кастомной реализацией пула. В большинстве случаев достаточно упрощенной. +#### Реализация `ITemplateNode` у компонента + +Такой способ может быть удобен тем что не требует создания отдельного класса шаблона, компонент сам выступает как шаблон, и он так же прост в реализации. Минус данного подхода, что проще случайно переименовать компонент и получить Missing Reference в местах с атрибутом `[SerializeReference]`. +```c# +public struct Health : IEcsComponent, ITemplateNode +{ + public float Points; + public void Apply(short worldID, int entityID) + { + EcsPool.Apply(worldID, entityID) = this; + } +} +``` + +#### Реализация кастомного шаблона + +Если не подходят встроенные `ComponentTemplate` или `TagComponentTemplate`, можно создать свой шаблон реализующий `IComponentTemplate`. Например это может пригодиться для кастомного пула. В большинстве случаев достаточно использовать встроенные шаблоны. ```c# [Serializable] @@ -245,7 +261,7 @@ class SomeComponentTemplate : IComponentTemplate public bool IsUnique { get { return true; } } public void Apply(int worldID, int entityID) { - EcsWorld.GetPoolInstance>(worldID).TryAddOrGet(entityID) = component; + EcsPool>.Apply(worldID, entityID) = component; } public object GetRaw() { return component; } public void SetRaw(object raw) { component = (SomeComponent)raw; } @@ -271,23 +287,28 @@ class SomeComponentTemplate : IComponentTemplate ### Применение шаблонов компонентов вне стандартных шаблонов сущностей Шаблоны компонентов можно использовать не только внутри стандартных `MonoEntityTemplate` и `ScriptableEntityTemplate`, но и в любых пользовательских классах. Для этого предусмотрены два способа: -Атрибут `[ComponentTemplateReference]`: +Атрибут `[ComponentTemplateField]`: ```c# -// Добавляет кнопку выбора доступной реализации IComponentTemplate -// и отображает шаблон компонента аналогично компонентам в MonoEntityTemplate или ScriptableEntityTemplate. -[SerializeReference, ComponentTemplateReference] -private IComponentTemplate _someComponent1; +// Отображение поля как компонента, настраиваемая мета атрибутами. +// Аналогично компонентам в MonoEntityTemplate или ScriptableEntityTemplate. +[SerializeField, ComponentTemplateField] +private SomeComponent _someComponent1; +``` +```c# +// Для SerializeReference добавляет кнопку выбора доступной реализации ITemplateNode +[SerializeReference, ComponentTemplateField] +private ITemplateNode _someComponent1; ``` Обертка `ComponentTemplateProperty`: ```c# -// Обертка над IComponentTemplate, аналогично примеру с атрибутом ComponentTemplateReference. +// Обертка над ITemplateNode, аналогично примеру с атрибутом ComponentTemplateField. private ComponentTemplateProperty _someComponent2; ``` Оба подхода работают и для массивов: ```c# -[SerializeReference, ComponentTemplateReference] +[SerializeReference, ComponentTemplateField] private IComponentTemplate[] _components; // или private ComponentTemplateProperty[] _components;