Exemplo n.º 1
0
 private static void CollectNode(GameObjectTreeNode node, List <GameObject> gameObjects)
 {
     gameObjects.Add(node.gameObject);
     foreach (GameObjectTreeNode i in node.Nodes)
     {
         CollectNode(i, gameObjects);
     }
 }
Exemplo n.º 2
0
        public static (string, List <TreeNode>) BuildAssetData()
        {
            StatusStripUpdate("Building asset list...");

            string productName        = null;
            var    objectCount        = assetsManager.assetsFileList.Sum(x => x.Objects.Count);
            var    objectAssetItemDic = new Dictionary <Object, AssetItem>(objectCount);
            var    containers         = new List <(PPtr <Object>, string)>();
            int    i = 0;

            Progress.Reset();
            foreach (var assetsFile in assetsManager.assetsFileList)
            {
                foreach (var asset in assetsFile.Objects)
                {
                    var assetItem = new AssetItem(asset);
                    objectAssetItemDic.Add(asset, assetItem);
                    assetItem.UniqueID = " #" + i;
                    var exportable = false;
                    switch (asset)
                    {
                    case GameObject m_GameObject:
                        assetItem.Text = m_GameObject.m_Name;
                        break;

                    case Texture2D m_Texture2D:
                        if (!string.IsNullOrEmpty(m_Texture2D.m_StreamData?.path))
                        {
                            assetItem.FullSize = asset.byteSize + m_Texture2D.m_StreamData.size;
                        }
                        assetItem.Text = m_Texture2D.m_Name;
                        exportable     = true;
                        break;

                    case AudioClip m_AudioClip:
                        if (!string.IsNullOrEmpty(m_AudioClip.m_Source))
                        {
                            assetItem.FullSize = asset.byteSize + m_AudioClip.m_Size;
                        }
                        assetItem.Text = m_AudioClip.m_Name;
                        exportable     = true;
                        break;

                    case VideoClip m_VideoClip:
                        if (!string.IsNullOrEmpty(m_VideoClip.m_OriginalPath))
                        {
                            assetItem.FullSize = asset.byteSize + (long)m_VideoClip.m_ExternalResources.m_Size;
                        }
                        assetItem.Text = m_VideoClip.m_Name;
                        exportable     = true;
                        break;

                    case Shader m_Shader:
                        assetItem.Text = m_Shader.m_ParsedForm?.m_Name ?? m_Shader.m_Name;
                        exportable     = true;
                        break;

                    case Mesh _:
                    case TextAsset _:
                    case AnimationClip _:
                    case Font _:
                    case MovieTexture _:
                    case Sprite _:
                        assetItem.Text = ((NamedObject)asset).m_Name;
                        exportable     = true;
                        break;

                    case Animator m_Animator:
                        if (m_Animator.m_GameObject.TryGet(out var gameObject))
                        {
                            assetItem.Text = gameObject.m_Name;
                        }
                        exportable = true;
                        break;

                    case MonoBehaviour m_MonoBehaviour:
                        if (m_MonoBehaviour.m_Name == "" && m_MonoBehaviour.m_Script.TryGet(out var m_Script))
                        {
                            assetItem.Text = m_Script.m_ClassName;
                        }
                        else
                        {
                            assetItem.Text = m_MonoBehaviour.m_Name;
                        }
                        exportable = true;
                        break;

                    case PlayerSettings m_PlayerSettings:
                        productName = m_PlayerSettings.productName;
                        break;

                    case AssetBundle m_AssetBundle:
                        foreach (var m_Container in m_AssetBundle.m_Container)
                        {
                            var preloadIndex = m_Container.Value.preloadIndex;
                            var preloadSize  = m_Container.Value.preloadSize;
                            var preloadEnd   = preloadIndex + preloadSize;
                            for (int k = preloadIndex; k < preloadEnd; k++)
                            {
                                containers.Add((m_AssetBundle.m_PreloadTable[k], m_Container.Key));
                            }
                        }
                        assetItem.Text = m_AssetBundle.m_Name;
                        break;

                    case ResourceManager m_ResourceManager:
                        foreach (var m_Container in m_ResourceManager.m_Container)
                        {
                            containers.Add((m_Container.Value, m_Container.Key));
                        }
                        break;

                    case NamedObject m_NamedObject:
                        assetItem.Text = m_NamedObject.m_Name;
                        break;
                    }
                    if (assetItem.Text == "")
                    {
                        assetItem.Text = assetItem.TypeString + assetItem.UniqueID;
                    }
                    if (Properties.Settings.Default.displayAll || exportable)
                    {
                        exportableAssets.Add(assetItem);
                    }
                    Progress.Report(++i, objectCount);
                }
            }
            foreach ((var pptr, var container) in containers)
            {
                if (pptr.TryGet(out var obj))
                {
                    objectAssetItemDic[obj].Container = container;
                }
            }
            foreach (var tmp in exportableAssets)
            {
                tmp.SetSubItems();
            }
            containers.Clear();

            visibleAssets = exportableAssets;

            StatusStripUpdate("Building tree structure...");

            var treeNodeCollection = new List <TreeNode>();
            var treeNodeDictionary = new Dictionary <GameObject, GameObjectTreeNode>();
            var assetsFileCount    = assetsManager.assetsFileList.Count;
            int j = 0;

            Progress.Reset();
            foreach (var assetsFile in assetsManager.assetsFileList)
            {
                var fileNode = new GameObjectTreeNode(assetsFile.fileName); //RootNode

                foreach (var obj in assetsFile.Objects)
                {
                    if (obj is GameObject m_GameObject)
                    {
                        if (!treeNodeDictionary.TryGetValue(m_GameObject, out var currentNode))
                        {
                            currentNode = new GameObjectTreeNode(m_GameObject);
                            treeNodeDictionary.Add(m_GameObject, currentNode);
                        }

                        foreach (var pptr in m_GameObject.m_Components)
                        {
                            if (pptr.TryGet(out var m_Component))
                            {
                                objectAssetItemDic[m_Component].TreeNode = currentNode;
                                if (m_Component is MeshFilter m_MeshFilter)
                                {
                                    if (m_MeshFilter.m_Mesh.TryGet(out var m_Mesh))
                                    {
                                        objectAssetItemDic[m_Mesh].TreeNode = currentNode;
                                    }
                                }
                                else if (m_Component is SkinnedMeshRenderer m_SkinnedMeshRenderer)
                                {
                                    if (m_SkinnedMeshRenderer.m_Mesh.TryGet(out var m_Mesh))
                                    {
                                        objectAssetItemDic[m_Mesh].TreeNode = currentNode;
                                    }
                                }
                            }
                        }

                        var parentNode = fileNode;

                        if (m_GameObject.m_Transform != null)
                        {
                            if (m_GameObject.m_Transform.m_Father.TryGet(out var m_Father))
                            {
                                if (m_Father.m_GameObject.TryGet(out var parentGameObject))
                                {
                                    if (!treeNodeDictionary.TryGetValue(parentGameObject, out parentNode))
                                    {
                                        parentNode = new GameObjectTreeNode(parentGameObject);
                                        treeNodeDictionary.Add(parentGameObject, parentNode);
                                    }
                                }
                            }
                        }

                        parentNode.Nodes.Add(currentNode);
                    }
                }

                if (fileNode.Nodes.Count > 0)
                {
                    treeNodeCollection.Add(fileNode);
                }

                Progress.Report(++j, assetsFileCount);
            }
            treeNodeDictionary.Clear();

            objectAssetItemDic.Clear();

            return(productName, treeNodeCollection);
        }
