Страница 1 из 1

Получение изменившихся объектов и компонентов

СообщениеДобавлено: 14 мар 2017, 03:05
Albeoris
Доброго времени суток.

Есть корутина, которая периодически получает список всех объектов, сериализует, и отправляет удалённому клиенту:
GameObject[] objects = GameObject.FindObjectsOfType<GameObject>();

Возможно ли получить только те объекты и компоненты, которые были изменены с момента последнего запроса?
Сейчас мне приходится держать два состояния объекта - предыдущее и текущее, сравнивать их, и лишь затем сериализовать нужные.

Почему спрашиваю - попался на глаза такой метод.
И подумалось - если есть версионность для ресурсов, может и для объектов найдётся?

Re: Получение изменившихся объектов и компонентов

СообщениеДобавлено: 14 мар 2017, 11:06
Zamarrus
А не проще ли наказать объектам автоматически отправлять изменения в твой скрипт, можешь сделать Статик Лист и он будет доступен где угодно и когда угодно, но он должен быть один. Скажем, произошло условие и вместе с условием объект отправляет себя в измененные. Лично я так понял :)

Re: Получение изменившихся объектов и компонентов

СообщениеДобавлено: 14 мар 2017, 23:58
Albeoris
Ну, смотри. Есть некий объект, шатающийся по сцене. Двигают его все кому не лень, изменяя значение transform.
Если значение изменилось, я должен его отправить клиенту при следующем запросе данных.
Делается это для того чтобы клиент мог видеть список всех существующих в данный момент объектов и манипулировать их параметрами.
Вроде бы, тоже самое делает Unity, при запуске игры из редактора - ты можешь видеть создаваемые объекты на сцене. Вот и мне нужен аналогичный функционал.

Твоё решение, безусловно, решит проблему, но увы - поправить код в 10 000 мест - не лучшее решение.
Можно написать и обёртки для всех объектов, проксируя вызовы, и даже в рантайме подменить реализацию каждого метода и свойства или отредактировать UnityEngine.dll.
Но во-первых это невозможно будет поддерживать, а во-вторых негативно скажется на производительности - каждый такт игры будут вызываться тысячи нотификаций об изменении того или иного свойства, в то время, как эта информация нужна только, когда подключён клиент (считай - игра в режиме отладки) и не чаще, чем раз в 5 секунд.

Просто выгрести все объекты сейчас будет быстрее, чем обрабатывать изменение каждого самостоятельно. Поэтому интересует именно поддержка на уровне движка.

Re: Получение изменившихся объектов и компонентов

СообщениеДобавлено: 30 мар 2017, 12:59
Zamarrus
Воспользуйся тогда корутиной IEnumenator. Будет вызываться при надобности и останавливаться также. Каждый объект будет отправлять данные по очереди, раз в один цикл, а не постоянно как Update() или FixedUpdate(). Скажем, есть список подключенных людей или список двигаемых объектов(если их несколько), или то и другое. Берешь корутину и вызываешь корутину на 0-ом объекте пока не пройдет вся функция, в конце которой избавляешь объект от 0-го места, на его место встанет другой объект и т.д. Сразу скажу, я все еще смутно понимаю суть вопроса, по тому накидал самое примитивное решение.

Re: Получение изменившихся объектов и компонентов

СообщениеДобавлено: 13 май 2017, 01:12
Albeoris
Zamarrus писал(а):Воспользуйся тогда корутиной IEnumenator. Будет вызываться при надобности и останавливаться также. Каждый объект будет отправлять данные по очереди, раз в один цикл, а не постоянно как Update() или FixedUpdate(). Скажем, есть список подключенных людей или список двигаемых объектов(если их несколько), или то и другое. Берешь корутину и вызываешь корутину на 0-ом объекте пока не пройдет вся функция, в конце которой избавляешь объект от 0-го места, на его место встанет другой объект и т.д. Сразу скажу, я все еще смутно понимаю суть вопроса, по тому накидал самое примитивное решение.

Да, благодарю, так и делаю.
Но неужели и UnityEditor работает по такому же принципу? Постоянно крутит фоновый процесс, который выгребает все созданные объекты и их компоненты без какой либо версионности (получить объекты после N'го, получить удалённые объекты до N'го, получить компоненты, изменившие своё состояние)?