Unity资源导入加强工具

开发目的:unity里模型材质贴图处理起来很麻烦,当模型数量很多时会浪费很多时间。(目前支持2018.3以上版本)

目标:导入模型后自动创建材质,自动赋予贴图,修改模型和贴图导入设置属性

本文参考【技术美术小技巧】 美术资源的批量管理_哔哩哔哩_bilibili 

up主工具代码地址https://github.com/JiepengTan/UnityAssetToolTutorial

up主的方法个人感觉使用起来较麻烦,而且有很多局限性: 

1、仅支持一个模型一个材质,模型要合并在一起,不能出现子物体

2、修改物体大小时缩放了物体100倍,而不是设置导入的单位。

参考其内容,简化使用,使用AssetPostprocessor在资源导入处理资源,导入模型后会自动创建材质,仅需要配置材质路径和贴图路径就可以自动赋予材质贴图。

1、添加导入模型后,自动创建材质,设置尺寸

public class EditorFbxImportSetting : AssetPostprocessor
{
    void OnPreprocessModel()
    {
        ModelImporter importer = assetImporter as ModelImporter;
        if (importer == null)
        {
            return;
        }
        string name = importer.assetPath.ToLower();
        string extension = name.Substring(name.LastIndexOf(".")).ToLower();
        switch (extension)
        {
            case ".3ds":
            case ".fbx":
#if UNITY_2019_1_OR_NEWER
                importer.materialImportMode = ModelImporterMaterialImportMode.ImportViaMaterialDescription;
                importer.optimizeMeshPolygons = true;
#endif
                importer.importCameras = false;
                importer.importLights = false;
                importer.generateSecondaryUV = false;
                importer.swapUVChannels = false;
                importer.materialLocation = ModelImporterMaterialLocation.External;
                importer.materialSearch = ModelImporterMaterialSearch.RecursiveUp;
                importer.materialName = ModelImporterMaterialName.BasedOnMaterialName;
                importer.useFileUnits = false;
                break;

            default:
                break;
        }
    }
}

2、添加贴图手动导入后,法线贴图自动设置为bumpMap贴图类型

public class EditorTextureImprotSetting : AssetPostprocessor
{
    public void OnPreprocessTexture()
    {
        TextureImporter impor = this.assetImporter as TextureImporter;
        impor.textureCompression = TextureImporterCompression.Compressed;
        impor.maxTextureSize = 1024;
        impor.textureType = TextureImporterType.Default;
        impor.mipmapEnabled = false;
        string fileName = Path.GetFileNameWithoutExtension(this.assetPath);
        if (fileName.Contains("_Normal"))
        {
            impor.textureType = TextureImporterType.NormalMap;
        }
    }
}

3、配置脚本

[CreateAssetMenu(menuName = "Configs/FBXAssetConfig")]
public class FBXAssetConfig : ScriptableObject
{
    [Header("贴图命名:材质名+贴图类型/模型名+材质名+贴图类型")]
    [Label("材质路径")]
    public string MatPath="Art/Meshs/Materials/";
    [Header("贴图后缀:_BaseColor/_Metallic/_Roughness/_Normal")]
    [Label("贴图路径")]
    public string texturePath = "Art/Textures/";
    public ShaderType shaderType = ShaderType.Autodesk;
    [Header("顺序不建议修改")]
    public List<string> shaderPro = new List<string>() { "_MainTex", "_MetallicGlossMap", "_SpecGlossMap", "_BumpMap" };
    [ShowIf("ShowCustomShaderStr")]
    public string customShader;

    public bool ShowCustomShaderStr()
    {
        if (shaderType==ShaderType.None)
        {
            return true;
        }
        return false;
    }

    [Button()]
    public void SetMaterialTexture()
    {
        string p = Application.dataPath+"/" + MatPath;
        PathUtil.EnsureDirectoryExist(p);
        PathUtil.Walk(p,"*.mat", (s) => {

            Debug.Log(s);
            string fileName = System.IO.Path.GetFileName(s);
            Material mat = AssetDatabase.LoadAssetAtPath<Material>("Assets/"+MatPath+fileName);
            SetMat(mat,mat.name);
            EditorUtility.SetDirty(mat);
        });

        // 保存所有修改
        AssetDatabase.SaveAssets();
    }

    private Shader GetMaterialShader()
    {
        Shader shader = Shader.Find("Autodesk Interactive");
        switch (shaderType)
        {
            case ShaderType.None:
                shader = Shader.Find(customShader);
                break;
            case ShaderType.Standard:
                shader = Shader.Find("Standard");
                break;
            default:
                break;
        }
        return shader;
    }
    private void SetMat(Material material,string keys)
    {
        string p = Application.dataPath + "/" + texturePath;
        PathUtil.EnsureDirectoryExist(p);
        material.shader = GetMaterialShader();
        PathUtil.Walk(p, "*.png|*.tga", (s)=> {
            Texture texture = null;
            string fileName =System.IO.Path.GetFileName(s);
            if (fileName.Contains(keys))
            {
                if (fileName.Contains("_BaseColor"))
                {
                    texture = AssetDatabase.LoadAssetAtPath<Texture>("Assets/" + texturePath + fileName);
                    material.SetTexture(shaderPro[0], texture);
                }
                else if(fileName.Contains("_Metallic"))
                {
                    texture = AssetDatabase.LoadAssetAtPath<Texture>("Assets/" + texturePath + fileName);
                    material.SetTexture(shaderPro[1], texture);
                }
                else if (fileName.Contains("_Roughness"))
                {
                    texture = AssetDatabase.LoadAssetAtPath<Texture>("Assets/" + texturePath + fileName);
                    material.SetTexture(shaderPro[2], texture);
                }
                else if (fileName.Contains("_Normal"))
                {
                    texture = AssetDatabase.LoadAssetAtPath<Texture>("Assets/" + texturePath + fileName);
                    
                    material.SetTexture(shaderPro[3], texture);
                }
            }
        });
        
    }


    public enum ShaderType
    {
        None,
        Autodesk,
        Standard
    }


}
原文地址:https://www.cnblogs.com/DazeJiang/p/15753479.html