##### Директора
Мы создаем директора, когда нам нужно сконфигурировать один 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-ребенок остается в той же локальной позиции, что и до смены родителя, но меняется каждый раз его позиция в мире.