Учесть, что префаб мы можем закинуть просто через редактор 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), чтобы получать вызовы собственных методов, когда поля двух компонентов изменяются.