public static void CreatePefabParts(GameObject go, ref int indenitity, List <PrefabPartInfo> prefabParts, int parentId = -1, int depth = 0)
        {
            Component[] components = go.GetComponents <Component>();
            foreach (Component component in components)
            {
                PrefabPartInfo componentPart = new PrefabPartInfo();
                componentPart.ParentPersistentID = parentId;
                componentPart.PersistentID       = indenitity;
                componentPart.Object             = component;
                componentPart.Depth = depth;
                indenitity++;
                prefabParts.Add(componentPart);
            }

            if (go.transform.childCount > 0)
            {
                foreach (Transform child in go.transform)
                {
                    PrefabPartInfo childPart = new PrefabPartInfo();
                    childPart.ParentPersistentID = parentId;
                    childPart.PersistentID       = indenitity;
                    childPart.Object             = child.gameObject;
                    childPart.Depth = depth;
                    indenitity++;
                    prefabParts.Add(childPart);
                    CreatePefabParts(child.gameObject, ref indenitity, prefabParts, childPart.PersistentID, depth + 1);
                }
            }
        }
Ejemplo n.º 2
0
        private void CreatePefabParts(AssetInfo assetInfo, GameObject go, int parentId = -1, int depth = 0)
        {
            Component[] components = go.GetComponents <Component>();
            foreach (Component component in components)
            {
                PrefabPartInfo componentPart = new PrefabPartInfo();
                componentPart.ParentPersistentID = parentId;
                componentPart.PersistentID       = m_asset.AssetLibrary.Identity;
                componentPart.Object             = component;
                componentPart.Depth = depth;
                m_asset.AssetLibrary.Identity++;
                assetInfo.PrefabParts.Add(componentPart);
            }

            if (go.transform.childCount > 0)
            {
                foreach (Transform child in go.transform)
                {
                    PrefabPartInfo childPart = new PrefabPartInfo();
                    childPart.ParentPersistentID = parentId;
                    childPart.PersistentID       = m_asset.AssetLibrary.Identity;
                    childPart.Object             = child.gameObject;
                    childPart.Depth = depth;
                    m_asset.AssetLibrary.Identity++;
                    assetInfo.PrefabParts.Add(childPart);

                    CreatePefabParts(assetInfo, child.gameObject, childPart.PersistentID, depth + 1);
                }
            }
        }
Ejemplo n.º 3
0
        private void MergeAssets(AssetFolderInfo from, ProjectItem to, int ordinal)
        {
            List <AssetInfo> fromAssets = from.Assets;

            if (fromAssets == null)
            {
                return;
            }

            if (to.Children == null)
            {
                to.Children = new List <ProjectItem>();
            }

            for (int i = 0; i < fromAssets.Count; ++i)
            {
                AssetInfo assetFrom = fromAssets[i];
                if (assetFrom.Object == null)
                {
                    continue;
                }
                AssetItem assetTo = to.Children.OfType <AssetItem>().Where(item => item.Name == assetFrom.name).FirstOrDefault();
                if (assetTo == null)
                {
                    assetTo = new AssetItem();
                    to.Children.Add(assetTo);
                }

                assetTo.Name     = assetFrom.name;
                assetTo.ItemID   = m_assetDB.ToExposedResourceID(ordinal, assetFrom.PersistentID);
                assetTo.Parent   = to;
                assetTo.TypeGuid = m_typeMap.ToGuid(assetFrom.Object.GetType());
                assetTo.Preview  = null; //must rebuild preview

                if (assetFrom.PrefabParts != null)
                {
                    assetTo.Parts = new PrefabPart[assetFrom.PrefabParts.Count];
                    for (int j = 0; j < assetFrom.PrefabParts.Count; ++j)
                    {
                        PrefabPartInfo prefabPart = assetFrom.PrefabParts[j];
                        Guid           typeGuid   = m_typeMap.ToGuid(prefabPart.Object.GetType());
                        if (prefabPart != null && prefabPart.Object != null && typeGuid != Guid.Empty)
                        {
                            assetTo.Parts[j] = new PrefabPart
                            {
                                Name     = prefabPart.Object.name,
                                ParentID = prefabPart.ParentPersistentID,
                                PartID   = prefabPart.PersistentID,
                                TypeGuid = typeGuid
                            };
                        }
                        else
                        {
                            assetTo.Parts[j] = null;
                        }
                    }
                }
            }
        }
