材质球寻找同级目录下对应贴图
格式为材质球名称后_A _M _N的图片文件。
using System.IO;
using UnityEditor;
using UnityEngine;
namespace RandyVR.Editor
{
public class MatHelperEditor
{
// 贴图类型
static string[] TEXTURE_TYPE = { "_MetallicGlossMap", "_BumpMap", "_ParallaxMap", "_OcclusionMap", "_DetailMask", "_DetailAlbedoMap", "_DetailNormalMap"};
// Material需要设置的关键字
static string[] TEXTURE_KEYWORD = { "_METALLICGLOSSMAP", "_NORMALMAP", "_PARALLAXMAP", "", "_DETAIL_MULX2", "_DETAIL_MULX2", "_DETAIL_MULX2" };
[MenuItem("Assets/Mat贴图寻找",false,1)]
private static void Creat()
{
string[] asset = Selection.assetGUIDs;
object[] mats = Selection.objects;
for (int i = 0; i < asset.Length; i++)
{
var path = AssetDatabase.GUIDToAssetPath(asset[i]);
Material mat = AssetDatabase.LoadAssetAtPath<Material>(path);
if (mat!=null)
{
FindTexture(mat, path);
}
}
}
private static void FindTexture(Material mat,string path)
{
Texture A=Find_A_Texture(path);
if (A!=null)
{
mat.mainTexture = A;
}
Texture M=Find_M_Texture(path);
if (M!=null)
{
mat.EnableKeyword(TEXTURE_KEYWORD[0]);
mat.SetTexture(TEXTURE_TYPE[0],M);
}
Texture N=Find_N_Texture(path);
if (N!=null)
{
mat.EnableKeyword(TEXTURE_KEYWORD[1]);
mat.SetTexture(TEXTURE_TYPE[1],N);
}
}
private static Texture Find_A_Texture(string path)
{
file = "";
FindFile( Directory.GetParent(path).Parent.FullName, Path.GetFileNameWithoutExtension(path) + "_A");
if (file=="")
{
return null;
}
return AssetDatabase.LoadAssetAtPath<Texture>(file.Substring(file.IndexOf("Assets")));
}
private static Texture Find_M_Texture(string path)
{
file = "";
FindFile(Directory.GetParent(path).Parent.FullName, Path.GetFileNameWithoutExtension(path) + "_M");
if (file=="")
{
return null;
}
return AssetDatabase.LoadAssetAtPath<Texture>(file.Substring(file.IndexOf("Assets")));
}
private static Texture Find_N_Texture(string path)
{
file = "";
FindFile(Directory.GetParent(path).Parent.FullName, Path.GetFileNameWithoutExtension(path) + "_N");
if (file=="")
{
return null;
}
return AssetDatabase.LoadAssetAtPath<Texture>(file.Substring(file.IndexOf("Assets")));
}
private static string file;
private static void FindFile(string path,string name)
{
foreach (var _path in Directory.GetDirectories(path))
{
FindFile(_path, name);
}
foreach (var _file in Directory.GetFiles(path))
{
if (Path.GetFileNameWithoutExtension(_file)==name)
{
file= _file;
return;
}
}
}
}
}