コード例 #1
0
        ViewNode AddViewNode(ABInspectorItemData data, int depth, int breadth, int totalBreadth)
        {
            string path = AssetDatabase.GUIDToAssetPath(data.GUID);
            string name = Path.GetFileNameWithoutExtension(path);

            Debug.LogFormat("depth:{0}, breadth:{1} node:{2}", depth, breadth, data.GUID);

            ViewNode viewNode = new ViewNode(name, data.GUID);

            viewNode.Icon = AssetDatabase.GetCachedIcon(path) as Texture2D;

            int halfBreadth = totalBreadth / 2;

            Vector2 position;

            if (totalBreadth % 2 == 0)
            {
                int index = (breadth - halfBreadth);
                index    = index >= 0 ? index + 1 : index;
                position = new Vector2(depth * (NodeSize.x + NodeOffest.x), index * (NodeSize.y + NodeOffest.y));
            }
            else
            {
                position = new Vector2(depth * (NodeSize.x + NodeOffest.x), (breadth - halfBreadth) * (NodeSize.y + NodeOffest.y));
            }

            viewNode.Rect = new Rect(position, NodeSize);

            nodes.Add(viewNode);
            return(viewNode);
        }
コード例 #2
0
 public void ShowSelectNodeOrganization(ABInspectorItemData node)
 {
     if (node != null)
     {
         root.children.Clear();
         CreatTreeView(root, node, 0);
     }
 }
コード例 #3
0
        public void SelectNode(string GUID)
        {
            ABInspectorItemData node = dataManager.GetItemDataByGUID(GUID);

            if (node != null)
            {
                SelectNode(dataManager.GetItemDataByGUID(GUID));
            }
        }
コード例 #4
0
        public ABInspectorItemData GetItemDataByGUID(string guid)
        {
            ABInspectorItemData result = null;

            if (dataMap.TryGetValue(guid, out result))
            {
                return(result);
            }
            return(null);
        }
コード例 #5
0
        public void SelectNode(ABInspectorItemData selectData)
        {
            if (selectData == null)
            {
                return;
            }

            if (nodes != null)
            {
                nodes.Clear();
            }
            if (links != null)
            {
                links.Clear();
            }
            //向下处理选中的节点
            HandleChildNode(selectData);
            //处理父节点
            HandleParentNode(selectData);


            float minX = float.MaxValue;
            float minY = float.MaxValue;

            //float maxX = float.MinValue;
            //float maxY = float.MinValue;
            foreach (var item in nodes)
            {
                if (item.Rect.xMin < minX)
                {
                    minX = item.Rect.xMin;
                }
                if (item.Rect.yMin < minY)
                {
                    minY = item.Rect.yMin;
                }

                //if (item.Rect.xMax > maxX) maxX = item.Rect.xMax;
                //if (item.Rect.yMax < maxY) maxY = item.Rect.yMax;
            }

            Vector2 offset = Vector2.zero;

            offset.x = minX < 0 ? Mathf.Abs(minX) : 0;
            offset.y = minY < 0 ? Mathf.Abs(minY) : 0;

            foreach (var item in nodes)
            {
                item.Rect = new Rect(item.Rect.position + offset, item.Rect.size);
            }
        }
コード例 #6
0
        private void HandleParentNode(ABInspectorItemData node)
        {
            if (node.ReverseDependency != null)
            {
                //记录当前深度
                int depth = -1;
                //记录当前的广度
                int breadth = 0;

                Queue <ViewNode> parentQueue = new Queue <ViewNode>();

                //记录下一层的节点总数
                int childCount = node.ReverseDependency.Count;
                ABInspectorItemData current  = null;
                ViewNode            viewNode = null;

                foreach (var guid in node.ReverseDependency)
                {
                    handleQueque.Enqueue(GetItemByGUID(guid));
                    parentQueue.Enqueue(nodes[0]);
                }

                while (handleQueque.Count != 0)
                {
                    current  = handleQueque.Dequeue();
                    viewNode = AddViewNode(current, depth, breadth, childCount);
                    if (parentQueue.Count > 0)
                    {
                        var link = new Link(viewNode, parentQueue.Dequeue());
                        links.Add(link);
                    }
                    breadth++;
                    foreach (var guid in current.ReverseDependency)
                    {
                        handleQueque.Enqueue(GetItemByGUID(guid));
                        parentQueue.Enqueue(viewNode);
                    }

                    if (breadth == childCount)
                    {
                        //一层绘制完毕,此时队列里都是下一层节点
                        depth--;
                        breadth    = 0;
                        childCount = handleQueque.Count;
                    }
                }
            }
        }
コード例 #7
0
        private void GetNodeDependency(string path, string nodeGUID)
        {
            ABInspectorItemData currentNode = null;
            ABInspectorItemData result      = null;
            string dpdcGUID = string.Empty;

            string[] depsPathAry;
            //获取节点
            if (dataMap.TryGetValue(nodeGUID, out currentNode) == false)
            {
                currentNode = CreateDataNode(nodeGUID, path);
                m_dataCollection.items.Add(currentNode);
                dataMap[nodeGUID] = currentNode;
            }
            //获取直接依赖项
            depsPathAry = AssetDatabase.GetDependencies(path, false);
            foreach (var dpdcPath in depsPathAry)
            {
                dpdcGUID = Path2GUID(dpdcPath);
                //去掉自身引用
                if (dpdcGUID == nodeGUID)
                {
                    continue;
                }

                if (dataMap.TryGetValue(dpdcGUID, out result) == false)
                {
                    result = CreateDataNode(dpdcGUID, dpdcPath);
                    m_dataCollection.items.Add(result);
                    dataMap[dpdcGUID] = result;
                }

                //记录正向直接引用
                if (currentNode.Dependency.Contains(dpdcGUID) == false)
                {
                    currentNode.Dependency.Add(dpdcGUID);
                }

                //记录反向直接引用
                if (result.ReverseDependency.Contains(nodeGUID) == false)
                {
                    result.ReverseDependency.Add(nodeGUID);
                }
            }
        }