Ejemplo n.º 4
0
        private void Sync(
            AssetLibraryInfo assetLibraryInfo,
            int parentPersistentID,
            int depth,
            GameObject go,
            Dictionary <UnityObject, PrefabPartInfo> objToParts,
            List <PrefabPartInfo> newPrefabs)
        {
            Component[] components = go.GetComponents <Component>();
            for (int i = 0; i < components.Length; ++i)
            {
                Component      component = components[i];
                PrefabPartInfo part;
                if (objToParts.TryGetValue(component, out part))
                {
                    newPrefabs.Add(part);
                }
                else
                {
                    part = new PrefabPartInfo
                    {
                        Depth              = depth,
                        Object             = component,
                        PersistentID       = assetLibraryInfo.Identity,
                        ParentPersistentID = parentPersistentID
                    };
                    assetLibraryInfo.Identity++;
                    newPrefabs.Add(part);
                }
            }

            foreach (Transform child in go.transform)
            {
                GameObject     childGo = child.gameObject;
                PrefabPartInfo part;
                if (objToParts.TryGetValue(childGo, out part))
                {
                    newPrefabs.Add(part);
                }
                else
                {
                    part = new PrefabPartInfo
                    {
                        Depth              = depth,
                        Object             = childGo,
                        PersistentID       = assetLibraryInfo.Identity,
                        ParentPersistentID = parentPersistentID
                    };
                    assetLibraryInfo.Identity++;
                    newPrefabs.Add(part);
                }

                Sync(assetLibraryInfo, part.PersistentID, depth + 1, childGo, objToParts, newPrefabs);
            }
        }
Ejemplo n.º 5
0
        private void LoadIDMappingTo(AssetInfo asset,
                                     MappingInfo mapping,
                                     List <int> instanceIDs,
                                     List <int> persistentIDs,
                                     bool IIDtoPID, bool PIDtoObj)
        {
            if (IIDtoPID)
            {
                int instanceID = asset.Object.GetInstanceID();

                //Following if statement required because object can be added to multiple libraries and
                //have multiple persistetnt identifiers. Only first persistent identifier is added to dictionary.
                //Any persistent id can be converted to "first" persistent id using following approach:
                //(PersistenID -> Obj) -> (InstanceID -> First PersistentID)
                if (!mapping.InstanceIDtoPID.ContainsKey(instanceID))
                {
                    mapping.Add(instanceID, m_offset + asset.PersistentID);
                    instanceIDs.Add(instanceID);
                }
            }

            if (PIDtoObj)
            {
                int persistentID = m_offset + asset.PersistentID;
                mapping.Add(persistentID, asset.Object);
                persistentIDs.Add(persistentID);
            }

            if (asset.PrefabParts != null)
            {
                for (int i = 0; i < asset.PrefabParts.Count; ++i)
                {
                    PrefabPartInfo prefabPart = asset.PrefabParts[i];
                    if (prefabPart != null && prefabPart.Object != null)
                    {
                        if (IIDtoPID)
                        {
                            int instanceID = prefabPart.Object.GetInstanceID();
                            if (!mapping.InstanceIDtoPID.ContainsKey(instanceID))
                            {
                                mapping.Add(instanceID, m_offset + prefabPart.PersistentID);
                                instanceIDs.Add(instanceID);
                            }
                        }

                        if (PIDtoObj)
                        {
                            int persistentID = m_offset + prefabPart.PersistentID;
                            mapping.Add(persistentID, prefabPart.Object);
                            persistentIDs.Add(persistentID);
                        }
                    }
                }
            }
        }
