/// <summary> /// 生成场景 /// </summary> void BuildScene(bool exportScene, bool exportRes, bool compressScene, bool compressRes) { // 先保存场景 EditorApplication.SaveScene(); // 场景名字 var scenePath = EditorApplication.currentScene; string sceneName = UtilityTools.GetFileName(scenePath); // 导出目录 var exportPath = UtilityTools.GenResExportPath(string.Format("scene/{0}", sceneName), sceneName); var exportDir = Path.GetDirectoryName(exportPath); // 删除目录 if (exportRes && exportScene) { Directory.Delete(exportDir, true); } // 创建目录 if (!Directory.Exists(exportDir)) { Directory.CreateDirectory(exportDir); } /// 开始处理数据 try { do { AssetsBackuper.inst.Clear(); if (exportScene) { var outputDir = EditorUtil.GetSceneOutputPath(null); AssetDatabase.DeleteAsset(outputDir); var outputPath = EditorUtil.GetSceneOutputPath(string.Format("{0}.unity", sceneName)); EditorApplication.SaveScene(outputPath); } // 树结构 var meshColliders = new List <MeshCollider>(); var trees = SceneTree.Build(_settings.trees, meshColliders); if (null == trees) { break; } SaveSettings(); SceneTree.Export(trees, meshColliders, exportRes, compressRes); // 准备导出 EditorApplication.SaveScene(); AssetDatabase.SaveAssets(); if (exportScene) { ResExportUtil.ExportCurrentScene(true, compressScene); } }while(false); } catch (Exception e) { Debug.LogException(e); AssetsBackuper.inst.Recover(); AssetDatabase.SaveAssets(); } finally { // 还原修改过的资源和场景 if (_recovertScene) { AssetsBackuper.inst.Recover(); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); EditorApplication.OpenScene(scenePath); Resources.UnloadUnusedAssets(); } } }
private static bool TestExportCurrentScene() { ResExportUtil.ExportCurrentScene(true, false); return(true); }
/// <summary> /// 导出 /// </summary> static public void Export(SceneTree[] trees, List <MeshCollider> meshColliders, bool exportRes, bool compress) { // 收集依赖 var sb = new StringBuilder(); int depsCount = 0; var resCollector = new ResDescCollector(); var dictRes = new Dictionary <string, ResExportDesc>(); // 光照图(不能卸载第一张光照图,否则unity_Lightmap_HDR会置为1) var lightMaps = LightmapSettings.lightmaps; if (null != lightMaps && lightMaps.Length > 0 && null != lightMaps[0].lightmapColor) { var resName = ResDepBase.GetResName(lightMaps[0].lightmapColor); resCollector.AddLightMap(resName, 0, true); } // 场景 for (int i = 0; i < trees.Length; ++i) { var tree = trees[i]; if (null != tree && tree.settings.objType == SceneTreeObjType.Renderer) { var n = tree.CollectDeps(dictRes); sb.AppendFormat("Tree {0} deps count is {1}\n", tree.settings.name, n); depsCount += n; } } sb.AppendFormat("All tree deps count is {0}\n", depsCount); Debug.Log(sb.ToString()); // 生成节点数据 var prefabCollection = new ScenePrefabCollection(); var treeDatas = new List <SceneTreeData>(); for (int i = 0; i < trees.Length; ++i) { var tree = trees[i]; if (null != tree) { var data = tree.BuildData(prefabCollection, dictRes); treeDatas.Add(data); } } // LightMap这里要置空一下,仅清空LightmapSettings.lightmaps仍然有依赖 Lightmapping.lightingDataAsset = null; // 只留一盏主光源 var lights = Light.GetLights(LightType.Directional, 0); Light mainLight = null; if (lights.Length > 0) { mainLight = lights[0]; for (int i = 1; i < lights.Length; ++i) { GameObject.DestroyImmediate(lights[i].gameObject); } } // MeshCollider var deps = new List <ResDepBase>(); ResDepBase.CollectColliderDependencies(meshColliders, deps); for (int n = 0, cn = deps.Count; n < cn; ++n) { var dep = deps[n]; dep.CollectRes(resCollector, dictRes); dep.RemoveDependencies(); } // 场景描述 var goSceneDesc = new GameObject("scene_desc"); SceneDesc desc = goSceneDesc.AddComponent <SceneDesc>(); desc.mainLight = mainLight; desc.lightMapCount = LightmapSettings.lightmaps.Length; desc.resCollection = resCollector.Export(); desc.trees = treeDatas.ToArray(); desc.prefabs = prefabCollection.Export(); // 移除编辑脚本 var cfgs = UnityEngine.Object.FindObjectsOfType <EditorSceneObject>(); for (int i = 0; i < cfgs.Length; ++i) { UnityEngine.Object.DestroyImmediate(cfgs[i]); } // 资源 if (exportRes) { var sbExport = new StringBuilder(); sbExport.AppendFormat("Resources Count[{0}]\n", dictRes.Count); sbExport.Append("---------------------------------------------------------------\n"); foreach (var pair in dictRes) { var resDesc = pair.Value; ResExportUtil.ExportRes(resDesc, compress); sbExport.AppendFormat("{0}/{1} - {2}\n", resDesc.resDir, resDesc.resName, resDesc.refCount); } sbExport.Append("---------------------------------------------------------------\n"); Debug.Log(sbExport.ToString()); } }