in unity/Assets/UnityFBXExporter/FBXExporter.cs [396:490]
public static void CopyComplexMaterialsToPath(GameObject gameObj, string path, bool copyTextures, string texturesFolder = "/Textures", string materialsFolder = "/Materials")
{
#if UNITY_EDITOR
int folderIndex = path.LastIndexOf('/');
path = path.Remove(folderIndex, path.Length - folderIndex);
// 1. First create the directories that are needed
string texturesPath = path + texturesFolder;
string materialsPath = path + materialsFolder;
if(Directory.Exists(path) == false)
Directory.CreateDirectory(path);
if(Directory.Exists(materialsPath) == false)
Directory.CreateDirectory(materialsPath);
// 2. Copy every distinct Material into the Materials folder
//@cartzhang modify.As meshrender and skinnedrender is same level in inherit relation shape.
// if not check,skinned render ,may lost some materials.
Renderer[] meshRenderers = gameObj.GetComponentsInChildren<Renderer>();
List<Material> everyMaterial = new List<Material>();
for(int i = 0; i < meshRenderers.Length; i++)
{
for(int n = 0; n < meshRenderers[i].sharedMaterials.Length; n++)
{
everyMaterial.Add(meshRenderers[i].sharedMaterials[n]);
}
//Debug.Log(meshRenderers[i].gameObject.name);
}
Dictionary<string, Material> materialMapping = new Dictionary<string, Material>();
foreach (Material material in everyMaterial) {
if (materialMapping.ContainsKey(material.name)) {
continue;
} else {
materialMapping.Add(material.name, material);
}
}
Material[] everyDistinctMaterial = materialMapping.Values.ToArray<Material>();
everyDistinctMaterial = everyDistinctMaterial.OrderBy(o => o.name).ToArray<Material>();
List<string> everyMaterialName = new List<string>();
// Structure of materials naming, is used when packaging up the package
// PARENTNAME_ORIGINALMATNAME.mat
for(int i = 0; i < everyDistinctMaterial.Length; i++)
{
string newName = gameObj.name + "_" + everyDistinctMaterial[i].name;
string fullPath = materialsPath + "/" + newName + ".mat";
if(File.Exists(fullPath))
File.Delete(fullPath);
if(CopyAndRenameAsset(everyDistinctMaterial[i], newName, materialsPath))
everyMaterialName.Add(newName);
}
// 3. Go through newly moved materials and copy every texture and update the material
AssetDatabase.Refresh();
List<Material> allNewMaterials = new List<Material>();
for (int i = 0; i < everyMaterialName.Count; i++)
{
string assetPath = materialsPath;
if(assetPath[assetPath.Length - 1] != '/')
assetPath += "/";
assetPath += everyMaterialName[i] + ".mat";
Material sourceMat = (Material)AssetDatabase.LoadAssetAtPath(assetPath, typeof(Material));
if(sourceMat != null)
allNewMaterials.Add(sourceMat);
}
// Get all the textures from the mesh renderer
if(copyTextures)
{
if(Directory.Exists(texturesPath) == false)
Directory.CreateDirectory(texturesPath);
AssetDatabase.Refresh();
for(int i = 0; i < allNewMaterials.Count; i++)
{
allNewMaterials[i] = CopyTexturesAndAssignCopiesToMaterial(allNewMaterials[i], texturesPath);
}
}
AssetDatabase.Refresh();
#endif
}