ZBLOG

using System; using System.Collections.Generic; using UnityEngine; public class ModelMaterialSwitcher : MonoBehaviour { // 需要切换的材质列表 public List materialList = new List(); // 当前使用的材质索引 priva...

以下是修改后的代码:

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<> 来保存原始网格数据,并且同时保存了每个渲染器所使用的所有材质球。

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=4843

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?