Как изменить альфа-канал шейдера в Unity по коду

У меня есть GameObject с прозрачным материалом, и я хочу изменить его альфа-канал на 80 вместо 255. Но я хочу сделать это с помощью кода, а не с помощью ползунков редактора. Есть ли простой способ изменить альфа-канал шейдера, используя всего лишь строку кода? Что-то типа:

MyObject.GetComponent<Material>().shader.alpha = 80;

Я просмотрел Интернет, и я нашел только более сложные решения...


person Alessandro    schedule 05.09.2019    source источник
comment
Найдите sharedMaterial и Material Property Blocks, они помогут вам изменить атрибуты вашего материала, что отразится в шейдере.   -  person Daniel    schedule 05.09.2019
comment
@Daniel Я написал MyObject.GetComponent‹Renderer›().sharedMaterial.SetFloat(color.a, 0.4f); Но я думаю, что могу установить только цвет или свойство с плавающей запятой, а альфа не является ни тем, ни другим, верно? Как вы думаете, я могу это изменить?   -  person Alessandro    schedule 05.09.2019
comment
Альфа — это число с плавающей запятой от 0 до 1. Если у вас возникли проблемы с настройкой альфы, вы должны не забыть установить теги (Tags {"Queue"="Transparent" "RenderType"="Transparent" }) и установить правильный тип смешивания (Blend SrcAlpha OneMinusSrcAlpha), иначе ваша альфа не будет иметь значения.   -  person Daniel    schedule 06.09.2019


Ответы (1)


Я думаю, что это должно сделать трюк:

public class SetAlpha : MonoBehaviour
{
    public Material materialWithAlphaValue;

    public void ChangeAlphaValue(Color color)
    {
        materialWithAlphaValue.SetColor("_MY_COLOR_SHADER_VARIABLE_NAME", color);
    }
}

ОБНОВЛЕНИЕ:

public class SetAlpha : MonoBehaviour
{
    public Material materialWithAlphaValue;

    public void ChangeAlphaValue(float alpha)
    {
        var color = materialWithAlphaValue.GetColor("_MY_COLOR_SHADER_VARIABLE_NAME");
        materialWithAlphaValue.SetColor("_MY_COLOR_SHADER_VARIABLE_NAME", new Color(color.r, color.g, color.b, alpha));
    }
}

ОБНОВЛЕНИЕ 2:

Использование Material.Color аналогично использованию Material.GetColor("_Color"); — это наименование по умолчанию для базовых цветов в стандартных шейдерах Unity.

public void ChangeDefaultMatAlpha(float a)
{
    _MyMaterial.color = new Color(_MyMaterial.color.r, _MyMaterial.color.g _MyMaterial.color.b,
        a);
}
person Menyus    schedule 05.09.2019
comment
Благодарю вас! Но вы предлагаете назначить новый цвет, вместо того, чтобы изменить только альфу существующего, верно? - person Alessandro; 05.09.2019
comment
@Алессандро Да! Это то, что я сделал, но вы можете скопировать исходные значения r, g, b, а затем присвоить пользовательское значение, я думаю, что есть метод GetColor () :) - person Menyus; 05.09.2019
comment
спасибо, последнее работает! Но мне пришлось изменить параметр цвета с RGB 0-255 на RGB 0-1, иначе это имело странный эффект, как инфракрасное зрение... Странно! :D - person Alessandro; 05.09.2019