Учесть, что префаб мы можем закинуть просто через редактор Unity. Чтобы в таком случае инициализация сущности была через Mono-компонент.
Добавить возможность добавлять gameobject не просто на сцену, но и внутрь другого гм. Простоя передовая id сущности родителя.
Когда приказ даешь на атаку.
<br>
### Использование View API внутри Core
Все делается через интерфейс (условно IViewAPI). Все необходимые для Core методы прописываются в интерфейс, а View реализует этот интерфейс.
```csharp
void CreateGameObject(Entity entity, ResName prefabName);
```
Пример метода
### Синхронизация полей для View из Core
Что понимается под полями:
string, int и прочие поля, которые есть у ECS-компонентов.
Что понимается под синхронизацией:
что эти поля нужны View части и нужны настолько, что аж кадр в кадр.
<br>
Для синхронизации используются Unity-компоненты, мы будем их называть Mono-компоненты.
<br>
Через View API добавляется заранее заготовленный Mono-компонент.
Mono-компонент инициализирует связанный с ним ECS-компонент и «подписывается» на него, чтобы моментально узнавать о его изменениях и копировать значения во View-поля.
<br>
Недопустимо использование Mono-компонент с целью запуска логики (передачи команды). Например, смена Меша 3Д-модели на поврежденную - недопустимо. Mono-компонент должен использоваться только для синхронизации данных, но не действий(логики).
Архитектурно так заложено, что Mono-компонент не может редактировать значения полей из Core, только читать их.
### Передача команд из Core во VIew
Все команды будут передаваться неявно, через event-компоненты. То есть View будет работать с Core через данные (проверять наличие компонента или изменение полей в неких компонентах)
Напрямую вызывать некий метод или использовать паттерн «команды - мы не будем»
Пример команды:
- а ну, включи смену Меша у такой-то 3Д-модели.
- Обнови инвентарь у нефтяной вышки, там появился новый предмет.
Чем команда отличается от View API
- Команда - это совокупность действий на стороне VIew, чтобы получить нужный нам результат.
- View API - это попытка один в один реализовать передать функционал Unity в Core. Например, есть у Unity метод, который создает GameObject, вот мы этот метод и реализуем в View API. Но мы не реализуем метод с совокупностью действий:
- создать gameobject,
- покрасить его в синий цвет,
- включить анимацию idle,
- включить VFX,
- дымок из глушителя.
### Передача команд из View в Core
View создает компонент с типом OrderComponent и тем самым формирует команду для Core.
Например:
- Игрок приказал хамви поехать к цели.
- Игрок приказал хамви атаковать цель.
- Игрок перенес стак из нефтяной вышки в свой инвентарь.
А если мы даем команду на подбор вещей ( и это происходит мгновенно друг за другом?) OrderComponent начнет выдавать ошибки из-за быстроты.
##### Получение обратной связи
Пока что сейчас можно оставить так, что Core будет генерировать EventComponent на запрос от View
Однако, если понадобится полноценный аналог http для взаимодействия между View и Core, то я не знаю.
<br>
### Перерасчет локального и глобального Transform
Пока данные хранились на Unity, а ECS-компоненты пользовались этими данными через свойства и делегаты, я не задумывался о том, что Unity у себя под капотом делает такие перерасчеты.
Сейчас же все данные хранятся у Core, а View только читает их. Поэтому мне нужно реализовать данную механику на стороне Core.
Первая проблема:
- Transform и LocalTransform являются разными компонентами.
Неужели мне в системах каждый раз пересчитывать между ними значения.
<br>
А если в будущем будет похожая ситуация, когда нужно пересчитывать поля компонента, если они уже где-то поменялись?
Еще проблема, что когда родитель перемещается, то нужно пересчитывать transform всех детей.
Теперь я понял, почему родители и дети устанавливаются в Unity через класс Transform.
<br>
### Черновик
Core обращается через интерфейс (IViewFactory) к View. View создает gameobject с базовым Mono-компонентом, который инициализирует два ECS-компонента.
Базовый Mono-компонент, когда его добавили в gameobject, передает в каждый из компонентов ссылку на себя (компонент соответствует интерфейсу ITransformListener), чтобы получать вызовы собственных методов, когда поля двух компонентов изменяются.