Хочу сделать сохранение и загрузку объектов в реальном времени во время игры. В большом открытом мире объекты спаунятся только в некотором радиусе вокруг игрока. Оказываясь за пределами радиуса, объекты сохраняются и уничтожаются. Возможно, в какие-то моменты перемещения игрока на автомобиле, нужно будет одновременно сохранять и загружать сотни объектов за кадр. Поэтому производительность на первом месте. Обрабатываться таким образом будет все- деревья, трава, персонажи, заборы и т.д.
У каждого объекта, помимо позиции и вращения, есть переменные из скриптов, которые необходимо сохранять. Например, у автомобиля- количество топлива, у персонажа- здоровье, голод и т.д.
Проблема в том, что когда я спауню объект, необходимо выполнить GetComponent, который ищет на объекте главный скрипт и задает нужные значения переменным. При сохранении, опять же, выполняется GetComponent, чтобы извлечь необходимые данные и сериализовать их. Конечно, можно искать компонент только один раз, при спауне объекта, а потом хранить кэшированную ссылку где-то, но это не отменяет того факта, что GetComponent жрет ресурсы и я бы хотел вообще отказаться от его использования.
Я думал, что нашел обходной путь. Вызывал функцию на объекте, используя gameObject.SendMessage("Функция на объекте"). Эта вызванная функция отправляет все данные этого объекта в public static class, из которого, в свою очередь, данные уже подхватываются скриптом сохранения/загрузки. Этот путь оказался не только грязным, но и на много более тормознутым, чем GetComponent. Этот способ в тесте на 1 000 000 операций сожрал почти секунду, в то время как GetComponent выполнялся за 200 мс.
В общем, я не знаю, как обойти использование GetComponent и оптимизировать сохранение/загрузку объектов. Что можно придумать?