Aplicando transparência e cor nos objetos dinamicamente

@lucas, não estou conseguindo aplicar dinamicamente a transparência nos meus objetos em cena. Pode me auxiliar?

using System.Collections.Generic;
using UnityEngine;

public class Esferas : MonoBehaviour
{
    [SerializeField] private List<GameObject> esferas;
    private MaterialPropertyBlock propBlock;

    private void Start()
    {
        propBlock = new MaterialPropertyBlock();

        foreach (GameObject esfera in esferas)
        {
            MeshRenderer renderer = esfera.GetComponent<MeshRenderer>();

            // Gera cor aleatória com transparência
            Color cor = Random.ColorHSV();
            cor.a = Random.Range(0.1f, 0.9f);

            // Configura as propriedades
            renderer.GetPropertyBlock(propBlock);
            propBlock.SetColor("_BaseColor", cor);
            propBlock.SetFloat("_Surface", 1);
            propBlock.SetFloat("_Blend", 0);
            renderer.SetPropertyBlock(propBlock);
        }
    }
}

@lucas Acho que consegui chegar no resultado esperado. Eu acabei adicionando 2 materiais e apliquei as mudanças no script. Veja o resultado:

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Rendering;

public class Esferas : MonoBehaviour
{
    [Range(0f, 1f)] public float transparency = 0.3f; // Alpha do vidro
    [Range(0f, 1f)] public float smoothness = 0.95f;  // Reflexão nítida
    [Range(0f, 1f)] public float ior = 1.5f;          // Índice de refração (vidro = ~1.5)

    [SerializeField] private List<GameObject> esferas;
    [SerializeField] private Material materialBaseMetal;
    [SerializeField] private Material materialBaseVidro;

    private void Start()
    {
        foreach (GameObject esfera in esferas)
        {
            MeshRenderer renderer = esfera.GetComponent<MeshRenderer>();

            // Cria nova instância do material
            Material novoMaterialMetal = new Material(materialBaseMetal);
            Material novoMaterialVidro = new Material(materialBaseVidro);

            // Decide aleatoriamente se será metálica ou transparente tipo vidro
            bool ehVidro = Random.value > 0.5f;

            if (ehVidro)
            {
                // Configura como vidro
                novoMaterialVidro.SetColor("_BaseColor", new Color(Random.value, Random.value, Random.value, transparency));
                novoMaterialVidro.SetFloat("_Surface", 1); // Transparent
                novoMaterialVidro.SetFloat("_Blend", 0);   // Alpha
                novoMaterialVidro.SetFloat("_AlphaClip", 0);
                novoMaterialVidro.SetFloat("_Smoothness", smoothness);
                novoMaterialVidro.SetFloat("_Metallic", 0.0f);
                novoMaterialVidro.SetFloat("_ZWrite", 0);
                novoMaterialVidro.SetFloat("_Refraction", ior - 1f);
                novoMaterialVidro.renderQueue = (int)RenderQueue.Transparent;

                // Aplica o novo material
                renderer.material = novoMaterialVidro;
            }
            else
            {
                // Configura como metálica
                novoMaterialMetal.SetColor("_BaseColor", Random.ColorHSV(0f, 1f, 0.5f, 1f, 0.5f, 1f, 1f, 1f));
                novoMaterialMetal.SetFloat("_Surface", 0); // Opaque
                novoMaterialMetal.SetFloat("_Smoothness", 0.8f);
                novoMaterialMetal.SetFloat("_Metallic", 1.0f);
                novoMaterialMetal.renderQueue = (int)RenderQueue.Geometry;

                // Aplica o novo material
                renderer.material = novoMaterialMetal;
            }
        }
    }
}

Bom dia Helder,

Estava resolvendo algumas outras tarefas e não consegui te responder antes. Que bom que já conseguiu encontrar a solução.

Se precisar de qualquer outra coisa, estou a diposição!

1 curtida

Sem problema. Obrigado.