public static bool ExportFont(AssetPreloadData asset, string exportPath) { var m_Font = new UFont(asset, true); if (m_Font.m_FontData != null) { var exportFullName = exportPath + asset.Text + asset.extension; if (ExportFileExists(exportFullName)) { return(false); } File.WriteAllBytes(exportFullName, m_Font.m_FontData); return(true); } return(false); }
public static void BuildAssetStructures(bool loadAssets, bool displayAll, bool buildHierarchy, bool buildClassStructures, bool displayOriginalName, out List <GameObject> fileNodes) { fileNodes = null; #region first loop - read asset data & create list if (loadAssets) { SetProgressBarValue(0); SetProgressBarMaximum(assetsfileList.Sum(x => x.preloadTable.Values.Count)); StatusStripUpdate("Building asset list..."); string fileIDfmt = "D" + assetsfileList.Count.ToString().Length; for (var i = 0; i < assetsfileList.Count; i++) { var assetsFile = assetsfileList[i]; string fileID = i.ToString(fileIDfmt); AssetBundle ab = null; foreach (var asset in assetsFile.preloadTable.Values) { asset.uniqueID = fileID + asset.uniqueID; var exportable = false; switch (asset.Type) { case ClassIDReference.GameObject: { GameObject m_GameObject = new GameObject(asset); assetsFile.GameObjectList.Add(asset.m_PathID, m_GameObject); break; } case ClassIDReference.Transform: { Transform m_Transform = new Transform(asset); assetsFile.TransformList.Add(asset.m_PathID, m_Transform); break; } case ClassIDReference.RectTransform: { RectTransform m_Rect = new RectTransform(asset); assetsFile.TransformList.Add(asset.m_PathID, m_Rect.m_Transform); break; } case ClassIDReference.Texture2D: { Texture2D m_Texture2D = new Texture2D(asset, false); exportable = true; break; } case ClassIDReference.Shader: { Shader m_Shader = new Shader(asset, false); exportable = true; break; } case ClassIDReference.TextAsset: { TextAsset m_TextAsset = new TextAsset(asset, false); exportable = true; break; } case ClassIDReference.AudioClip: { AudioClip m_AudioClip = new AudioClip(asset, false); exportable = true; break; } case ClassIDReference.MonoBehaviour: { var m_MonoBehaviour = new MonoBehaviour(asset, false); if (asset.Type1 != asset.Type2 && assetsFile.ClassStructures.ContainsKey(asset.Type1)) { exportable = true; } break; } case ClassIDReference.Font: { UFont m_Font = new UFont(asset, false); exportable = true; break; } case ClassIDReference.PlayerSettings: { var plSet = new PlayerSettings(asset); productName = plSet.productName; break; } case ClassIDReference.Mesh: { Mesh m_Mesh = new Mesh(asset, false); exportable = true; break; } case ClassIDReference.AssetBundle: { ab = new AssetBundle(asset); break; } case ClassIDReference.VideoClip: { var m_VideoClip = new VideoClip(asset, false); exportable = true; break; } case ClassIDReference.MovieTexture: { var m_MovieTexture = new MovieTexture(asset, false); exportable = true; break; } case ClassIDReference.Sprite: { var m_Sprite = new Sprite(asset, false); exportable = true; break; } case ClassIDReference.Animator: { exportable = true; break; } case ClassIDReference.AnimationClip: { exportable = true; var reader = asset.sourceFile.reader; reader.Position = asset.Offset; asset.Text = reader.ReadAlignedString(); break; } } if (asset.Text == "") { asset.Text = asset.TypeString + " #" + asset.uniqueID; } asset.SubItems.AddRange(new[] { asset.TypeString, asset.fullSize.ToString() }); //处理同名文件 if (!assetsNameHash.Add((asset.TypeString + asset.Text).ToUpper())) { asset.Text += " #" + asset.uniqueID; } //处理非法文件名 asset.Text = FixFileName(asset.Text); if (displayAll) { exportable = true; } if (exportable) { assetsFile.exportableAssets.Add(asset); } ProgressBarPerformStep(); } if (displayOriginalName) { assetsFile.exportableAssets.ForEach(x => { var replacename = ab?.m_Container.Find(y => y.second.asset.m_PathID == x.m_PathID)?.first; if (!string.IsNullOrEmpty(replacename)) { var ex = Path.GetExtension(replacename); x.Text = !string.IsNullOrEmpty(ex) ? replacename.Replace(ex, "") : replacename; } }); } exportableAssets.AddRange(assetsFile.exportableAssets); } visibleAssets = exportableAssets; assetsNameHash.Clear(); } #endregion #region second loop - build tree structure if (buildHierarchy) { fileNodes = new List <GameObject>(); var gameObjectCount = assetsfileList.Sum(x => x.GameObjectList.Values.Count); if (gameObjectCount > 0) { SetProgressBarValue(0); SetProgressBarMaximum(gameObjectCount); StatusStripUpdate("Building tree structure..."); foreach (var assetsFile in assetsfileList) { GameObject fileNode = new GameObject(null); fileNode.Text = Path.GetFileName(assetsFile.filePath); fileNode.m_Name = "RootNode"; foreach (var m_GameObject in assetsFile.GameObjectList.Values) { foreach (var m_Component in m_GameObject.m_Components) { if (m_Component.m_FileID >= 0 && m_Component.m_FileID < assetsfileList.Count) { var sourceFile = assetsfileList[m_Component.m_FileID]; if (sourceFile.preloadTable.TryGetValue(m_Component.m_PathID, out var asset)) { switch (asset.Type) { case ClassIDReference.Transform: { m_GameObject.m_Transform = m_Component; break; } case ClassIDReference.MeshRenderer: { m_GameObject.m_MeshRenderer = m_Component; break; } case ClassIDReference.MeshFilter: { m_GameObject.m_MeshFilter = m_Component; if (assetsfileList.TryGetPD(m_Component, out var assetPreloadData)) { var m_MeshFilter = new MeshFilter(assetPreloadData); if (assetsfileList.TryGetPD(m_MeshFilter.m_Mesh, out assetPreloadData)) { assetPreloadData.gameObject = m_GameObject; } } break; } case ClassIDReference.SkinnedMeshRenderer: { m_GameObject.m_SkinnedMeshRenderer = m_Component; if (assetsfileList.TryGetPD(m_Component, out var assetPreloadData)) { var m_SkinnedMeshRenderer = new SkinnedMeshRenderer(assetPreloadData); if (assetsfileList.TryGetPD(m_SkinnedMeshRenderer.m_Mesh, out assetPreloadData)) { assetPreloadData.gameObject = m_GameObject; } } break; } case ClassIDReference.Animator: { m_GameObject.m_Animator = m_Component; asset.Text = m_GameObject.asset.Text; break; } } } } } var parentNode = fileNode; if (assetsfileList.TryGetTransform(m_GameObject.m_Transform, out var m_Transform)) { if (assetsfileList.TryGetTransform(m_Transform.m_Father, out var m_Father)) { if (assetsfileList.TryGetGameObject(m_Father.m_GameObject, out parentNode)) { } } } parentNode.Nodes.Add(m_GameObject); ProgressBarPerformStep(); } if (fileNode.Nodes.Count > 0) { fileNodes.Add(fileNode); } } } } #endregion #region build list of class strucutres if (buildClassStructures) { //group class structures by versionv foreach (var assetsFile in assetsfileList) { if (AllClassStructures.TryGetValue(assetsFile.m_Version, out var curVer)) { foreach (var uClass in assetsFile.ClassStructures) { curVer[uClass.Key] = uClass.Value; } } else { AllClassStructures.Add(assetsFile.m_Version, assetsFile.ClassStructures); } } } #endregion }
public static void BuildAssetStructures(bool loadAssetsMenuItem, bool displayAll, bool buildHierarchyMenuItem, bool buildClassStructuresMenuItem, bool displayOriginalName) { #region first loop - read asset data & create list if (loadAssetsMenuItem) { SetProgressBarValue(0); SetProgressBarMaximum(assetsfileList.Sum(x => x.preloadTable.Values.Count)); string fileIDfmt = "D" + assetsfileList.Count.ToString().Length; for (var i = 0; i < assetsfileList.Count; i++) { var assetsFile = assetsfileList[i]; StatusStripUpdate("Building asset list from " + Path.GetFileName(assetsFile.filePath)); string fileID = i.ToString(fileIDfmt); AssetBundle ab = null; foreach (var asset in assetsFile.preloadTable.Values) { asset.uniqueID = fileID + asset.uniqueID; var exportable = false; switch (asset.Type) { case ClassIDReference.GameObject: { GameObject m_GameObject = new GameObject(asset); assetsFile.GameObjectList.Add(asset.m_PathID, m_GameObject); //totalTreeNodes++; break; } case ClassIDReference.Transform: { Transform m_Transform = new Transform(asset); assetsFile.TransformList.Add(asset.m_PathID, m_Transform); break; } case ClassIDReference.RectTransform: { RectTransform m_Rect = new RectTransform(asset); assetsFile.TransformList.Add(asset.m_PathID, m_Rect.m_Transform); break; } case ClassIDReference.Texture2D: { Texture2D m_Texture2D = new Texture2D(asset, false); exportable = true; break; } case ClassIDReference.Shader: { Shader m_Shader = new Shader(asset, false); exportable = true; break; } case ClassIDReference.TextAsset: { TextAsset m_TextAsset = new TextAsset(asset, false); exportable = true; break; } case ClassIDReference.AudioClip: { AudioClip m_AudioClip = new AudioClip(asset, false); exportable = true; break; } case ClassIDReference.MonoBehaviour: { var m_MonoBehaviour = new MonoBehaviour(asset, false); if (asset.Type1 != asset.Type2 && assetsFile.ClassStructures.ContainsKey(asset.Type1)) { exportable = true; } break; } case ClassIDReference.Font: { UFont m_Font = new UFont(asset, false); exportable = true; break; } case ClassIDReference.PlayerSettings: { var plSet = new PlayerSettings(asset); productName = plSet.productName; break; } case ClassIDReference.Mesh: { Mesh m_Mesh = new Mesh(asset, false); exportable = true; break; } case ClassIDReference.AssetBundle: { ab = new AssetBundle(asset); break; } case ClassIDReference.VideoClip: { var m_VideoClip = new VideoClip(asset, false); exportable = true; break; } case ClassIDReference.MovieTexture: { var m_MovieTexture = new MovieTexture(asset, false); exportable = true; break; } case ClassIDReference.Sprite: { var m_Sprite = new Sprite(asset, false); exportable = true; break; } } if (!exportable && displayAll) { asset.extension = ".dat"; exportable = true; } if (exportable) { if (asset.Text == "") { asset.Text = asset.TypeString + " #" + asset.uniqueID; } asset.SubItems.AddRange(new[] { asset.TypeString, asset.fullSize.ToString() }); //处理同名文件 if (!exportableAssetsHash.Add((asset.TypeString + asset.Text).ToUpper())) { asset.Text += " #" + asset.uniqueID; } //处理非法文件名 asset.Text = FixFileName(asset.Text); assetsFile.exportableAssets.Add(asset); } ProgressBarPerformStep(); } if (displayOriginalName) { assetsFile.exportableAssets.ForEach(x => { var replacename = ab?.m_Container.Find(y => y.second.asset.m_PathID == x.m_PathID)?.first; if (!string.IsNullOrEmpty(replacename)) { var ex = Path.GetExtension(replacename); x.Text = !string.IsNullOrEmpty(ex) ? replacename.Replace(ex, "") : replacename; } }); } exportableAssets.AddRange(assetsFile.exportableAssets); } visibleAssets = exportableAssets; exportableAssetsHash.Clear(); } #endregion #region second loop - build tree structure fileNodes = new List <GameObject>(); if (buildHierarchyMenuItem) { SetProgressBarMaximum(1); SetProgressBarValue(1); SetProgressBarMaximum(assetsfileList.Sum(x => x.GameObjectList.Values.Count) + 1); foreach (var assetsFile in assetsfileList) { StatusStripUpdate("Building tree structure from " + Path.GetFileName(assetsFile.filePath)); GameObject fileNode = new GameObject(null); fileNode.Text = Path.GetFileName(assetsFile.filePath); fileNode.m_Name = "RootNode"; foreach (var m_GameObject in assetsFile.GameObjectList.Values) { //ParseGameObject foreach (var m_Component in m_GameObject.m_Components) { if (m_Component.m_FileID >= 0 && m_Component.m_FileID < assetsfileList.Count) { var sourceFile = assetsfileList[m_Component.m_FileID]; if (sourceFile.preloadTable.TryGetValue(m_Component.m_PathID, out var asset)) { switch (asset.Type) { case ClassIDReference.Transform: { m_GameObject.m_Transform = m_Component; break; } case ClassIDReference.MeshRenderer: { m_GameObject.m_MeshRenderer = m_Component; break; } case ClassIDReference.MeshFilter: { m_GameObject.m_MeshFilter = m_Component; break; } case ClassIDReference.SkinnedMeshRenderer: { m_GameObject.m_SkinnedMeshRenderer = m_Component; break; } } } } } // var parentNode = fileNode; if (assetsfileList.TryGetTransform(m_GameObject.m_Transform, out var m_Transform)) { if (assetsfileList.TryGetTransform(m_Transform.m_Father, out var m_Father)) { //GameObject Parent; if (assetsfileList.TryGetGameObject(m_Father.m_GameObject, out parentNode)) { //parentNode = Parent; } } } parentNode.Nodes.Add(m_GameObject); ProgressBarPerformStep(); } if (fileNode.Nodes.Count == 0) { fileNode.Text += " (no children)"; } fileNodes.Add(fileNode); } if (File.Exists(mainPath + "\\materials.json")) { string matLine; using (StreamReader reader = File.OpenText(mainPath + "\\materials.json")) { matLine = reader.ReadToEnd(); } jsonMats = new JavaScriptSerializer().Deserialize <Dictionary <string, Dictionary <string, string> > >(matLine); //var jsonMats = new JavaScriptSerializer().DeserializeObject(matLine); } } #endregion #region build list of class strucutres if (buildClassStructuresMenuItem) { //group class structures by versionv foreach (var assetsFile in assetsfileList) { if (AllClassStructures.TryGetValue(assetsFile.m_Version, out var curVer)) { foreach (var uClass in assetsFile.ClassStructures) { curVer[uClass.Key] = uClass.Value; } } else { AllClassStructures.Add(assetsFile.m_Version, assetsFile.ClassStructures); } } } #endregion }