using System.Collections; using System.Collections.Generic; using UnityEditor; using UnityEngine; public class MaterialUtil { //拷贝材质上的属性到另一个材质 public static void CopyMaterialProp(Material mat1, Material mat2) { mat2.mainTexture = mat1.mainTexture; mat2.color = mat1.color; } //拷贝材质上的属性到新的指定shader材质 public static Material CopyMaterialWithShader(Material mat1, Shader shader = null) { shader = shader ? shader : mat1.shader; var mat2 = new Material(shader) { name = mat1.name }; CopyMaterialProp(mat1, mat2); return mat2; } //以指定shader替换gameobject上的所有材质,此函数会新建材质 public static List ReplaceMaterialOnGameObject(GameObject go, Shader shader = null) { if (!EditorUtility.IsPersistent(go)) { Debug.LogError($"当前gameobject不是asset中的预制体!"); return null; } List result = new(); var meshRenderers = go.GetComponentsInChildren(); foreach (var meshRenderer in meshRenderers) { var mats = meshRenderer.sharedMaterials; for (int i = 0; i < mats.Length; i++) { mats[i] = CopyMaterialWithShader(mats[i], shader); result.Add(mats[i]); } meshRenderer.sharedMaterials = mats; } return result; } public static List CreateMaterialWithShaderOnGameObject(GameObject go, Shader shader) { if (!EditorUtility.IsPersistent(go)) { Debug.LogError($"当前gameobject不是asset中的预制体!"); return null; } List result = new(); var meshRenderers = go.GetComponentsInChildren(); foreach (var meshRenderer in meshRenderers) { var mats = meshRenderer.sharedMaterials; for (int i = 0; i < mats.Length; i++) { var newMat = CopyMaterialWithShader(mats[i], shader); result.Add(newMat); } } return result; } }