Единственный способ сделать это - использовать словарь, афаик.Причина этого в том, что если вы сохраните Материалы в виде списка, количество GameObjects в сцене может измениться к тому времени, когда вы прекратите зависание, и список, который вы сохранили, больше не будет совпадать с фактическими материалами GameObjects.Поэтому вам нужно знать, какие материалы принадлежат какому Renderer / GameObject.Словарь дает вам это.
Так что я бы использовал Dictionary<Renderer, List<Material>>
.Когда вы начинаете зависать, вы перебираете все объекты GameObject с рендерами, которые хотите изменить, и сохраняете их в словаре.Тогда вы меняете материалы.Когда зависание останавливается, вы перебираете словарь и возвращаете материалы обратно.
Обратите внимание, что если все, что вы хотите изменить, это цвет, тогда лучше использовать MaterialPropertyBlock .Вы можете использовать MaterialPropertyBlock.SetColor , вам просто нужно знать, какое свойство цвета названо в шейдере.Обычно это _Color
, вы можете проверить, посмотрев материал в Инспекторе в режиме отладки.Преимущество использования MaterialPropertyBlock заключается в том, что вы не будете генерировать дополнительный вызов отрисовки.Это просто лучший способ сделать это.