void BundleSingleBatch() { TextAsset Scene = AssetDatabase.LoadAssetAtPath("Assets/Models/ABSingle.txt", typeof(TextAsset)) as TextAsset; if (Scene == null) { return; } listSingleBatch.Clear(); listSingleBatch = ABTools.GetContent(new MemoryStream(Scene.bytes)); scrollPosSingle = GUILayout.BeginScrollView(scrollPosSingle, GUILayout.ExpandWidth(true)); foreach (string e in listSingleBatch) { GUILayout.Label(e, GUILayout.ExpandWidth(true)); } GUILayout.EndScrollView(); GUILayout.BeginHorizontal(); if (GUILayout.Button("Pack Single Bundle", GUILayout.ExpandWidth(true))) { ABBatch.ReadNormal(listSingleBatch); } GUILayout.EndHorizontal(); }
bool CreateAssetBunldesALL(Object[] SelectedAsset, string targetPath, BuildTarget BT) { foreach (Object o in SelectedAsset) { if (ABTools.MissingMono(o)) { return(false); } } if (SelectedAsset == null || SelectedAsset.Length == 0) { //EditorUtility.DisplayDialog("AssetBunlde", "Nothing is Selected", "Close"); Debuger.LogError("Nothing is Selected or targetPath is invalid"); return(false); } if (File.Exists(targetPath)) { //if (EditorUtility.DisplayDialog("AssetBunlde", "Target is Exist, Is Delete?", "Delete", "No Delete")) { File.Delete(targetPath); AssetDatabase.Refresh(); } } if (BuildPipeline.BuildAssetBundle(null, SelectedAsset, targetPath, BuildAssetBundleOptions.CollectDependencies, BT)) { AssetDatabase.Refresh(); return(true); } else { AssetDatabase.Refresh(); return(false); } }
/// <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)); }
public void ExecCreateAssetBunldes() { //取得在 Project 视图中选择的资源(包含子目录中的资源) Object[] SelectedAsset = Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets); if (SelectedAsset == null) { EditorUtility.DisplayDialog("AssetBunlde", "Nothing is Selected", "Close"); return; } foreach (Object obj in SelectedAsset) { if (ABTools.MissingMono(obj)) { continue; } #if UNITY_IPHONE string targetPath = ABConfig.OutputFolderIPhone + obj.name + ABConfig.extensionName; #elif UNITY_STANDALONE_WIN string targetPath = ABConfig.OutputFolderWindows32 + obj.name + ABConfig.extensionName; #elif UNITY_ANDROID string targetPath = ABConfig.OutputFolderAndroid + obj.name + ABConfig.extensionName; #else string targetPath = ABConfig.OutputFolderWindows32 + obj.name + ABConfig.extensionName; #endif // UNITY_STANDALONE_WIN if (File.Exists(targetPath)) { File.Delete(targetPath); } #if UNITY_IPHONE //建立 AssetBundle if (BuildPipeline.BuildAssetBundle(obj, null, targetPath, BuildAssetBundleOptions.CollectDependencies, // | BuildAssetBundleOptions.CompleteAssets, BuildTarget.iPhone)) { Debuger.Log(targetPath + "建立完成"); } else { Debuger.LogError(obj.name + "建立失败"); } #elif UNITY_STANDALONE_WIN //建立 AssetBundle if (BuildPipeline.BuildAssetBundle(obj, null, targetPath, BuildAssetBundleOptions.CollectDependencies, // | BuildAssetBundleOptions.CompleteAssets, BuildTarget.StandaloneWindows)) { Debuger.Log(targetPath + "建立完成"); } else { Debuger.LogError(obj.name + "建立失败"); } #elif UNITY_ANDROID //建立 AssetBundle if (BuildPipeline.BuildAssetBundle(obj, null, targetPath, BuildAssetBundleOptions.CollectDependencies, // | BuildAssetBundleOptions.CompleteAssets, BuildTarget.Android)) { Debuger.Log(targetPath + "建立完成"); } else { Debuger.LogError(obj.name + "建立失败"); } #endif // UNITY_STANDALONE_WIN AssetDatabase.Refresh(); } EditorUtility.DisplayDialog("AssetBunlde", "BuildTarget.StandaloneWindows Over", "Close"); }
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); } }