• 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
        }
    
    
    }
  • 相关阅读:
    javascript定义变量和优先级的问题
    css expression explaination
    apply()与call()详解
    jquery $(document).ready() 与window.onload的区别
    ES5严格模式
    css margin collapse
    作业 20181016-10 每周例行报告
    作业 20181009-9 每周例行报告
    作业 20180925-1 每周例行报告
    20180925-7 规格说明书-吉林市2日游
  • 原文地址:https://www.cnblogs.com/DazeJiang/p/15753479.html
Copyright © 2020-2023  润新知