##### Директора Мы создаем директора, когда нам нужно сконфигурировать один Entity. Мы не создаем директора для таких задач как: - Создать компонент для entity - Создать конфигуратор для создания двух Entity для связки их вместе (Для этого нужно создать на каждый entity своего директора) <br> ##### SkinnedMeshRenderer Когда ты закидываешь fbx на сцену, то Unity создает префаб из него и добавляет туда компоненты. Когда у fbx есть кости, то добавляет компонент SkinnedMeshRenderer, а когда костей нет, то MeshRenderer. Чтобы было единообразие при взаимодействии с 3D-моделями, нужно добавлять SkinnedMeshRenderer и удалять MeshRenderer (с ним работает еще компонент mesh filter, его тоже удалить) <br> ### ShareTransform <br> ##### Смена родителя в Unity переделана под нас При смене родителя у entity-ребенка в ShareTransform, локальная позиция не меняется, а мировая позиция обновляется под локальную. У Unity все наоборот, поэтому мы дописали реализацию IViewAPI.SetParent(), чтобы при смене gm-родителя у gm-ребенка, алгоритм был такой же как у ShareTransfrom. А именно, в момент смены gm-родителя, локальная позиция у gm-ребенка перезаписывается (берется localPosition из ShareTransform). *Выше написанное, применимо и к ориентации.* Более подробное описание проблемы. В Unity, когда gm-ребенок меняет своего gm-отца, то приоритет отдается глобальной позиции ребенка. Это значит, что когда мы меняем ребенку отца, то он всегда остается на своем месте относительно мира, а его локальная позиция динамична. Из-за этого, у меня возникла проблема.Дело в том, что я хочу оставить возможность закидывать префабы сразу на сцену, да так, чтобы они еще и подхватывались моим движком. Когда мы закидываем префаб на сцену, то конфигуратором уже не создается новый gameobject, который имел бы позицию (0, 0, 0), а используется тот, что был закинут на сцену вручную. А раз мы его закинули, то закинули куда-то, в какую-то позицию. Получается, конфигуратор конфигурирует Entity с gameobject, который уже имеет позицию и ориентацию (речь про gameobject). Выходит такая ситуация: 1. Конфигуратор конфигурирует хамви. 2. Для хамви нужна турель 3. Кф создает сущность турели (Entity + gm) 4. Кф задает для турели локальную позицию, чтобы турель была размещена на крыше хамви. (Для этого в MyEngine задействуется ShareTransform) 5. ShareTransform обновляет Глобальную позицию относительно локальной. А так как хамви-Entity имеет нулевые координаты, то Глобал = Локал. 6. Меняет для турели родителя (Устанавливает ему хамви). 1. Установка родителя происходит и для Entity и для gm. 2. Unity, при присваивании для gm-турели родителя, оставляет турель в том же самом месте относительно мира и меняет локальную позицию относительно gm-хаммера. Из-за этого, турель находится в центре мира (0, 1.8, -0.2), а относительно Хаммера турель оторвало на очень далекое расстояние, так как позиция gm-Хаммера (50, 0, 50). А такая позиция у Хаммера, потому что он был заброшен на сцену и у него уже есть позиция. 3. ShareTransform, в свою очередь, об этой позиции ничего не знает, потому что данные gm недоступны для Core из-за политики, что View читает Core, но не изменяет данные Core. Поэтому я изменил реализацию SetParent в IViewAPI и теперь, когда добавляется родитель для gm-ребенка, то к gm-ребенку присваивается localPosition из ShareTransform. Тем самым gm-ребенок остается в той же локальной позиции, что и до смены родителя, но меняется каждый раз его позиция в мире.