Exemplo n.º 3
0
        public static Tuple <string, List <TreeNode> > BuildAssetData()
        {
            StatusStripUpdate("Building asset list...");

            string productName        = null;
            var    assetsNameHash     = new HashSet <string>(StringComparer.OrdinalIgnoreCase);
            var    objectCount        = assetsManager.assetsFileList.Sum(x => x.Objects.Count);
            var    objectAssetItemDic = new Dictionary <Object, AssetItem>(objectCount);
            int    i = 0;

            Progress.Reset();
            foreach (var assetsFile in assetsManager.assetsFileList)
            {
                var         tempExportableAssets = new List <AssetItem>();
                AssetBundle ab = null;
                foreach (var asset in assetsFile.Objects.Values)
                {
                    var assetItem = new AssetItem(asset);
                    objectAssetItemDic.Add(asset, assetItem);
                    assetItem.UniqueID = " #" + i;
                    var exportable = false;
                    switch (asset)
                    {
                    case GameObject m_GameObject:
                        assetItem.Text = m_GameObject.m_Name;
                        break;

                    case Texture2D m_Texture2D:
                        if (!string.IsNullOrEmpty(m_Texture2D.m_StreamData?.path))
                        {
                            assetItem.FullSize = asset.byteSize + m_Texture2D.m_StreamData.size;
                        }
                        assetItem.Text = m_Texture2D.m_Name;
                        exportable     = true;
                        break;

                    case AudioClip m_AudioClip:
                        if (!string.IsNullOrEmpty(m_AudioClip.m_Source))
                        {
                            assetItem.FullSize = asset.byteSize + m_AudioClip.m_Size;
                        }
                        assetItem.Text = m_AudioClip.m_Name;
                        exportable     = true;
                        break;

                    case VideoClip m_VideoClip:
                        if (!string.IsNullOrEmpty(m_VideoClip.m_OriginalPath))
                        {
                            assetItem.FullSize = asset.byteSize + (long)m_VideoClip.m_Size;
                        }
                        assetItem.Text = m_VideoClip.m_Name;
                        exportable     = true;
                        break;

                    case Shader m_Shader:
                        assetItem.Text = m_Shader.m_ParsedForm?.m_Name ?? m_Shader.m_Name;
                        exportable     = true;
                        break;

                    case Mesh _:
                    case TextAsset _:
                    case AnimationClip _:
                    case Font _:
                    case MovieTexture _:
                    case Sprite _:
                        assetItem.Text = ((NamedObject)asset).m_Name;
                        exportable     = true;
                        break;

                    case Animator m_Animator:
                        if (m_Animator.m_GameObject.TryGet(out var gameObject))
                        {
                            assetItem.Text = gameObject.m_Name;
                        }
                        exportable = true;
                        break;

                    case MonoBehaviour m_MonoBehaviour:
                        if (m_MonoBehaviour.m_Name == "" && m_MonoBehaviour.m_Script.TryGet(out var m_Script))
                        {
                            assetItem.Text = m_Script.m_ClassName;
                        }
                        else
                        {
                            assetItem.Text = m_MonoBehaviour.m_Name;
                        }
                        exportable = true;
                        break;

                    case PlayerSettings m_PlayerSettings:
                        productName = m_PlayerSettings.productName;
                        break;

                    case AssetBundle m_AssetBundle:
                        ab             = m_AssetBundle;
                        assetItem.Text = ab.m_Name;
                        break;

                    case NamedObject m_NamedObject:
                        assetItem.Text = m_NamedObject.m_Name;
                        break;
                    }
                    if (assetItem.Text == "")
                    {
                        assetItem.Text = assetItem.TypeString + assetItem.UniqueID;
                    }
                    //处理同名文件
                    if (!assetsNameHash.Add(assetItem.TypeString + assetItem.Text))
                    {
                        assetItem.Text += assetItem.UniqueID;
                    }
                    //处理非法文件名
                    assetItem.Text = FixFileName(assetItem.Text);
                    if (Properties.Settings.Default.displayAll || exportable)
                    {
                        tempExportableAssets.Add(assetItem);
                    }
                    Progress.Report(++i, objectCount);
                }
                foreach (var item in tempExportableAssets)
                {
                    if (ab != null)
                    {
                        var container = ab.m_Container.FirstOrDefault(y => y.Value.asset.m_PathID == item.Asset.m_PathID).Key;
                        if (!string.IsNullOrEmpty(container))
                        {
                            item.Container = container;
                        }
                    }
                    item.SetSubItems();
                }
                exportableAssets.AddRange(tempExportableAssets);
                tempExportableAssets.Clear();
            }
            visibleAssets = exportableAssets;
            assetsNameHash.Clear();

            StatusStripUpdate("Building tree structure...");

            var treeNodeCollection = new List <TreeNode>();
            var treeNodeDictionary = new Dictionary <GameObject, GameObjectTreeNode>();
            var assetsFileCount    = assetsManager.assetsFileList.Count;
            int j = 0;

            Progress.Reset();
            foreach (var assetsFile in assetsManager.assetsFileList)
            {
                var fileNode = new GameObjectTreeNode(assetsFile.fileName); //RootNode

                foreach (var obj in assetsFile.Objects.Values)
                {
                    if (obj is GameObject m_GameObject)
                    {
                        if (!treeNodeDictionary.TryGetValue(m_GameObject, out var currentNode))
                        {
                            currentNode = new GameObjectTreeNode(m_GameObject);
                            treeNodeDictionary.Add(m_GameObject, currentNode);
                        }

                        foreach (var pptr in m_GameObject.m_Components)
                        {
                            if (pptr.TryGet(out var m_Component))
                            {
                                objectAssetItemDic[m_Component].TreeNode = currentNode;
                                if (m_Component is MeshFilter m_MeshFilter)
                                {
                                    if (m_MeshFilter.m_Mesh.TryGet(out var m_Mesh))
                                    {
                                        objectAssetItemDic[m_Mesh].TreeNode = currentNode;
                                    }
                                }
                                else if (m_Component is SkinnedMeshRenderer m_SkinnedMeshRenderer)
                                {
                                    if (m_SkinnedMeshRenderer.m_Mesh.TryGet(out var m_Mesh))
                                    {
                                        objectAssetItemDic[m_Mesh].TreeNode = currentNode;
                                    }
                                }
                            }
                        }

                        var parentNode = fileNode;

                        if (m_GameObject.m_Transform != null)
                        {
                            if (m_GameObject.m_Transform.m_Father.TryGet(out var m_Father))
                            {
                                if (m_Father.m_GameObject.TryGet(out var parentGameObject))
                                {
                                    if (!treeNodeDictionary.TryGetValue(parentGameObject, out parentNode))
                                    {
                                        parentNode = new GameObjectTreeNode(parentGameObject);
                                        treeNodeDictionary.Add(parentGameObject, parentNode);
                                    }
                                }
                            }
                        }

                        parentNode.Nodes.Add(currentNode);
                    }
                }

                if (fileNode.Nodes.Count > 0)
                {
                    treeNodeCollection.Add(fileNode);
                }

                Progress.Report(++j, assetsFileCount);
            }
            treeNodeDictionary.Clear();

            objectAssetItemDic.Clear();

            return(new Tuple <string, List <TreeNode> >(productName, treeNodeCollection));
        }
