@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;
}
}
}
}
lucas
3
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