Ejemplo n.º 6
0
        private void CreateAsset(UnityObject obj, AssetInfo parentAssetInfo, int insertIndex = -1, AssetFolderInfo folder = null)
        {
            AssetInfo assetInfo = CreateAsset(obj.name, parentAssetInfo, insertIndex, folder);

            assetInfo.Object = obj;
            AddAssetToFolder(assetInfo, folder);
            if (obj is GameObject)
            {
                GameObject go = (GameObject)obj;
                assetInfo.PrefabParts = new List <PrefabPartInfo>();
                CreatePefabParts(assetInfo, go);

                if (folder != null)
                {
                    if (IsFolderSelected(folder))
                    {
                        if (assetInfo.PrefabParts != null)
                        {
                            Dictionary <int, AssetInfo> assets = new Dictionary <int, AssetInfo>();
                            assets.Add(-1, assetInfo);

                            for (int i = 0; i < assetInfo.PrefabParts.Count; ++i)
                            {
                                PrefabPartInfo prefabPart = assetInfo.PrefabParts[i];
                                string         name;
                                if (prefabPart.Object == null)
                                {
                                    name = "<Null>";
                                }
                                else
                                {
                                    if (prefabPart.Object is Component)
                                    {
                                        name = prefabPart.Object.GetType().Name;
                                    }
                                    else
                                    {
                                        name = prefabPart.Object.name;
                                    }
                                }

                                AssetInfo prefabPartAssetInfo = new AssetInfo(name, assetInfo.depth + prefabPart.Depth, prefabPart.PersistentID);
                                prefabPartAssetInfo.Object = prefabPart.Object;

                                assets.Add(prefabPartAssetInfo.id, prefabPartAssetInfo);

                                TreeElement parent = assets[prefabPart.ParentPersistentID];
                                TreeView.treeModel.AddElement(prefabPartAssetInfo, parent, parent.children != null ? parent.children.Count : 0);
                            }
                        }
                    }
                }
            }
        }
        public static void CreatePefabParts(GameObject go, ref int identity, Dictionary <UnityObject, int> objToId, List <PrefabPartInfo> prefabParts, int parentId = -1, int depth = 0)
        {
            Component[] components = go.GetComponents <Component>();
            foreach (Component component in components)
            {
                PrefabPartInfo componentPart = new PrefabPartInfo();
                componentPart.ParentPersistentID = parentId;
                if (objToId.ContainsKey(component))
                {
                    componentPart.PersistentID = objToId[component];
                }
                else
                {
                    componentPart.PersistentID = identity;
                    identity++;
                }

                componentPart.Object = component;
                componentPart.Depth  = depth;
                prefabParts.Add(componentPart);
            }

            if (go.transform.childCount > 0)
            {
                foreach (Transform child in go.transform)
                {
                    PrefabPartInfo childPart = new PrefabPartInfo();
                    childPart.ParentPersistentID = parentId;
                    if (objToId.ContainsKey(child.gameObject))
                    {
                        childPart.PersistentID = objToId[child.gameObject];
                    }
                    else
                    {
                        childPart.PersistentID = identity;
                        identity++;
                    }

                    childPart.Object = child.gameObject;
                    childPart.Depth  = depth;
                    prefabParts.Add(childPart);
                    CreatePefabParts(child.gameObject, ref identity, objToId, prefabParts, childPart.PersistentID, depth + 1);
                }
            }
        }
        private void CopyFolder(AssetFolderInfo sourceFolder, AssetFolderInfo targetFolder)
        {
            targetFolder.id    = sourceFolder.id;
            targetFolder.name  = sourceFolder.name;
            targetFolder.depth = sourceFolder.depth;

            if (sourceFolder.Assets != null)
            {
                targetFolder.Assets = new List <AssetInfo>();
                for (int i = 0; i < sourceFolder.Assets.Count; ++i)
                {
                    AssetInfo sourceAsset = sourceFolder.Assets[i];
                    if (sourceAsset.IsEnabled)
                    {
                        AssetInfo targetAsset = new AssetInfo();
                        targetAsset.depth = sourceAsset.depth;
                        targetAsset.id    = sourceAsset.id;
                        targetAsset.name  = sourceAsset.name;

                        targetAsset.IsEnabled = sourceAsset.IsEnabled;
                        targetAsset.Object    = sourceAsset.Object;

                        if (sourceAsset.PrefabParts != null)
                        {
                            targetAsset.PrefabParts = new List <PrefabPartInfo>();
                            for (int j = 0; j < sourceAsset.PrefabParts.Count; ++j)
                            {
                                PrefabPartInfo sourcePart = sourceAsset.PrefabParts[j];

                                PrefabPartInfo targetPart = new PrefabPartInfo();
                                targetPart.Depth              = sourcePart.Depth;
                                targetPart.Object             = sourcePart.Object;
                                targetPart.ParentPersistentID = sourcePart.ParentPersistentID;
                                targetPart.PersistentID       = sourcePart.PersistentID;
                                targetAsset.PrefabParts.Add(targetPart);
                            }
                        }

                        targetFolder.Assets.Add(targetAsset);
                    }
                }
            }
        }
