Я сделал эффект затухания на слое параллакса, и я сделал это:
if (currentBackgroundPhase == BackgroundPhase.Night)
{
foreach(SpriteRenderer sprite in GetComponentsInChildren<SpriteRenderer>())
{
if (sprite.name.Contains("Cloud"))
{
sprite.color = new Color(opaqueCloud.r, opaqueCloud.g, opaqueCloud.b, transitionTimeElapsed / TRANSITION_TIME);
}
}
}
Параллакс продолжает перемещать облачные спрайты, и это единственный способ, которым я могу это сделать. Я просмотрел профилировщик и не заметил снижения производительности при вызове if. Это слишком дорого/неэффективно из-за GetComponensInChildren? Если да, то есть ли другой способ сделать это?
Я посмотрел на графику скриптов профилировщика, чтобы увидеть, не слишком ли это много, но не заметил ничего странного.
Я не могу протестировать на плохом устройстве, потому что у меня его нет, и я хочу, чтобы это работало на каждом устройстве Android...
Максимальное количество спрайтердереров, которые могут быть у детей, составляет 20 или около того.





Вы можете попробовать объединить игровые объекты. Просто активировать деактивировать их.
Если одно облако прозрачно на 100 %, вы можете деактивировать его и повторно использовать в другом месте. Если вы перемещаете облака, это должно быть возможно.
Ну, если одно облако на 100% прозрачно, вы можете деактивировать его и повторно использовать где-то еще, или я неправильно понял. Если вы перемещаете облака, это должно быть возможно.
Проблема в том, что они прозрачны только на 1 кадр, большую часть времени они как привидение, но все равно спасибо.
Что ж, попробуйте объединиться, если вы генерируете и уничтожаете. Повторно используйте свои облака, а не уничтожайте их
Поскольку сценарий параллакса был внешним активом, я не знал, что элементы использовались повторно, но теперь я внимательно посмотрел, и он повторно использует его, изменяя положение изображений. Вопрос обновлен.
Вы вызываете свою функцию внутри обновления? Попробуйте назначить его один раз в начале, чтобы вы вызывали компонент get всего несколько раз, а не в каждом кадре. Создайте массив с компонентами и заполните его при запуске. После этого просто повторите свой массив.
Хорошо, есть несколько советов, которые могут быть вам полезны
Если для каждого цикла, используемого для сбора или массива объектов (т. е. массива всех элементов, отличных от примитивного типа данных), вызывается GC (сборщик мусора), чтобы освободить место для ссылочной переменной в конце цикла для каждого цикла.
foreach (Gameobject obj in Collection)
{
//Code Do Task
}
В то время как цикл for используется для перебора элементов с использованием индекса, поэтому примитивный тип данных не повлияет на производительность по сравнению с непримитивным типом данных.
for (int i = 0; i < Collection.length; i++){
//Get reference using index i;
//Code Do Task
}
Спасибо за совет foreach, я проведу рефакторинг циклов foreach.
Они отображаются на экране все время (это фон), так что это не вариант.