コード例 #8
0
        private void HandleChildNode(ABInspectorItemData node)
        {
            if (node.Dependency != null)
            {
                //记录当前深度
                int depth = 0;
                //记录当前的广度
                int breadth = 0;
                //记录下一层的节点总数
                int childCount = 0;
                Queue <ViewNode> parentQueue = new Queue <ViewNode>();
                handleQueque.Enqueue(node);
                ABInspectorItemData current  = null;
                ViewNode            viewNode = null;
                childCount = handleQueque.Count;
                while (handleQueque.Count != 0)
                {
                    current = handleQueque.Dequeue();
                    //用depth,breadth和当前层节点数量绘制当前节点
                    viewNode = AddViewNode(current, depth, breadth, childCount);
                    if (parentQueue.Count > 0)
                    {
                        var link = new Link(parentQueue.Dequeue(), viewNode);
                        links.Add(link);
                    }
                    breadth++;

                    foreach (var guid in current.Dependency)
                    {
                        handleQueque.Enqueue(GetItemByGUID(guid));
                        parentQueue.Enqueue(viewNode);
                    }

                    if (breadth == childCount)
                    {
                        //一层绘制完毕,此时队列里都是下一层节点
                        depth++;
                        breadth    = 0;
                        childCount = handleQueque.Count;
                    }
                }
            }
        }
コード例 #9
0
        private void CreatTreeView(OrganizationTreeViewItem parent, ABInspectorItemData node, int depth)
        {
            string path = AssetDatabase.GUIDToAssetPath(node.GUID);
            string name = Path.GetFileName(path);

            OrganizationTreeViewItem nodeItem = new OrganizationTreeViewItem(node.GUID.GetHashCode(), depth, name);

            nodeItem.children = new List <TreeViewItem>();
            //只显示类型名,忽略其他信息
            string TypeName = AssetDatabase.GetMainAssetTypeAtPath(path).ToString();

            nodeItem.Type = TypeName.Substring(TypeName.LastIndexOf(".") + 1);

            nodeItem.Count = node.Dependency.Count;
            nodeItem.icon  = AssetDatabase.GetCachedIcon(path) as Texture2D;

            parent.AddChild(nodeItem);
            foreach (var dpcGUID in node.Dependency)
            {
                ABInspectorItemData dpcNode = GetABInspectorItemDataByGUID(dpcGUID);
                CreatTreeView(nodeItem, dpcNode, depth + 1);
            }
        }
コード例 #10
0
        private bool CheckFileSystem()
        {
            var    guids = AssetDatabase.FindAssets("", new string[] { "Assets" });
            string path  = string.Empty;
            int    index = 0;

            List <string> currentFiles = new List <string>();
            List <string> storedFiles  = new List <string>(dataMap.Keys);

            foreach (var nodeGUID in guids)
            {
                path = GUID2Path(nodeGUID);
                if (path.Contains(".") == false)
                {
                    continue;
                }
                if (path.Contains(".manifest") == true)
                {
                    continue;
                }
                if (path.Contains("/Editor/"))
                {
                    continue;
                }
                EditorUtility.DisplayProgressBar("Check File", path, (index++ *1f) / (guids.Length * 1f));
                currentFiles.Add(nodeGUID);
            }
            IEnumerable <string> subFiles  = storedFiles.Except(currentFiles);
            IEnumerable <string> addFiles  = currentFiles.Except(storedFiles);
            ABInspectorItemData  itemNode  = null;
            ABInspectorItemData  childItem = null;

            index = 0;
            int Total = subFiles.Count();

            foreach (var subItem in subFiles)
            {
                EditorUtility.DisplayProgressBar("Remove Item", path, (index++ *1f) / (Total * 1f));
                if (dataMap.TryGetValue(subItem, out itemNode))
                {
                    //删除正向引用
                    foreach (var dpyGUID in itemNode.Dependency)
                    {
                        if (dataMap.TryGetValue(dpyGUID, out childItem))
                        {
                            childItem.ReverseDependency.Remove(subItem);
                        }
                    }
                    //删除逆向引用
                    foreach (var dpyGUID in itemNode.ReverseDependency)
                    {
                        if (dataMap.TryGetValue(dpyGUID, out childItem))
                        {
                            childItem.Dependency.Remove(subItem);
                        }
                    }
                }
                dataMap.Remove(subItem);
                m_dataCollection.items.Remove(itemNode);
            }

            index = 0;
            Total = addFiles.Count();
            foreach (var addItem in addFiles)
            {
                EditorUtility.DisplayProgressBar("Remove Item", path, (index++ *1f) / (Total * 1f));
                path = GUID2Path(addItem);
                GetNodeDependency(path, addItem);
            }
            EditorUtility.ClearProgressBar();

            bool needSave = subFiles.Any() || addFiles.Any();

            return(needSave);
        }