Прежде всего
rend.materials[0].shader = Shader.Find("_Color");
rend.materials[0].SetColor ("_Color", colorToSet);
rend.materials[0].shader = Shader.Find("Specular");
rend.materials[0].SetColor ("_SpecColor", colorToSet);
было бы совершенно бесполезным, поскольку вы перезаписали materials[0].shader
в строке 3, а затем изменили только SpecColor
этого нового шейдера. Это делает строки 1 + 2 избыточными / безрезультатными.
Чем ваш вопрос: Да, сборка ведет себя немного иначе, чем редактор. В сборке проект удаляется из большинства активов / скриптов и т. Д., Если на них никогда не ссылаются (=> очевидно, никогда не используется).
С Shader.Find
Обратите внимание, что шейдер может не быть включен в билд плеера, если на него ничего не ссылается! В этом случае Shader.Find будет работать только в редакторе, и в сборке плеера появятся розовые «недостающие шейдерные» материалы. В связи с этим рекомендуется использовать ссылки на шейдеры, а не искать их по имени. Чтобы убедиться, что шейдер включен в сборку игры, выполните одно из следующих действий:
1) ссылаться на него из некоторых материалов, использованных в вашей сцене,
2) добавьте его в список «Всегда включенные шейдеры» в ProjectSettings / Graphics или
3) положить шейдер или что-то, что ссылается на него (например, материал), в папку «Ресурсы».
Но на самом деле мне кажется, что вы действительно не хотите изменять Shader
материала во время выполнения, а скорее цвет (а).
Так что вместо
rend.materials[0].shader = Shader.Find("_Color");
rend.materials[0].SetColor ("_Color", colorListToUse[0]);
Вы должны просто использовать
rend.materials[0].color = colorToSet;
для изменения цвета материала. см. также Material.color
Если вам назначен только один материал, вы также можете просто использовать
rend.material.color = colorToSet;
Если вам по-прежнему необходимо установить SpecColor
, вы должны уже в редакторе установить соответствующие материалы на Specular, а затем вы все еще можете использовать
rend.materials[0].SetColor ("_SpecColor", colorToSet);