75 lines
2.2 KiB
C#
75 lines
2.2 KiB
C#
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<Material> ReplaceMaterialOnGameObject(GameObject go, Shader shader = null)
|
|
{
|
|
if (!EditorUtility.IsPersistent(go))
|
|
{
|
|
Debug.LogError($"当前gameobject不是asset中的预制体!");
|
|
return null;
|
|
}
|
|
|
|
List<Material> result = new();
|
|
var meshRenderers = go.GetComponentsInChildren<MeshRenderer>();
|
|
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<Material> CreateMaterialWithShaderOnGameObject(GameObject go, Shader shader)
|
|
{
|
|
if (!EditorUtility.IsPersistent(go))
|
|
{
|
|
Debug.LogError($"当前gameobject不是asset中的预制体!");
|
|
return null;
|
|
}
|
|
|
|
List<Material> result = new();
|
|
var meshRenderers = go.GetComponentsInChildren<MeshRenderer>();
|
|
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;
|
|
}
|
|
} |