예제 #1
0
        /// <summary>
        /// 针对传入的硬盘对象,创建一个纹理配置文件asset
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        void DecomposeMaterialAsset(Object obj)
        {
            //  输出目录
            string folder = AssetDatabase.GetAssetPath(obj);

            folder = Path.GetDirectoryName(folder);

            //
            ArrayList listMatNames = new ArrayList();
            Dictionary <string, int> dicListMatNames = new Dictionary <string, int>();

            GameObject characterClone = (GameObject)Object.Instantiate(obj);

            characterClone.name = obj.name;

            //  搜寻所有的MeshRender.
            foreach (MeshRenderer ren in characterClone.GetComponentsInChildren <MeshRenderer>())
            {
                {
                    //  sharedMaterials
                    if (ren.sharedMaterials != null)
                    {
                        int count = ren.sharedMaterials.Length;

                        for (int i = count - 1; i >= 0; i--)
                        {
                            Material m = (Material)ren.sharedMaterials[i];

                            if (m == null)
                            {
                                Debug.LogError("Missing " + ren.gameObject.name + " -> Material in " + characterClone.name);
                            }
                            else
                            {
                                //Debug.Log(characterClone.name + "/" + ren.gameObject.name + "/" + m.name);

                                StringPrefabMaterial prefabmat = new StringPrefabMaterial();
                                //  挂载的对象.
                                prefabmat.meshrendererGameObject = ABTools.GetParentPath(ren.gameObject) + "_" + ren.gameObject.GetInstanceID();
                                //
                                ren.gameObject.name += "_" + ren.gameObject.GetInstanceID();
                                //  资源名称.
                                prefabmat.assetname = m.name;
                                //  资源对象.
                                prefabmat.assetbundlePath = GetDepencyPath(m.name, ren.gameObject);
                                //  纹理的AB.
                                prefabmat.assetbundlePath = CreateMaterialAB(prefabmat.assetbundlePath);

                                listMatNames.Add(prefabmat);

                                //	Count Times
                                int curcount = -1;

                                if (dicListMatNames.TryGetValue(prefabmat.assetbundlePath, out curcount))
                                {
                                    curcount++;
                                }
                                else
                                {
                                    curcount = 1;
                                }

                                dicListMatNames[prefabmat.assetbundlePath] = curcount;
                            }
                        }

                        ren.sharedMaterials = new Material[0];
                    }
                }
            }


            //  创建一个不带Material的Prefab.
            string nomaterialscenePath = folder + "/" + obj.name + "_nomaterial.prefab";
            Object o = PrefabUtility.CreateEmptyPrefab(nomaterialscenePath);

            PrefabUtility.ReplacePrefab(characterClone, o);

            //{
            //    //
            //    ArrayList listLightmaps = new ArrayList();

            //    Renderer[] rs = characterClone.GetComponentsInChildren<Renderer>();
            //    foreach (Renderer r in rs)
            //    {
            //        StringPrefabLightmap slmp = new StringPrefabLightmap();
            //        slmp.lightmapIndex = r.lightmapIndex;
            //        slmp.lightmapScaleOffset = r.lightmapScaleOffset;

            //        Debug.Log(r.gameObject.name + " " + r.lightmapIndex + " " + r.lightmapScaleOffset);

            //        listLightmaps.Add(slmp);
            //    }

            //}

            //  创建配置文件
            StringPrefab holder = ScriptableObject.CreateInstance <StringPrefab>();

            holder.material = (StringPrefabMaterial[])listMatNames.ToArray(typeof(StringPrefabMaterial));
            //holder.lightmap = (StringPrefabLightmap[])listLightmaps.ToArray(typeof(StringPrefabLightmap));
            string materialassetPath = folder + "/" + obj.name + "_material.asset";

            AssetDatabase.CreateAsset(holder, materialassetPath);

            //
            string txtPath = mDestFolder + "/" + obj.name + ".txt";
            string content = string.Empty;

            foreach (KeyValuePair <string, int> e in dicListMatNames)
            {
                content += e.Value;
                content += "\t";
                content += e.Key;
                content += "\r\n";
            }
            File.WriteAllText(txtPath, content);

            AssetDatabase.SaveAssets();
            AssetDatabase.Refresh();

            GameObject.DestroyImmediate(characterClone);

            nomaterialscene = (GameObject)AssetDatabase.LoadAssetAtPath(nomaterialscenePath, typeof(GameObject));
            materialasset   = (StringPrefab)AssetDatabase.LoadAssetAtPath(materialassetPath, typeof(StringPrefab));
        }
        static void CreateFromPrefab_Scene(PLATFORM p)
        {
            Debug.Log("CreateAssetbundles CreateFromPrefab_Scene");

            CreateAssetBundlePath();

            ArrayList listMatNames = new ArrayList();

            foreach (Object obj in Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets))
            {
                // filters
                if (!(obj is GameObject))
                {
                    continue;
                }
                //
                GameObject characterClone = (GameObject)Object.Instantiate(obj);

                characterClone.name = obj.name;

                //  搜寻所有的MeshRender.
                foreach (MeshRenderer ren in characterClone.GetComponentsInChildren <MeshRenderer>())
                {
                    {
                        //  sharedMaterials
                        if (ren.sharedMaterials != null)
                        {
                            int count = ren.sharedMaterials.Length;

                            for (int i = count - 1; i >= 0; i--)
                            {
                                Material m = (Material)ren.sharedMaterials[i];

                                if (m == null)
                                {
                                    Debug.LogError("Missing " + obj.name + " -> Material");
                                }
                                else
                                {
                                    //Debug.Log(characterClone.name + "/" + ren.gameObject.name + "/" + m.name);

                                    StringPrefabMaterial prefabmat = new StringPrefabMaterial();
                                    //  资源名称.
                                    prefabmat.assetname = m.name;
                                    //  挂载的对象.
                                    prefabmat.meshrendererGameObject = ABTools.GetParentPath(ren.gameObject);
                                    //  资源对象.
                                    prefabmat.assetbundlePath = GetDepencyPath(m.name);

                                    listMatNames.Add(prefabmat);
                                }
                            }

                            ren.sharedMaterials = new Material[0];
                        }
                    }
                }

                //  创建一个不带Material的Prefab.
                Object o = PrefabUtility.CreateEmptyPrefab(ASSETBUNDLE_PATH + "/" + obj.name + "_nomaterial.prefab");
                PrefabUtility.ReplacePrefab(characterClone, o);

                //  创建配置文件
                StringPrefab holder = ScriptableObject.CreateInstance <StringPrefab>();
                holder.material = (StringPrefabMaterial[])listMatNames.ToArray(typeof(StringPrefabMaterial));
                AssetDatabase.CreateAsset(holder, ASSETBUNDLE_PATH + "/" + obj.name + "_material.asset");

                GameObject.DestroyImmediate(characterClone);
            }
        }