Ejemplo n.º 9
0
        public bool IsSyncRequired()
        {
            if (Object == null)
            {
                return(false);
            }

            GameObject go = Object as GameObject;

            if (go == null)
            {
                return(false);
            }

            PrefabPartInfo rootPart = new PrefabPartInfo
            {
                Object             = go,
                Depth              = -1,
                ParentPersistentID = -1,
                PersistentID       = -1,
            };

            Dictionary <UnityObject, PrefabPartInfo> objToParts = PrefabParts != null?
                                                                  PrefabParts.Where(part => part.Object != null).ToDictionary(part => part.Object) :
                                                                      new Dictionary <UnityObject, PrefabPartInfo>();

            objToParts.Add(go, rootPart);

            Dictionary <int, PrefabPartInfo> idToParts = PrefabParts != null?
                                                         PrefabParts.Where(part => part.Object != null).ToDictionary(part => part.PersistentID) :
                                                             new Dictionary <int, PrefabPartInfo>();

            idToParts.Add(rootPart.PersistentID, rootPart);

            return(IsSyncRequired(go, objToParts, idToParts));
        }
        private IList <AssetInfo> GetData()
        {
            if (m_folders != null)
            {
                List <AssetInfo> result = new List <AssetInfo>();

                AssetInfo root = new AssetInfo
                {
                    id        = 0,
                    name      = "Root",
                    IsEnabled = false,
                    depth     = -1,
                };

                result.Add(root);
                foreach (AssetInfo assetInfo in m_folders.Where(folder => folder.Assets != null).SelectMany(folder => folder.Assets))
                {
                    assetInfo.parent = root;
                    result.Add(assetInfo);

                    if (assetInfo.PrefabParts != null)
                    {
                        Dictionary <int, AssetInfo> assets = new Dictionary <int, AssetInfo>();
                        assets.Add(-1, assetInfo);

                        for (int i = 0; i < assetInfo.PrefabParts.Count; ++i)
                        {
                            PrefabPartInfo prefabPart = assetInfo.PrefabParts[i];
                            string         name;
                            if (prefabPart.Object == null)
                            {
                                name = "<Null>";
                            }
                            else
                            {
                                if (prefabPart.Object is Component)
                                {
                                    name = prefabPart.Object.GetType().Name;
                                }
                                else
                                {
                                    name = prefabPart.Object.name;
                                }
                            }

                            AssetInfo prefabPartAssetInfo = new AssetInfo(name, assetInfo.depth + prefabPart.Depth + 1, prefabPart.PersistentID);
                            prefabPartAssetInfo.Object = prefabPart.Object;

                            assets.Add(prefabPartAssetInfo.id, prefabPartAssetInfo);

                            TreeElement parent = assets[prefabPart.ParentPersistentID];
                            prefabPartAssetInfo.parent = parent;

                            result.Add(prefabPartAssetInfo);
                        }
                    }
                }
                return(result);
            }

            return(new List <AssetInfo>
            {
                new AssetInfo
                {
                    id = 0,
                    name = "Root",
                    IsEnabled = false,
                    depth = -1,
                }
            });
        }
        private bool CreateAsset(UnityObject obj, AssetInfo parentAssetInfo, int insertIndex = -1, AssetFolderInfo folder = null)
        {
            if (obj is GameObject)
            {
                GameObject go = (GameObject)obj;

                int identity = m_asset.AssetLibrary.Identity + 1;
                List <PrefabPartInfo> prefabParts = new List <PrefabPartInfo>();
                CreatePefabParts(go, ref identity, prefabParts);
                if (identity >= AssetLibraryInfo.MAX_ASSETS)
                {
                    return(false);
                }

                AssetInfo assetInfo = CreateAsset(obj.name, parentAssetInfo, insertIndex, folder);
                assetInfo.Object = obj;
                AddAssetToFolder(assetInfo, folder);

                assetInfo.PrefabParts         = prefabParts;
                m_asset.AssetLibrary.Identity = identity;

                if (folder != null)
                {
                    if (IsFolderSelected(folder))
                    {
                        if (assetInfo.PrefabParts != null)
                        {
                            Dictionary <int, AssetInfo> assets = new Dictionary <int, AssetInfo>();
                            assets.Add(-1, assetInfo);

                            for (int i = 0; i < assetInfo.PrefabParts.Count; ++i)
                            {
                                PrefabPartInfo prefabPart = assetInfo.PrefabParts[i];
                                string         name;
                                if (prefabPart.Object == null)
                                {
                                    name = "<Null>";
                                }
                                else
                                {
                                    if (prefabPart.Object is Component)
                                    {
                                        name = prefabPart.Object.GetType().Name;
                                    }
                                    else
                                    {
                                        name = prefabPart.Object.name;
                                    }
                                }

                                AssetInfo prefabPartAssetInfo = new AssetInfo(name, assetInfo.depth + prefabPart.Depth, prefabPart.PersistentID);
                                prefabPartAssetInfo.Object = prefabPart.Object;

                                assets.Add(prefabPartAssetInfo.id, prefabPartAssetInfo);

                                TreeElement parent = assets[prefabPart.ParentPersistentID];
                                TreeView.treeModel.AddElement(prefabPartAssetInfo, parent, parent.children != null ? parent.children.Count : 0);
                            }
                        }
                    }
                }
            }
            else
            {
                AssetInfo assetInfo = CreateAsset(obj.name, parentAssetInfo, insertIndex, folder);
                assetInfo.Object = obj;
                AddAssetToFolder(assetInfo, folder);
            }
            return(true);
        }
