以下是修改后的代码:
using System.Collections.Generic;
using UnityEngine;
public class ModelMaterialSwitcher : MonoBehaviour
{
// 需要切换的材质列表
public List<Material> materialList = new List<Material>();
// 当前使用的材质索引
private int currentMaterialIndex = -1;
// 原始网格信息
private List<MeshFilter> meshFilters = new List<MeshFilter>();
private List<MeshRenderer> meshRenderers = new List<MeshRenderer>();
private List<Material[]> originalMaterials = new List<Material[]>();
private List<Vector3[]> originalVertices = new List<Vector3[]>();
private List<Vector3[]> originalNormals = new List<Vector3[]>();
private List<Vector2[]> originalUVs = new List<Vector2[]>();
private List<int[][]> originalIndices = new List<int[][]>();
private bool isOriginal = true;
// 切换材质
public void SwitchMaterial()
{
// 切换材质
currentMaterialIndex = (currentMaterialIndex + 1) % materialList.Count;
SwitchMaterials(currentMaterialIndex);
isOriginal = false;
}
// 切换材质
private void SwitchMaterials(int index)
{
for (int i = 0; i < meshRenderers.Count; i++)
{
Material[] materials = new Material[] { materialList[index] };
meshRenderers[i].materials = materials;
}
}
// 恢复原始材质
public void RestoreOriginal()
{
if (isOriginal)
{
return;
}
for (int i = 0; i < meshFilters.Count; i++)
{
Mesh mesh = meshFilters[i].mesh;
mesh.Clear();
mesh.SetVertices(new List<Vector3>(originalVertices[i]));
mesh.SetNormals(new List<Vector3>(originalNormals[i]));
mesh.SetUVs(0, new List<Vector2>(originalUVs[i]));
mesh.SetTriangles(originalIndices[i][0], 0);
meshRenderers[i].materials = originalMaterials[i];
}
currentMaterialIndex = -1;
isOriginal = true;
}
// 获取并保存原始网格信息
private void SaveOriginal()
{
MeshFilter[] meshFiltersArray = GetComponentsInChildren<MeshFilter>();
foreach (MeshFilter meshFilter in meshFiltersArray)
{
MeshRenderer renderer = meshFilter.GetComponent<MeshRenderer>();
Material[] materials = renderer.materials;
// 保存原始材质
originalMaterials.Add(materials);
// 保存原始网格信息
Mesh originalMesh = Instantiate(meshFilter.mesh);
originalVertices.Add(originalMesh.vertices);
originalNormals.Add(originalMesh.normals);
originalUVs.Add(originalMesh.uv);
int[][] indices = new int[1][]
{
originalMesh.GetTriangles(0)
};
originalIndices.Add(indices);
meshFilters.Add(meshFilter);
meshRenderers.Add(renderer);
}
}
private void Start()
{
// 获取并保存原始网格信息
SaveOriginal();
}
}
主要修改如下:
- 将 materialList 的类型从 List
改为 List 。 - 将 originalMaterials 的类型从 List
改为 List ,因为一个网格渲染器可能会使用多个材质球。 - 将保存的原始网格数据类型改为数组,分别保存顶点、法线、UV和三角形索引。
- 在 SwitchMaterials 函数中修改了材质的赋值方式。
- 在 RestoreOriginal 函数中使用了新的方法来设置网格数据和材质。
- 修改了 SaveOriginal 函数,使用 List<> 来保存原始网格数据,并且同时保存了每个渲染器所使用的所有材质球。