美文网首页
资源优化篇:1、清理序列化冗余文件

资源优化篇:1、清理序列化冗余文件

作者: APP4x | 来源:发表于2020-06-07 14:24 被阅读0次

    前提:切换资源序列化模式为Force Text
    (一般在公司就是这个,因为git只能用text)

    1.清理序列化文件冗余引用
    材质的shader,gameobject组建的Monobehavior
    开发过程中,可能之前已经赋值过,但是后来又把 shader的property或者代码的序列化参数删掉了
    但是这些参数删除后,材质或者GameObject的Prefab文件中,该参数的序列化数据并未被删除
    会导致AssetDataBase.GetDependencies之类的方法,取得引用时,会带入不需要的资源

    a.对于一般的prefab,可以拖出来点一下apply,也就是setDirty一下,再保存就行了

    EditorUtility.SetDirty(obj);
    AssetDatabase.SaveAssets();
    

    b.对于particleSystem中的mesh
    如果renderType选过mesh,又切换到其他方式,这个mesh就会保存在meta文件里面

    ParticleSystemRenderer[] renders = gameObj.GetComponentsInChildren<ParticleSystemRenderer>(true);
                foreach(var renderItem in renders)
                {
                    if(renderItem.renderMode != ParticleSystemRenderMode.Mesh)
                    {
                        renderItem.mesh = null;
                        EditorUtility.SetDirty(gameObj);
                    }
                }
    

    c.对于材质球里的参数
    如果给纹理参数选了一个引用,即使把这个参数都删了,还是会存在meta里面
    (unity的机制,方便切换shader使用)

     public static void ClearMaterial()
        {
    
            UnityEngine.Object[] objs = Selection.GetFiltered(typeof(Material), SelectionMode.DeepAssets);
            for (int i = 0; i < objs.Length; ++i)
            {
                Material mat = objs[i] as Material;
    
                if (mat)
                {
                    SerializedObject psSource = new SerializedObject(mat);
                    SerializedProperty emissionProperty = psSource.FindProperty("m_SavedProperties");//代表存储的属性
                    SerializedProperty texEnvs = emissionProperty.FindPropertyRelative("m_TexEnvs");//存储所有纹理的结点,还有m_Floats、m_Colors等等。
                    if (CleanMaterialSerializedProperty(texEnvs, mat))
                    {
                        Debug.LogError("Find and clean useless texture propreties in " + mat.name);
                    }
                    psSource.ApplyModifiedProperties();
                    EditorUtility.SetDirty(mat);
                }
            }
    
            AssetDatabase.SaveAssets();
        }
    
        //true: has useless propeties
        private static bool CleanMaterialSerializedProperty(SerializedProperty property, Material mat)
        {
            bool res = false;
    
            for (int j = property.arraySize - 1; j >= 0; j--)
            {
                string propertyName =   property.GetArrayElementAtIndex(j).FindPropertyRelative("first").stringValue;
    
                if (!mat.HasProperty(propertyName))//如果没有了,就删除
                {
                    if(propertyName.Equals("_MainTex"))     
                    {
                        //_MainTex是内建属性,是置空不删除,否则UITexture等控件在获取mat.maintexture的时候会报错
                        if (property.GetArrayElementAtIndex (j).FindPropertyRelative ("second").FindPropertyRelative ("m_Texture").objectReferenceValue != null) 
                        {
                            property.GetArrayElementAtIndex (j).FindPropertyRelative ("second").FindPropertyRelative ("m_Texture").objectReferenceValue = null;
                            Debug.Log("Set _MainTex is null");
                            res = true;
                        }
                    }
                    else
                    {
                        property.DeleteArrayElementAtIndex(j);
                        Debug.Log("Delete property in serialized object : " + propertyName);
                        res = true;
                    }
                }
            }
            return res;
        }
    

    相关文章

      网友评论

          本文标题:资源优化篇:1、清理序列化冗余文件

          本文链接:https://www.haomeiwen.com/subject/njrctktx.html