Ejemplo n.º 12
0
        private void BuildTree(ProjectItem projectItem, AssetFolderInfo folder, int ordinal)
        {
            projectItem.Name = folder.name;

            if (folder.hasChildren)
            {
                projectItem.Children = new List <ProjectItem>();
                for (int i = 0; i < folder.children.Count; ++i)
                {
                    ProjectItem child = new ProjectItem();
                    projectItem.AddChild(child);
                    BuildTree(child, (AssetFolderInfo)folder.children[i], ordinal);
                }
            }

            if (folder.Assets != null && folder.Assets.Count > 0)
            {
                if (projectItem.Children == null)
                {
                    projectItem.Children = new List <ProjectItem>();
                }

                List <string> existingNames = new List <string>();
                for (int i = 0; i < folder.Assets.Count; ++i)
                {
                    AssetInfo assetInfo = folder.Assets[i];
                    if (assetInfo.Object != null)
                    {
                        string ext = GetExt(assetInfo.Object);

                        ImportItem importItem = new ImportItem
                        {
                            Name     = PathHelper.GetUniqueName(assetInfo.name, ext, existingNames),
                            Ext      = ext,
                            Object   = assetInfo.Object,
                            TypeGuid = m_typeMap.ToGuid(assetInfo.Object.GetType()),
                            ItemID   = m_assetDB.ToStaticResourceID(ordinal, assetInfo.PersistentID)
                        };

                        if (assetInfo.PrefabParts != null)
                        {
                            List <PrefabPart> parts = new List <PrefabPart>();
                            for (int j = 0; j < assetInfo.PrefabParts.Count; ++j)
                            {
                                PrefabPartInfo partInfo = assetInfo.PrefabParts[j];
                                if (partInfo.Object != null)
                                {
                                    PrefabPart part = new PrefabPart
                                    {
                                        Name     = partInfo.Object.name,
                                        PartID   = m_assetDB.ToStaticResourceID(ordinal, partInfo.PersistentID),
                                        ParentID = m_assetDB.ToStaticResourceID(ordinal, partInfo.PersistentID),
                                        TypeGuid = m_typeMap.ToGuid(partInfo.Object.GetType()),
                                    };

                                    parts.Add(part);
                                }
                            }
                            importItem.Parts = parts.ToArray();
                        }

                        projectItem.AddChild(importItem);
                        existingNames.Add(importItem.NameExt);
                    }
                }
            }
        }