/// <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); } }