Update README-RU.md

This commit is contained in:
Mikhail 2026-04-01 12:51:43 +08:00
parent a5e8772701
commit e40e91ad03

View File

@ -210,7 +210,7 @@ _pipeline = EcsPipeline.New()
## Шаблон компонента ## Шаблон компонента
Чтобы компонент попал в меню `Add Component` требуется шаблон. Шаблоны компонента это типы реализующие `IComponentTemplate`. Чтобы компонент попал в меню `Add Component` требуется шаблон. Шаблоны компонента это типы реализующие `IComponentTemplate` или `ITemplateNode` вместе с `IEcsComponentMember`.
### Реализация ### Реализация
@ -230,9 +230,25 @@ class SomeTagComponentTemplate : TagComponentTemplate<SomeComponent> { }
``` ```
<details> <details>
<summary>* Полная реализация:</summary> <summary>Другие способы</summary>
Если не подходят `ComponentTemplate<T>` или `TagComponentTemplate<T>`, можно напрямую реализовать интерфейс `IComponentTemplate`. Например это может пригодиться для работы в связке с кастомной реализацией пула. В большинстве случаев достаточно упрощенной. #### Реализация `ITemplateNode` у компонента
Такой способ может быть удобен тем что не требует создания отдельного класса шаблона, компонент сам выступает как шаблон, и он так же прост в реализации. Минус данного подхода, что проще случайно переименовать компонент и получить Missing Reference в местах с атрибутом `[SerializeReference]`.
```c#
public struct Health : IEcsComponent, ITemplateNode
{
public float Points;
public void Apply(short worldID, int entityID)
{
EcsPool<Health>.Apply(worldID, entityID) = this;
}
}
```
#### Реализация кастомного шаблона
Если не подходят встроенные `ComponentTemplate<T>` или `TagComponentTemplate<T>`, можно создать свой шаблон реализующий `IComponentTemplate`. Например это может пригодиться для кастомного пула. В большинстве случаев достаточно использовать встроенные шаблоны.
```c# ```c#
[Serializable] [Serializable]
@ -245,7 +261,7 @@ class SomeComponentTemplate : IComponentTemplate
public bool IsUnique { get { return true; } } public bool IsUnique { get { return true; } }
public void Apply(int worldID, int entityID) public void Apply(int worldID, int entityID)
{ {
EcsWorld.GetPoolInstance<EcsPool<SomeComponent>>(worldID).TryAddOrGet(entityID) = component; EcsPool<SomeComponent>>.Apply(worldID, entityID) = component;
} }
public object GetRaw() { return component; } public object GetRaw() { return component; }
public void SetRaw(object raw) { component = (SomeComponent)raw; } public void SetRaw(object raw) { component = (SomeComponent)raw; }
@ -271,23 +287,28 @@ class SomeComponentTemplate : IComponentTemplate
### Применение шаблонов компонентов вне стандартных шаблонов сущностей ### Применение шаблонов компонентов вне стандартных шаблонов сущностей
Шаблоны компонентов можно использовать не только внутри стандартных `MonoEntityTemplate` и `ScriptableEntityTemplate`, но и в любых пользовательских классах. Для этого предусмотрены два способа: Шаблоны компонентов можно использовать не только внутри стандартных `MonoEntityTemplate` и `ScriptableEntityTemplate`, но и в любых пользовательских классах. Для этого предусмотрены два способа:
Атрибут `[ComponentTemplateReference]`: Атрибут `[ComponentTemplateField]`:
```c# ```c#
// Добавляет кнопку выбора доступной реализации IComponentTemplate // Отображение поля как компонента, настраиваемая мета атрибутами.
// и отображает шаблон компонента аналогично компонентам в MonoEntityTemplate или ScriptableEntityTemplate. // Аналогично компонентам в MonoEntityTemplate или ScriptableEntityTemplate.
[SerializeReference, ComponentTemplateReference] [SerializeField, ComponentTemplateField]
private IComponentTemplate _someComponent1; private SomeComponent _someComponent1;
```
```c#
// Для SerializeReference добавляет кнопку выбора доступной реализации ITemplateNode
[SerializeReference, ComponentTemplateField]
private ITemplateNode _someComponent1;
``` ```
Обертка `ComponentTemplateProperty`: Обертка `ComponentTemplateProperty`:
```c# ```c#
// Обертка над IComponentTemplate, аналогично примеру с атрибутом ComponentTemplateReference. // Обертка над ITemplateNode, аналогично примеру с атрибутом ComponentTemplateField.
private ComponentTemplateProperty _someComponent2; private ComponentTemplateProperty _someComponent2;
``` ```
Оба подхода работают и для массивов: Оба подхода работают и для массивов:
```c# ```c#
[SerializeReference, ComponentTemplateReference] [SerializeReference, ComponentTemplateField]
private IComponentTemplate[] _components; private IComponentTemplate[] _components;
// или // или
private ComponentTemplateProperty[] _components; private ComponentTemplateProperty[] _components;