Прямо сейчас ваша игра, вероятно, в Update
запускается последовательно. Вероятно, вы хотите заменить деталь в середине этого Update
По умолчанию все System
запускаются ПОСЛЕ старого доброго обновления. Но, к счастью, у нас есть [UpdateBefore]
[UpdateAfter]
, который можно использовать с классами в using UnityEngine.Experimental.PlayerLoop
, а не только с системами или группой обновлений ECS. ([UpdateInGroup]
)
Стратегия состоит в том, чтобы переместить всю вашу старую логику в LateUpdate
, а затем переместить только логику «ECS Starter» в Update
. Кстати, убедитесь, что ваша игра работает точно так же на этом этапе! Затем мы сделаем Update - ECS - LateUpdate. Вы будете постепенно уменьшать размер LateUpdate
в ECS, пока все не исчезнет, но в настоящее время маловероятно, поскольку большая часть Unity по-прежнему полагается на старую систему.
Эта логика должна предоставить системе ECS некоторые данные, будет создавать некоторые объекты и удерживать их, передавая различные данные в целом из EntityManager
, который является мостом в мир ECS.
В моем случае у меня есть «одноэлементная» сущность, которая содержит некоторые данные компонентов, подобные этой. Я всегда мог получить и установить эти данные как в мире ECS, так и за его пределами с помощью статических методов Get
и Set
, как вы можете видеть. Также мне нужно позвонить Initialize
где-нибудь, прежде чем какая-либо система сможет работать.
Процесс перехода обычно заключается в том, что код, оставшийся в LateUpdate
, будет что-то вычислять. Теперь мы хотим, чтобы это сделала ECS, поэтому мы прокомментируем это и добавим логику в ECS. Когда ECS завершит вычисления, чтобы получить этот ответ, он будет через EntityManager
У вас может быть метод для копирования данных из вашего старого поля в объект, но я изменил поле, которое когда-то было обычной переменной, на свойство get-set, связанное с ECS. Таким образом, текущий пользователь продолжает работать, не зная, что значение записывается и считывается из системы ECS. Теперь нам даже не нужно сообщать ECS значение, потому что все используют одно и то же хранилище этой переменной.
set
немного многословен, но это struct
для вас. Напоминание о том, как вы устанавливали только переменную x в Vector3
.
Затем вы замените элемент в начале LateUpdate
один за другим, закомментировав его, потому что он переместился в ECS, и посмотрите результат.