Exemplo n.º 4
0
        public static List <TreeNode> BuildTreeStructure(Dictionary <Object, AssetItem> tempDic)
        {
            StatusStripUpdate("Building tree structure...");

            var treeNodeCollection = new List <TreeNode>();
            var treeNodeDictionary = new Dictionary <GameObject, GameObjectTreeNode>();
            var progressCount      = assetsManager.assetsFileList.Count;
            int i = 0;

            Progress.Reset();
            foreach (var assetsFile in assetsManager.assetsFileList)
            {
                var fileNode = new GameObjectTreeNode(assetsFile.fileName); //RootNode

                foreach (var obj in assetsFile.Objects.Values)
                {
                    if (obj is GameObject m_GameObject)
                    {
                        if (!treeNodeDictionary.TryGetValue(m_GameObject, out var currentNode))
                        {
                            currentNode = new GameObjectTreeNode(m_GameObject);
                            treeNodeDictionary.Add(m_GameObject, currentNode);
                        }

                        if (m_GameObject.m_MeshFilter != null)
                        {
                            if (m_GameObject.m_MeshFilter.m_Mesh.TryGet(out var m_Mesh))
                            {
                                var item = tempDic[m_Mesh];
                                item.TreeNode = currentNode;
                            }
                            tempDic[m_GameObject.m_MeshFilter].TreeNode = currentNode;
                        }

                        if (m_GameObject.m_SkinnedMeshRenderer != null)
                        {
                            if (m_GameObject.m_SkinnedMeshRenderer.m_Mesh.TryGet(out var m_Mesh))
                            {
                                var item = tempDic[m_Mesh];
                                item.TreeNode = currentNode;
                            }
                            tempDic[m_GameObject.m_SkinnedMeshRenderer].TreeNode = currentNode;
                        }

                        var parentNode = fileNode;

                        if (m_GameObject.m_Transform != null)
                        {
                            if (m_GameObject.m_Transform.m_Father.TryGet(out var m_Father))
                            {
                                if (m_Father.m_GameObject.TryGet(out var parentGameObject))
                                {
                                    if (!treeNodeDictionary.TryGetValue(parentGameObject, out parentNode))
                                    {
                                        parentNode = new GameObjectTreeNode(parentGameObject);
                                        treeNodeDictionary.Add(parentGameObject, parentNode);
                                    }
                                }
                            }
                        }

                        parentNode.Nodes.Add(currentNode);
                    }
                }

                if (fileNode.Nodes.Count > 0)
                {
                    treeNodeCollection.Add(fileNode);
                }

                Progress.Report(++i, progressCount);
            }

            treeNodeDictionary.Clear();

            return(treeNodeCollection);
        }
