失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > Unity导入模型和材质丢失问题处理(大批量操作)

Unity导入模型和材质丢失问题处理(大批量操作)

时间:2023-08-26 15:26:08

相关推荐

Unity导入模型和材质丢失问题处理(大批量操作)

在unity资源商店买的模型包,导入unity后,全部材质丢失,稀里哗啦乱成一片

在网上搜了下材质丢失的办法,结果都是一个一个手动操作

窝草,资源包里接近两万个资产,手动不是要撸的灰飞烟灭

遂自制自动解决材质丢失办法

用法很简单粗暴

右键点击选着要更改的文件夹,

点击 easywork==>改变选中文件夹下所有材质为Standard

点击 easywork==>统一模型材质名称

如下,直接上代码

/********************************************************文件: 找回丢失材质.cs作者: 阿飞日期: CreateTime寄语: 虎年 虎虎生威 大吉大利功能: Nothing*********************************************************/using System.Collections.Generic;using UnityEditor;using UnityEngine;using System.IO;public class 找回丢失材质{private static string shaderMode = "Standard";[MenuItem("Assets/阿飞的EasyWork/改变选中文件夹下所有材质为Standard")]/// <summary>/// 改变选中文件夹下所有材质为标准的/// </summary>public static void ChangeMaterialsMode(){string rootpath = GetSelectFilePath();foreach (var path in GetAssetsPathWithFormat(rootpath, "mat")){modificationMaterialMode(path);}}[MenuItem("Assets/阿飞的EasyWork/统一模型材质名称")]/// <summary>/// 改变选中文件夹下所有材质为标准的/// </summary>public static void click1(){string rootpath = GetSelectFilePath();foreach (var path in GetAssetsPathWithFormat(rootpath, "fbx")){modificationFBX_Name(path);}foreach (var path in GetAssetsPathWithFormat(rootpath, "FBX")){modificationFBX_Name(path);}AssetDatabase.Refresh();}public static void modificationFBX_Name(string path){if (string.IsNullOrEmpty(path))return;ModelImporter mode = (ModelImporter)ModelImporter.GetAtPath(path);if (mode != null){mode.materialName = ModelImporterMaterialName.BasedOnModelNameAndMaterialName;AssetDatabase.ImportAsset(path);}else{Debug.LogError("设置模型材质名称失败 : " + path);}}/// <summary>/// 根据路径修改材质为 Standard/// </summary>/// <param name="path">路径为Assets开头</param>public static void modificationMaterialMode(string path){if (string.IsNullOrEmpty(path))return;Material material = AssetDatabase.LoadAssetAtPath<Material>(path);if (material == null){Debug.Log(path);}else{material.shader = Shader.Find(shaderMode);}}public static string GetSelectFilePath(){UnityEngine.Object[] arr = Selection.GetFiltered(typeof(UnityEngine.Object), SelectionMode.TopLevel);return (Application.dataPath.Substring(0, Application.dataPath.LastIndexOf('/')) + "/" + AssetDatabase.GetAssetPath(arr[0]));}public static List<string> GetAssetsPathWithFormat(string rootpath, string endformat){//获取指定路径下面的所有资源文件if (Directory.Exists(rootpath)){DirectoryInfo direction = new DirectoryInfo(rootpath);FileInfo[] files = direction.GetFiles("*", SearchOption.AllDirectories);List<string> result = new List<string>();for (int i = 0; i < files.Length; i++){if (files[i].Name.EndsWith("." + endformat)){result.Add(ConvertToAssetsPath(files[i].FullName));}}Debug.Log(string.Format("<color=green>文件数量 : {0}</color>", result.Count));return result;}return null;}public static string ConvertToAssetsPath(string path){string newpath = "";string[] roots = path.Split('\\');bool isadd = false;for (int i = 0; i < roots.Length; i++){if (roots[i].Equals("Assets") && isadd == false){isadd = true;}if (isadd){if (i == roots.Length - 1){newpath += roots[i];}else{newpath += roots[i] + "/";}}}return newpath;}}

ok

反正我是解决了

如果觉得《Unity导入模型和材质丢失问题处理(大批量操作)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。