using System.Collections.Generic;
using UnityEngine;
public class MaterialsManager : MonoBehaviour
{
/// <summary>
/// 透明材质
/// </summary>
public Material MaterialTransparent;
/// <summary>
/// 模型中所有的Renderer
/// </summary>
private Renderer[] _renderers;
/// <summary>
/// 保存各个renderer对应的材质到字典中
/// </summary>
private Dictionary<Renderer, Material[]> rendererMaterialsDic = new();
private void Awake()
{
_renderers = GetComponentsInChildren<Renderer>();
RecordRenderersToDic();
}
/// <summary>
/// 将各个renderer对应的原始材质写入字典中
/// </summary>
void RecordRenderersToDic()
{
for (int i = 0; i < _renderers.Length; i++)
{
Material[] materialArray = _renderers[i].materials;
rendererMaterialsDic.Add(_renderers[i], materialArray);
}
}
/// <summary>
/// 模型透明(部分为原始材质)
/// </summary>
/// <param name="orignalModelTr">不透明的部分</param>
public void ModelToTransparent(Transform orignalModelTr)
{
Renderer[] renderers = orignalModelTr.GetComponentsInChildren<Renderer>();
List<Renderer> rendererList = new List<Renderer>();
for (int i = 0; i < _renderers.Length; i++)
{
for (int j = 0; j < renderers.Length; j++)
{
if (_renderers[i] == renderers[j])
{
rendererList.Add(_renderers[i]);
}
}
Material[] materials = new Material[_renderers[i].materials.Length];
for (int k = 0; k < materials.Length; k++)
{
materials[k] = MaterialTransparent;
}
_renderers[i].materials = materials;
}
for (int i = 0; i < rendererList.Count; i++)
{
rendererList[i].materials = rendererMaterialsDic[rendererList[i]];
}
}
/// <summary>
/// 模型全透明
/// </summary>
public void ModelToTransparent()
{
for (int i = 0; i < _renderers.Length; i++)
{
Material[] materials = new Material[_renderers[i].materials.Length];
for (int j = 0; j < materials.Length; j++)
{
materials[j] = MaterialTransparent;
}
_renderers[i].materials = materials;
}
}
/// <summary>
/// 模型恢复原始材质
/// </summary>
public void ModelResetOrignalMaterial()
{
foreach (Renderer t in _renderers)
{
Material[] materials = rendererMaterialsDic[t];
t.materials = materials;
}
}
}
11-02
1676

06-19
1984

05-10
1258

09-12
2121