Exemplo n.º 5
0
        public static List <GameObjectTreeNode> BuildTreeStructure(Dictionary <ObjectReader, AssetItem> tempDic)
        {
            var treeNodeCollection = new List <GameObjectTreeNode>();
            var gameObjectCount    = assetsManager.assetsFileList.Sum(x => x.GameObjects.Count);

            if (gameObjectCount > 0)
            {
                Logger.Info("Building tree structure...");
                int i = 0;
                Progress.Reset();
                foreach (var assetsFile in assetsManager.assetsFileList)
                {
                    var fileNode = new GameObjectTreeNode(assetsFile.fileName); //RootNode

                    foreach (var m_GameObject in assetsFile.GameObjects.Values)
                    {
                        foreach (var m_Component in m_GameObject.m_Components)
                        {
                            if (m_Component.TryGet(out var asset))
                            {
                                switch (asset.type)
                                {
                                case ClassIDType.Transform:
                                {
                                    m_GameObject.m_Transform = m_Component;
                                    break;
                                }

                                case ClassIDType.MeshRenderer:
                                {
                                    m_GameObject.m_MeshRenderer = m_Component;
                                    break;
                                }

                                case ClassIDType.MeshFilter:
                                {
                                    m_GameObject.m_MeshFilter = m_Component;
                                    if (m_Component.TryGet(out var objectReader))
                                    {
                                        var m_MeshFilter = new MeshFilter(objectReader);
                                        if (m_MeshFilter.m_Mesh.TryGet(out objectReader))
                                        {
                                            var item = tempDic[objectReader];
                                            item.gameObject = m_GameObject;
                                        }
                                    }
                                    break;
                                }

                                case ClassIDType.SkinnedMeshRenderer:
                                {
                                    m_GameObject.m_SkinnedMeshRenderer = m_Component;
                                    if (m_Component.TryGet(out var objectReader))
                                    {
                                        var m_SkinnedMeshRenderer = new SkinnedMeshRenderer(objectReader);
                                        if (m_SkinnedMeshRenderer.m_Mesh.TryGet(out objectReader))
                                        {
                                            var item = tempDic[objectReader];
                                            item.gameObject = m_GameObject;
                                        }
                                    }
                                    break;
                                }

                                case ClassIDType.Animator:
                                {
                                    m_GameObject.m_Animator = m_Component;
                                    var item = tempDic[asset];
                                    item.Text = tempDic[m_GameObject.reader].Text;
                                    break;
                                }
                                }
                            }
                        }

                        var parentNode = fileNode;

                        if (m_GameObject.m_Transform != null && m_GameObject.m_Transform.TryGetTransform(out var m_Transform))
                        {
                            if (m_Transform.m_Father.TryGetTransform(out var m_Father))
                            {
                                if (m_Father.m_GameObject.TryGetGameObject(out var parentGameObject))
                                {
                                    if (!treeNodeDictionary.TryGetValue(parentGameObject, out parentNode))
                                    {
                                        parentNode = new GameObjectTreeNode(parentGameObject);
                                        treeNodeDictionary.Add(parentGameObject, parentNode);
                                    }
                                }
                            }
                        }

                        if (!treeNodeDictionary.TryGetValue(m_GameObject, out var currentNode))
                        {
                            currentNode = new GameObjectTreeNode(m_GameObject);
                            treeNodeDictionary.Add(m_GameObject, currentNode);
                        }
                        parentNode.Nodes.Add(currentNode);

                        Progress.Report(++i, gameObjectCount);
                    }

                    if (fileNode.Nodes.Count > 0)
                    {
                        treeNodeCollection.Add(fileNode);
                    }
                }
            }

            return(treeNodeCollection);
        }