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

Программирование на Юнити.

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

Сообщение Albeoris 14 мар 2017, 03:05

Доброго времени суток.

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

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

Почему спрашиваю - попался на глаза такой метод.
И подумалось - если есть версионность для ресурсов, может и для объектов найдётся?
Albeoris
UNIт
 
Сообщения: 146
Зарегистрирован: 19 окт 2013, 13:12

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

Сообщение Zamarrus 14 мар 2017, 11:06

А не проще ли наказать объектам автоматически отправлять изменения в твой скрипт, можешь сделать Статик Лист и он будет доступен где угодно и когда угодно, но он должен быть один. Скажем, произошло условие и вместе с условием объект отправляет себя в измененные. Лично я так понял :)
Zamarrus
UNец
 
Сообщения: 28
Зарегистрирован: 01 фев 2017, 16:07

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

Сообщение Albeoris 14 мар 2017, 23:58

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

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

Просто выгрести все объекты сейчас будет быстрее, чем обрабатывать изменение каждого самостоятельно. Поэтому интересует именно поддержка на уровне движка.
Albeoris
UNIт
 
Сообщения: 146
Зарегистрирован: 19 окт 2013, 13:12

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

Сообщение Zamarrus 30 мар 2017, 12:59

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

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

Сообщение Albeoris 13 май 2017, 01:12

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

Да, благодарю, так и делаю.
Но неужели и UnityEditor работает по такому же принципу? Постоянно крутит фоновый процесс, который выгребает все созданные объекты и их компоненты без какой либо версионности (получить объекты после N'го, получить удалённые объекты до N'го, получить компоненты, изменившие своё состояние)?
Albeoris
UNIт
 
Сообщения: 146
Зарегистрирован: 19 окт 2013, 13:12


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5